Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork178
Official GitHub Action for golangci-lint from its authors
License
golangci/golangci-lint-action
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
It's the official GitHub Action forgolangci-lint from its authors.
The action runsgolangci-lint and reports issues from linters.
golangci-lint is a free and open-source project built by volunteers.
If you value it, consider supporting us; we appreciate it! ❤️
We recommend running this action in a job separate from other jobs (go test, etc.)because different jobsrun in parallel.
Add a.github/workflows/golangci-lint.yml file with the following contents:
Simple Example
name:golangci-linton:push:branches: -main -masterpull_request:permissions:contents:read# Optional: allow read access to pull requests. Use with `only-new-issues` option.# pull-requests: readjobs:golangci:name:lintruns-on:ubuntu-lateststeps: -uses:actions/checkout@v5 -uses:actions/setup-go@v6with:go-version:stable -name:golangci-lintuses:golangci/golangci-lint-action@v8with:version:v2.1
Multiple OS Example
name:golangci-linton:push:branches: -main -masterpull_request:permissions:contents:read# Optional: allow read access to pull requests. Use with `only-new-issues` option.# pull-requests: readjobs:golangci:strategy:matrix:go:[stable]os:[ubuntu-latest, macos-latest, windows-latest]name:lintruns-on:${{ matrix.os }}steps: -uses:actions/checkout@v5 -uses:actions/setup-go@v6with:go-version:${{ matrix.go }} -name:golangci-lintuses:golangci/golangci-lint-action@v8with:version:v2.1
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=lfGo Workspace Example
name:golangci-linton:pull_request:push:branches: -main -masterenv:GO_VERSION:stableGOLANGCI_LINT_VERSION:v2.1jobs:detect-modules:runs-on:ubuntu-latestoutputs:modules:${{ steps.set-modules.outputs.modules }}steps: -uses:actions/checkout@v5 -uses:actions/setup-go@v6with:go-version:${{ env.GO_VERSION }} -id:set-modulesrun:echo "modules=$(go list -m -json | jq -s '.' | jq -c '[.[].Dir]')" >> $GITHUB_OUTPUTgolangci-lint:needs:detect-modulesruns-on:ubuntu-lateststrategy:matrix:modules:${{ fromJSON(needs.detect-modules.outputs.modules) }}steps: -uses:actions/checkout@v5 -uses:actions/setup-go@v6with:go-version:${{ env.GO_VERSION }} -name:golangci-lint ${{ matrix.modules }}uses:golangci/golangci-lint-action@v8with:version:${{ env.GOLANGCI_LINT_VERSION }}working-directory:${{ matrix.modules }}
Go Workspace Example (Multiple OS)
# ./.github/workflows/golangci-lint.ymlname:golangci-lint (multi OS)on:pull_request:push:branches: -main -masterjobs:golangci-lint:strategy:matrix:go-version:[ stable, oldstable ]os:[ubuntu-latest, macos-latest, windows-latest]uses:./.github/workflows/.golangci-lint-reusable.ymlwith:os:${{ matrix.os }}go-version:${{ matrix.go-version }}golangci-lint-version:v2.1
# ./.github/workflows/.golangci-lint-reusable.ymlname:golangci-lint-reusableon:workflow_call:inputs:os:description:'OS'required:truetype:stringgo-version:description:'Go version'required:truetype:stringdefault:stablegolangci-lint-version:description:'Golangci-lint version'type:stringdefault:'v2.1'jobs:detect-modules:runs-on:${{ inputs.os }}outputs:modules:${{ steps.set-modules.outputs.modules }}steps: -uses:actions/checkout@v5 -uses:actions/setup-go@v6with:go-version:${{ inputs.go-version }} -id:set-modulesshell:bash# required for Windows to be able to use $GITHUB_OUTPUT https://github.com/actions/runner/issues/2224run:echo "modules=$(go list -m -json | jq -s '.' | jq -c '[.[].Dir]')" >> $GITHUB_OUTPUTgolangci-lint:needs:detect-modulesruns-on:${{ inputs.os }}strategy:matrix:modules:${{ fromJSON(needs.detect-modules.outputs.modules) }}steps: -uses:actions/checkout@v5 -uses:actions/setup-go@v6with:go-version:${{ inputs.go-version }} -name:golangci-lint ${{ matrix.modules }}uses:golangci/golangci-lint-action@v8with:version:${{ inputs.golangci-lint-version }}working-directory:${{ matrix.modules }}
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=lfv8.0.0works withgolangci-lintversion >=v2.1.0v7.0.0supports golangci-lint v2 only.v6.0.0+removesannotationsoption, removes the default output format (github-actions).v5.0.0+removesskip-pkg-cacheandskip-build-cachebecause the cache related to Go itself is already handled byactions/setup-go.v4.0.0+requires an explicitactions/setup-goinstallation step before using this action:uses: actions/setup-go@v5.Theskip-go-installationoption has been removed.v2.0.0+works withgolangci-lintversion >=v1.28.3v1.2.2is deprecated because we forgot to change the minimum version ofgolangci-linttov1.28.3(issue)v1.2.1works withgolangci-lintversion >=v1.14.0(issue)
(optional)
The version of golangci-lint to use.
Wheninstall-mode is:
binary(default): the value can be v2.3, v2.3.4, orlatestto use the latest version.goinstall: the value can be v2.3.4,latest, or the hash of a commit.none: the value is ignored.
Example
uses:golangci/golangci-lint-action@v8with:version:v2.1# ...
(optional)
The mode to install golangci-lint: it can bebinary,goinstall, ornone.
The default value isbinary.
goinstall is not recommended, more explanationshere.
Example
uses:golangci/golangci-lint-action@v8with:install-mode:"none"# ...
(optional)
When using theonly-new-issues option, the GitHub API is used, so a token is required.
By default, it uses thegithub.token from the action.
Example
uses:golangci/golangci-lint-action@v8with:github-token:xxx# ...
(optional)
This option istrue by default.
If the GitHub Action detects a configuration file, validation will be performed unless this option is set tofalse.If there is no configuration file, validation is skipped.
The JSON Schema used to validate the configuration depends on the version of golangci-lint you are using.
Example
uses:golangci/golangci-lint-action@v8with:verify:false# ...
(optional)
Show only new issues.
The default value isfalse.
pull_requestandpull_request_target: the action gets the diff of the PR content from theGitHub API and uses it with--new-from-patch.push: the action gets the diff of the push content (the difference between commits before and after the push) from theGitHub API and uses it with--new-from-patch.merge_group: the action gets the diff by using the--new-from-revoption (relies on git).You should add the optionfetch-depth: 0to theactions/checkoutstep.
Example
uses:golangci/golangci-lint-action@v8with:only-new-issues:true# ...
(optional)
The golangci-lint working directory, useful for monorepos. The default is the project root.
Example
uses:golangci/golangci-lint-action@v8with:working-directory:somedir# ...
(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=.
Important
Adding a= between the flag name and its value is important because the action parses the arguments on spaces.
Example
uses:golangci/golangci-lint-action@v8with:# In some rare cases,# you may need to use `${{ github.workspace }}` as the base directory to reference your configuration file.args:--config=/my/path/.golangci.yml --issues-exit-code=0# ...
(optional)
Forces the usage of the embedded problem matchers.
By default, theproblem matcher of Go (actions/setup-go) already handles the default golangci-lint output (text).
Works only with thetext format (the golangci-lint default).
https://golangci-lint.run/usage/configuration/#output-configuration
The default value isfalse.
Example
uses:golangci/golangci-lint-action@v8with:problem-matchers:true# ...
(optional)
If set totrue, all caching functionality will be completely disabled.This takes precedence over all other caching options.
The default value isfalse.
Example
uses:golangci/golangci-lint-action@v8with:skip-cache:true# ...
(optional)
If set totrue, caches will not be saved, but they may still be restored, requiringskip-cache: false.
The default value isfalse.
Example
uses:golangci/golangci-lint-action@v8with:skip-save-cache:true# ...
(optional)
Periodically invalidate a cache everycache-invalidation-interval days to ensure that outdated data is removed and fresh data is loaded.
The default value is7.
If the number is<= 0, the cache will always be invalidated (not recommended).
Example
uses:golangci/golangci-lint-action@v8with:cache-invalidation-interval:15# ...
Currently, GitHub parses the action's output and createsannotations.
The restrictions of annotations are as follows:
- Currently, they don't support Markdown formatting (see thefeature request).
- They aren't shown in the list of comments.If you would like to have comments, please up-votethe issue.
- The number of annotations islimited.
Permissions required:
permissions:# Required: allow read access to the content for analysis.contents:read# Optional: allow read access to pull requests. Use with `only-new-issues` option.pull-requests:read
For annotations to work, use the default format output (text) and either useactions/setup-go in the job or enable the internalproblem matchers.
The action was implemented with performance in mind:
- We cache data from golangci-lint analysis between builds by using@actions/cache.
- We don't use Docker because image pulling is slow.
- We do as much as we can in parallel, e.g., we download the cache and the golangci-lint binary in parallel.
- We rely on
actions/setup-gofor Go module cache.
We use a JavaScript-based action.We don't use a Docker-based action because:
- Pulling Docker images is currently slow.
- It is easier to use caching from@actions/cache.
We support different platforms, such asubuntu,macos, andwindows withx32 andx64 architectures.
Inside our action, we perform three steps:
- Set up the environment in parallel:
- Restore thecache from previous analyses.
- Fetch theaction config and find the latest
golangci-lintpatch version for the required version(users of this action can specify only the minor version ofgolangci-lint).After that, installgolangci-lint using@actions/tool-cache.
- Run
golangci-lintwith the argumentsargsspecified by the user. - Save the cache for later builds.
- We save and restore the following directory:
~/.cache/golangci-lint. - The primary caching key looks like
golangci-lint.cache-{runner_os}-{working_directory}-{interval_number}-{go.mod_hash}.The interval number ensures that we periodically invalidate our cache (every 7 days).Thego.modhash ensures that we invalidate the cache early — as soon as dependencies have changed. - We userestore keys:
golangci-lint.cache-{runner_os}-{working_directory}-{interval_number}-.GitHub matches keys by prefix if there is no exact match for the primary cache.
This scheme is basic and needs improvements. Pull requests and ideas are welcome.
About
Official GitHub Action for golangci-lint from its authors
Topics
Resources
License
Code of conduct
Contributing
Security policy
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Sponsor this project
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.

