compose/AGENTS.md
Nicolas De Loof 7af58e3626 test(e2e): gate the e2e suite behind the build tag the docs already promise
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>
2026-08-27 11:02:07 +02:00

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 the e2e build 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 Scenario DSL (NewScenario in pkg/e2e/scenario.go): intent, inline compose model, steps as (command → expected observables). Read pkg/e2e/SCENARIO.md before writing or debugging one — it codifies the rules (state-based checks first, OutputContains as last resort, new checks go in pkg/e2e/checks.go) and how to exploit failure artifacts and E2E_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 in Dockerfile)

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/errdefs instead of github.com/docker/docker/errdefs
  • In tests: use t.Context() instead of context.Background() or context.TODO()
  • Prefer fmt.Fprintf over WriteString(fmt.Sprintf(...))

Git

  • All commits MUST be signed off (DCO). Always pass --signoff (-s) to git commit and git 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.md to 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."