AGENTS.md documents 'Test unit: go test ./pkg/...' and 'E2E tests: go test -tags e2e ./pkg/e2e/'. Both statements were false: no file in pkg/e2e carried an e2e build constraint, so the -tags flag was a no-op and the 'unit' command actually launched the full e2e suite — requiring a Docker daemon and the locally built binary, creating and destroying containers, for up to 20 minutes. CI only avoided this by grepping e2e out of the package list (Dockerfile). Every *_test.go in pkg/e2e now carries //go:build e2e (merged with the existing !windows constraints), and the Makefile e2e targets pass the tag. The documented commands become true: - go test ./pkg/... -> pkg/e2e reports [no test files] - go test -tags e2e ./pkg/e2e -> runs the suite AGENTS.md now also states the daemon/binary prerequisites explicitly. Part of #14074 (A: the code misdescribes its own structure). Signed-off-by: Nicolas De Loof <nicolas.deloof@gmail.com>
2.7 KiB
Project: Docker Compose
Build & Test
- Build:
make build - Test all:
make test - Test unit:
go test ./pkg/...— needs no Docker daemon; the e2e suite is gated behind thee2ebuild tag and is not picked up - Test single:
go test ./pkg/compose/ -run TestFunctionName - E2E tests:
go test -tags e2e ./pkg/e2e/ -run TestName— requires a Docker daemon and the locally built binary (make build)
E2E tests
- New e2e tests use the declarative
ScenarioDSL (NewScenarioinpkg/e2e/scenario.go): intent, inline compose model, steps as(command → expected observables). Readpkg/e2e/SCENARIO.mdbefore writing or debugging one — it codifies the rules (state-based checks first,OutputContainsas last resort, new checks go inpkg/e2e/checks.go) and how to exploit failure artifacts andE2E_KEEP_FAILED=1.
Lint
- Linter: golangci-lint v2 (config in
.golangci.yml) - Run:
golangci-lint run --build-tags "e2e" ./... - After modifying any Go code, ALWAYS run the linter and fix all reported issues before considering the task complete.
- Lint is also run via Docker:
docker buildx bake lint(uses version pinned inDockerfile)
Code Style
- Formatting is enforced by golangci-lint (gofumpt + gci)
- Import order: stdlib, third-party, local module (enforced by gci)
- Max line length: 200 chars
- Max cyclomatic complexity: 16
- No
io/ioutil,github.com/pkg/errors,gopkg.in/yaml.v2,golang.org/x/exp/maps,golang.org/x/exp/slices - Use
github.com/containerd/errdefsinstead ofgithub.com/docker/docker/errdefs - In tests: use
t.Context()instead ofcontext.Background()orcontext.TODO() - Prefer
fmt.FprintfoverWriteString(fmt.Sprintf(...))
Git
- All commits MUST be signed off (DCO). Always pass
--signoff(-s) togit commitandgit commit --amend.
Issue and PR Guidelines
-
Never create an issue or pull request without the user's explicit instruction.
-
If a user asks you to create a pull request on their behalf, add a file named
AI_AGENT_DISCLOSURE.mdto the change containing the text below followed by the current date (YYYY-MM-DD). If the file is already present in the repository, update its date to the current date so the disclosure is always part of the change:"This contribution was prepared by an AI agent acting on a human's behalf. The human submitter may not have independently reviewed or tested the change."
-
If a user asks you to create an issue on their behalf, prepend the following line to the issue body:
"This issue was filed by an AI agent on a human's behalf. The human submitter may not have independently verified the report."