testcontainers / testcontainers-go

Testcontainers for Go is a Go package that makes it simple to create and clean up container-based dependencies for automated integration/smoke tests. The clean, easy-to-use API enables developers to programmatically define containers that should be run as part of a test and clean up those resources when the test is done.
https://golang.testcontainers.org
MIT License
3.67k stars 504 forks source link

chore: run lint in a separate build before running the tests #2876

Open mdelapenya opened 2 weeks ago

mdelapenya commented 2 weeks ago

What does this PR do?

It extracts the golangci-lint step to a separate job, so that it can be called separately before the tests.

To detect the changes, we have created a shell script, scripts/changed-modules.sh. This script receives one single env var as input parameter, ALL_CHANGED_FILES, which on CI will be provided by a Github action, https://github.com/tj-actions/changed-files, that puts in there a list of the modified files, comparing the current PR changeset with the parent branch (main). We can tune this up to always check the latest main branch (open to discussion here).

The script will compare all existing modules (looking up all the go.mod files of interest, no test files) with the modified files, building an array of modified modules. At the moment there is modified file in the core, in other words the entire root directory without modulegen/modules/examples, all the modules will be included in the build. There are some exclusions for the code: files in the .devcontainer, .vscode, docs, scripts will not cause all modules will be included. So it could be the case that no modules could end up in the build if only files in those exclusions are changed. In that case, we are going to conditionally skip the lint, test and upload-to-sonar jobs.

Finally, for running the tests, we are going to keep the matrix for running them in multiple Go versions and OSs, with the following rules:

BTW I was able to iterate faster on this at the moment I discovered the power of https://github.com/nektos/act. Fantastic tool!

Why is it important?

There are two major goals:

As a drawback, in my opinion, is that two different builds with two different changesets won't run the same set of tests, so they are not deterministic. I think this is a minor detail that would be satisfied with the improved experience for module contributors at CI time. For core maintainers, we will probably run all the modules per PR, but that could be expected to verify we are not breaking the downstream modules.

How to test this PR

The shell script is the key part, and it's explained in the comments for the script. It requires running the script with the required environment variables for the different use cases:

  1. A Go file from the core module is modified: ALL_CHANGED_FILES="examples/nginx/go.mod examples/foo/a.txt a/b/c/d/a.go" ./scripts/changed-modules.sh The output should be: all modules.

  2. A file from a module in the modules dir is modified: ALL_CHANGED_FILES="modules/nginx/go.mod" ./scripts/changed-modules.sh The output should be: just the modules/nginx module.

  3. A file from a module in the examples dir is modified: ALL_CHANGED_FILES="examples/nginx/go.mod" ./scripts/changed-modules.sh The output should be: just the examples/nginx module.

  4. A Go file from the modulegen dir is modified: ALL_CHANGED_FILES="modulegen/a.go" ./scripts/changed-modules.sh The output should be: just the modulegen module.

  5. A non-Go file from the core dir is modified: ALL_CHANGED_FILES="README.md" ./scripts/changed-modules.sh The output should be: all modules.

  6. A file from two modules in the modules dir are modified: ALL_CHANGED_FILES="modules/nginx/go.mod modules/localstack/go.mod" ./scripts/changed-modules.sh The output should be: the modules/nginx and modules/localstack modules.

  7. Files from the excluded dirs are modified: ALL_CHANGED_FILES="docs/a.md .vscode/a.json .devcontainer/a.json scripts/a.sh" ./scripts/changed-modules.sh The output should be: no modules.

Follow-ups

IMPORTANT!: We need to update the branch settings so that the new checks are used to allow the merge.

netlify[bot] commented 2 weeks ago

Deploy Preview for testcontainers-go ready!

Name Link
Latest commit 12a90ab5bdccdaa6914e2cc443adaebaea5112e9
Latest deploy log https://app.netlify.com/sites/testcontainers-go/deploys/673c6df68b76460008d5769c
Deploy Preview https://deploy-preview-2876--testcontainers-go.netlify.app
Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify site configuration.