README
¶
golangci-lint-action
It's the official GitHub action for golangci-lint from it's authors. The action runs golangci-lint and reports issues from linters.
How to use
- Create a GitHub token with scope
repo.public_repo
. - Add it to a repository secrets: repository ->
Settings
->Secrets
. - Add
.github/workflows/golangci-lint.yml
with the following contents:
name: golangci-lint
on:
push:
tags:
- v*
branches:
- master
pull_request:
jobs:
golangci:
name: lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: golangci-lint
uses: golangci/golangci-lint-action@v1
with:
# Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version.
version: v1.26
# Optional: golangci-lint command line arguments.
# args: ./the-only-dir-to-analyze/...
# Required: GitHub token with scope `repo.public_repo`. Used for fetching a list of releases of golangci-lint.
github-token: ${{ secrets.GOLANGCI_LINT_GITHUB_TOKEN }}
Comments and Annotations
Currently, GitHub parses the action's output and creates annotations.
The restrictions of annotations are the following:
- Currently, they don't support markdown formatting (see the feature request)
- They aren't shown in list of comments like it was with golangci.com. If you would like to have comments - please, up-vote the issue.
Performance
The action was implemented with performance in mind:
- We cache data by @actions/cache between builds: Go build cache, Go modules cache, golangci-lint analysis cache.
- We don't use Docker because image pulling is slow.
- We do as much as we can in parallel, e.g. we download cache, go and golangci-lint binary in parallel.
For example, in a repository of golangci-lint running this action without the cache takes 50s, but with cache takes 14s:
- in parallel:
- 13s to download Go
- 4s to restore 50 MB of cache
- 1s to find and install
golangci-lint
- 1s to run
golangci-lint
(it takes 35s without cache)
Internals
We use JavaScript-based action. We don't use Docker-based action because:
- docker pulling is slow currently
- it's easier to use caching from @actions/cache until GitHub team hasn't supported reusing actions from actions
Inside our action we perform 3 steps:
- Setup environment running in parallel:
- restore cache of previous analyzes
- list releases of golangci-lint and find the latest patch version for needed version (users of this action can specify only minor version). After that install golangci-lint using @actions/tool-cache
- install the latest Go 1.x version using @actions/setup-go
- Run
golangci-lint
with specified by userargs
- Save cache for later builds
Caching internals
- We save and restore the following directories:
~/.cache/golangci-lint
,~/.cache/go-build
,~/go/pkg
. - The primary caching key looks like
golangci-lint.cache-{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. - We use restore keys:
golangci-lint.cache-{interval_number}-
,golangci-lint.cache-
. 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.
Development of this action
- Install act
- Make a symlink for
act
to work properly:ln -s . golangci-lint-action
- Get a GitHub token with the scope
repo.public_repo
. Export it byexport GITHUB_TOKEN=YOUR_TOKEN
. - Prepare deps once:
npm run prepare-deps
- Run
npm run local
after any change to test it
Click to show internal directories.
Click to hide internal directories.