Lint every Go repository with one shared configuration and version, reporting only what a change brings
This commit is contained in:
commit
89089b1e2f
3 files changed
+193
No files matched your search
@@ -0,0 +1,27 @@
|
|||||||
|
# go-lint
|
||||||
|
|
||||||
|
golangci-lint for every Go repository, with one shared configuration
|
||||||
|
(`golangci.yml` here) and one pinned version. Add it as a step after the tests:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- name: Lint
|
||||||
|
uses: https://lab.zlymeda.dynu.net/actions/go-lint@master
|
||||||
|
```
|
||||||
|
|
||||||
|
It reports only issues in what the run brings: the pushed commits, or what a
|
||||||
|
pull request or a new branch adds to its target. A repository that was never
|
||||||
|
linted therefore does not go red, and its old code is cleaned as it is touched.
|
||||||
|
`new_from_rev: ''` reports everything, for a repository that is already clean.
|
||||||
|
|
||||||
|
A repository with its own `.golangci.yml` is linted with that instead, for rules
|
||||||
|
only it needs. Copy the shared file and add to it, so the common rules stay.
|
||||||
|
|
||||||
|
The version is the one baked into the go-executor image; another runner, or a
|
||||||
|
different `version`, installs it first. Bump both together.
|
||||||
|
|
||||||
|
Locally, with the same rules:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
curl -sSfo /tmp/golangci.yml https://lab.zlymeda.dynu.net/actions/go-lint/raw/branch/master/golangci.yml
|
||||||
|
golangci-lint run --config /tmp/golangci.yml
|
||||||
|
```
|
||||||
+76
@@ -0,0 +1,76 @@
|
|||||||
|
name: Go lint
|
||||||
|
description: >
|
||||||
|
Run golangci-lint with the shared configuration, or the repository's own
|
||||||
|
.golangci.yml when it has one, reporting only issues in the code a push or
|
||||||
|
pull request changed.
|
||||||
|
|
||||||
|
inputs:
|
||||||
|
version:
|
||||||
|
description: golangci-lint version, installed when the runner has a different one
|
||||||
|
default: 2.15.0
|
||||||
|
config:
|
||||||
|
description: Configuration file; empty uses the repository's .golangci.yml, else the shared one
|
||||||
|
default: ''
|
||||||
|
new_from_rev:
|
||||||
|
description: >
|
||||||
|
Report issues only after this revision. auto: the pushed range, or the merge
|
||||||
|
base with the pull request's target; empty: report everything.
|
||||||
|
default: auto
|
||||||
|
working_directory:
|
||||||
|
description: Directory of the Go module
|
||||||
|
default: .
|
||||||
|
args:
|
||||||
|
description: Extra golangci-lint arguments
|
||||||
|
default: ''
|
||||||
|
|
||||||
|
runs:
|
||||||
|
using: composite
|
||||||
|
steps:
|
||||||
|
- name: Lint
|
||||||
|
shell: bash
|
||||||
|
working-directory: ${{ inputs.working_directory }}
|
||||||
|
env:
|
||||||
|
VERSION: ${{ inputs.version }}
|
||||||
|
CONFIG: ${{ inputs.config }}
|
||||||
|
NEW_FROM_REV: ${{ inputs.new_from_rev }}
|
||||||
|
ARGS: ${{ inputs.args }}
|
||||||
|
SHARED_CONFIG: ${{ github.action_path }}/golangci.yml
|
||||||
|
EVENT: ${{ github.event_name }}
|
||||||
|
BEFORE: ${{ github.event.before }}
|
||||||
|
BASE_REF: ${{ github.base_ref }}
|
||||||
|
DEFAULT_BRANCH: ${{ github.event.repository.default_branch }}
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
lint=golangci-lint
|
||||||
|
if ! command -v golangci-lint >/dev/null || [[ "$(golangci-lint version --short 2>/dev/null)" != "$VERSION" ]]; then
|
||||||
|
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/HEAD/install.sh | sh -s -- -b "$RUNNER_TEMP/golangci" "v$VERSION"
|
||||||
|
lint="$RUNNER_TEMP/golangci/golangci-lint"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$CONFIG" ]; then
|
||||||
|
CONFIG=$(ls .golangci.yml .golangci.yaml 2>/dev/null | head -1 || true)
|
||||||
|
CONFIG=${CONFIG:-$SHARED_CONFIG}
|
||||||
|
fi
|
||||||
|
echo "config: $CONFIG"
|
||||||
|
|
||||||
|
# The checkout is usually shallow, and a shallow history has no base to compare against.
|
||||||
|
[ "$(git rev-parse --is-shallow-repository)" = true ] && git fetch -q --unshallow
|
||||||
|
new=()
|
||||||
|
if [ "$NEW_FROM_REV" = auto ]; then
|
||||||
|
if [ "$EVENT" = pull_request ] && [ -n "$BASE_REF" ]; then
|
||||||
|
git fetch -q origin "$BASE_REF"
|
||||||
|
new=(--new-from-merge-base="origin/$BASE_REF")
|
||||||
|
elif [ -n "$BEFORE" ] && [[ ! "$BEFORE" =~ ^0+$ ]] && git cat-file -e "$BEFORE^{commit}" 2>/dev/null; then
|
||||||
|
new=(--new-from-rev="$BEFORE")
|
||||||
|
else
|
||||||
|
# A new branch or a manual run: what the branch adds to the default branch.
|
||||||
|
git fetch -q origin "${DEFAULT_BRANCH:-master}"
|
||||||
|
new=(--new-from-merge-base="origin/${DEFAULT_BRANCH:-master}")
|
||||||
|
fi
|
||||||
|
elif [ -n "$NEW_FROM_REV" ]; then
|
||||||
|
new=(--new-from-rev="$NEW_FROM_REV")
|
||||||
|
fi
|
||||||
|
echo "reporting: ${new[*]:-everything}"
|
||||||
|
|
||||||
|
# shellcheck disable=SC2086
|
||||||
|
"$lint" run --config "$CONFIG" "${new[@]}" $ARGS
|
||||||
@@ -0,0 +1,90 @@
|
|||||||
|
version: "2"
|
||||||
|
|
||||||
|
run:
|
||||||
|
timeout: 5m
|
||||||
|
tests: true
|
||||||
|
|
||||||
|
linters:
|
||||||
|
default: standard
|
||||||
|
enable:
|
||||||
|
# Baseline & Core Analyzers
|
||||||
|
- errcheck
|
||||||
|
- govet
|
||||||
|
- ineffassign
|
||||||
|
- staticcheck
|
||||||
|
- unused
|
||||||
|
- unconvert
|
||||||
|
- unparam
|
||||||
|
- misspell
|
||||||
|
|
||||||
|
# Error Handling & Precision
|
||||||
|
- errorlint
|
||||||
|
- nilerr
|
||||||
|
|
||||||
|
# Concurrency & Context
|
||||||
|
- contextcheck
|
||||||
|
- durationcheck
|
||||||
|
- noctx
|
||||||
|
|
||||||
|
# Diagnostics & Code Quality
|
||||||
|
- gocritic
|
||||||
|
- copyloopvar
|
||||||
|
- prealloc
|
||||||
|
- revive
|
||||||
|
|
||||||
|
exclusions:
|
||||||
|
rules:
|
||||||
|
- path: _test\.go
|
||||||
|
linters:
|
||||||
|
- unparam
|
||||||
|
- errcheck
|
||||||
|
- contextcheck
|
||||||
|
- gocritic
|
||||||
|
- revive
|
||||||
|
- noctx
|
||||||
|
- govet
|
||||||
|
- errorlint
|
||||||
|
- prealloc
|
||||||
|
|
||||||
|
settings:
|
||||||
|
errcheck:
|
||||||
|
check-type-assertions: true
|
||||||
|
check-blank: false
|
||||||
|
govet:
|
||||||
|
enable:
|
||||||
|
- shadow
|
||||||
|
- nilness
|
||||||
|
- unusedwrite
|
||||||
|
errorlint:
|
||||||
|
errorf: true
|
||||||
|
asserts: true
|
||||||
|
comparison: true
|
||||||
|
misspell:
|
||||||
|
ignore-rules:
|
||||||
|
- marginable
|
||||||
|
gocritic:
|
||||||
|
enabled-tags:
|
||||||
|
- diagnostic
|
||||||
|
- performance
|
||||||
|
disabled-checks:
|
||||||
|
- commentFormatting
|
||||||
|
- hugeParam
|
||||||
|
- commentedOutCode
|
||||||
|
- captLocal
|
||||||
|
- assignOp
|
||||||
|
- rangeValCopy
|
||||||
|
- unnecessaryDefer
|
||||||
|
- sloppyReassign
|
||||||
|
revive:
|
||||||
|
rules:
|
||||||
|
- name: exported
|
||||||
|
disabled: true
|
||||||
|
|
||||||
|
formatters:
|
||||||
|
enable:
|
||||||
|
- gofmt
|
||||||
|
- goimports
|
||||||
|
|
||||||
|
issues:
|
||||||
|
max-issues-per-linter: 0
|
||||||
|
max-same-issues: 0
|
||||||
Reference in new issue
Block a user