Running tasks before a commit with pre-commit and Docker
There are some tasks I really find necessary before committing code and reaching the CI pipeline, for example formatting, linting, and running unit tests. The sooner any issue can be catch in that regards the quicker a feature or bugfix can be delivered.
One amazing tool for this that is language/ecosystem-independent is pre-commit, which helps us create git hooks that are triggered before a commit, to perform tasks on staged files.
The way I prefer to run these hooks is with Docker, as it removes the need to have any additional set up like a language installed, or a runtime version in our computers or in our colleagues', only the tool itself.
If using macOS with Homebrew:
brew install pre-commit
Create a pre-commit config file named
Add the tasks we want to run
repos: - repo: local # Use a local repository hooks: - id: docker-go name: foo-format language: docker_image entry: golang:1-alpine sh -c "cd foo && go fmt ./..." files: ^foo/ verbose: true - id: docker-go name: foo-vet language: docker_image entry: golang:1-alpine sh -c "cd foo && go vet ./..." files: ^foo/ verbose: true - id: docker-go name: foo-test language: docker_image entry: golang:1 sh -c "cd foo && export XDG_CACHE_HOME="/tmp/.cache" && go test ./..." files: ^foo/ verbose: true
In this example we set up to run a formatter, a linter, and testing using a Docker image, for staged files that are located inside the folder
Each task will be executed independently in sequential order.
To convert these tasks into git hooks so they are caught by git, run:
This will inform us that the git hooks have been created.
From now on any commit will trigger these hooks that will in turn execute the defined tasks. If any task fails or a file is modified automatically, the commit will be stopped, saving us from commiting non-ready code to the repository.
If you're using dark mode, do you like the code blocks's theme? I have it available for VS Code, feel free to check it.