It's the official GitHub action for golangci-lint from its authors.
The action runs golangci-lint and reports issues from linters.
v6.0.0+
removes annotations
option, removes the default output format (github-actions
).v5.0.0+
removes skip-pkg-cache
and skip-build-cache
because the cache related to Go itself is already handled by actions/setup-go
.v4.0.0+
requires an explicit actions/setup-go
installation step before using this action: uses: actions/setup-go@v5
.
The skip-go-installation
option has been removed.v2.0.0+
works with golangci-lint
version >= v1.28.3
v1.2.2
is deprecated due to we forgot to change the minimum version of golangci-lint
to v1.28.3
(issue)v1.2.1
works with golangci-lint
version >= v1.14.0
(issue)Add .github/workflows/golangci-lint.yml
with the following contents:
name: golangci-lint
on:
push:
branches:
- main
- master
pull_request:
permissions:
contents: read
# Optional: allow read access to pull request. Use with `only-new-issues` option.
# pull-requests: read
jobs:
golangci:
name: lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: '1.22'
- name: golangci-lint
uses: golangci/golangci-lint-action@v6
with:
version: v1.58
We recommend running this action in a job separate from other jobs (go test
, etc.)
because different jobs run in parallel.
If you need to run linters for specific operating systems, you will need to use the action >=v2
.
Here is a sample configuration file:
name: golangci-lint
on:
push:
branches:
- main
- master
pull_request:
permissions:
contents: read
# Optional: allow read access to pull request. Use with `only-new-issues` option.
# pull-requests: read
jobs:
golangci:
strategy:
matrix:
go: ['1.22']
os: [ubuntu-latest, macos-latest, windows-latest]
name: lint
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: ${{ matrix.go }}
- name: golangci-lint
uses: golangci/golangci-lint-action@v6
with:
version: v1.58
You will also likely need to add the following .gitattributes
file to ensure that line endings for Windows builds are properly formatted:
*.go text eol=lf
version
(required)
The version of golangci-lint to use.
install-mode
is binary
(default) the value can be v1.2 or v1.2.3 or latest
to use the latest version.install-mode
is goinstall
the value can be v1.2.3, latest
, or the hash of a commit.uses: golangci/golangci-lint-action@v6
with:
version: v1.58
# ...
install-mode
(optional)
The mode to install golangci-lint: it can be binary
or goinstall
.
The default value is binary
.
uses: golangci/golangci-lint-action@v6
with:
install-mode: "goinstall"
# ...
only-new-issues
(optional)
Show only new issues.
The default value is false
.
uses: golangci/golangci-lint-action@v6
with:
only-new-issues: true
# ...
pull_request
and pull_request_target
: the action gets the diff of the PR content from the GitHub API and use it with --new-from-patch
.push
: the action gets the diff of the push content (difference between commits before and after the push) from the GitHub API and use it with --new-from-patch
.merge_group
: the action gets the diff by using --new-from-rev
option (relies on git).
You should add the option fetch-depth: 0
to actions/checkout
step.working-directory
(optional)
Working directory, useful for monorepos.
uses: golangci/golangci-lint-action@v6
with:
working-directory: somedir
# ...
skip-cache
(optional)
If set to true
, then all caching functionality will be completely disabled,
takes precedence over all other caching options.
The default value is false
.
uses: golangci/golangci-lint-action@v6
with:
skip-cache: true
# ...
skip-save-cache
(optional)
If set to true
, caches will not be saved, but they may still be restored, required skip-cache: false
.
The default value is false
.
uses: golangci/golangci-lint-action@v6
with:
skip-save-cache: true
# ...
cache-invalidation-interval
(optional)
Periodically invalidate the cache every cache-invalidation-interval
days to ensure that outdated data is removed and fresh data is loaded.
The default value is 7
.
uses: golangci/golangci-lint-action@v6
with:
cache-invalidation-interval: 15
# ...
If set the number is <= 0
, the cache will be always invalidate (Not recommended).
problem-matchers
(optional)
Force the usage of the embedded problem matchers.
By default, the problem matcher of Go (actions/setup-go
) already handles the golangci-lint output (colored-line-number
).
Works only with colored-line-number
(the golangci-lint default).
https://golangci-lint.run/usage/configuration/#output-configuration
The default value is false
.
uses: golangci/golangci-lint-action@v6
with:
problem-matchers: true
# ...
args
(optional)
golangci-lint command line arguments.
Note: By default, the .golangci.yml
file should be at the root of the repository.
The location of the configuration file can be changed by using --config=
uses: golangci/golangci-lint-action@v6
with:
args: --timeout=30m --config=/my/path/.golangci.yml --issues-exit-code=0
# ...
Currently, GitHub parses the action's output and creates annotations.
The restrictions of annotations are the following:
To enable annotations, you need to add the checks
permission to your action.
permissions:
# Required: allow read access to the content for analysis.
contents: read
# Optional: allow read access to pull request. Use with `only-new-issues` option.
pull-requests: read
# Optional: allow write access to checks to allow the action to annotate code in the PR.
checks: write
The action was implemented with performance in mind:
For example, in a repository of golangci-lint running this action without the cache takes 50s, but with cache takes 14s:
golangci-lint
golangci-lint
(it takes 35s without cache)We use JavaScript-based action. We don't use Docker-based action because:
We support different platforms, such as ubuntu
, macos
, and windows
with x32
and x64
archs.
Inside our action, we perform 3 steps:
golangci-lint
patch version for needed version
(users of this action can specify only minor version of golangci-lint
).
After that install golangci-lint using @actions/tool-cachegolangci-lint
with specified by user args
~/.cache/golangci-lint
.golangci-lint.cache-{runner_os}-{working_directory}-{interval_number}-{go.mod_hash}
.
Interval number ensures that we periodically invalidate our cache (every 7 days).
go.mod
hash ensures that we invalidate the cache early - as soon as dependencies have changed.golangci-lint.cache-{runner_os}-{working_directory}-{interval_number}-
.
GitHub matches keys by prefix if we have no exact match for the primary cache.This scheme is basic and needs improvements. Pull requests and ideas are welcome.
act
to work properly: ln -s . golangci-lint-action
npm run prepare-deps
npm run local
after any change to test it