diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 00000000..a19bcf25 --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,113 @@ +# Tested with golangci-lint ver. 1.37 +linters-settings: + depguard: + list-type: blacklist + packages: + # logging is allowed only by logutils.Log, logrus + # is allowed to use only in logutils package + - github.com/sirupsen/logrus + packages-with-error-message: + - github.com/sirupsen/logrus: "logging is allowed only by logutils.Log" + dupl: + threshold: 100 + funlen: + lines: 100 + statements: 50 + goconst: + min-len: 2 + min-occurrences: 2 + gocritic: + enabled-tags: + - diagnostic + - experimental + - opinionated + - performance + - style + disabled-checks: + - dupImport # https://github.com/go-critic/go-critic/issues/845 + - ifElseChain + - octalLiteral + - whyNoLint + - wrapperFunc + - unnamedResult + gocyclo: + min-complexity: 15 + goimports: + local-prefixes: github.com/k8snetworkplumbingwg/sriov-network-device-plugin + golint: + min-confidence: 0 + gomnd: + settings: + mnd: + # don't include the "operation" and "assign" + checks: argument,case,condition,return + lll: + line-length: 140 + misspell: + locale: US + prealloc: + # Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them. + # True by default. + simple: true + range-loops: true # Report preallocation suggestions on range loops, true by default + for-loops: false # Report preallocation suggestions on for loops, false by default + +linters: + # please, do not use `enable-all`: it's deprecated and will be removed soon. + # inverted configuration with `enable-all` and `disable` is not scalable during updates of golangci-lint + disable-all: true + enable: + - bodyclose + - deadcode + - depguard + - dogsled + - dupl + - errcheck + - exportloopref + - exhaustive + - funlen + #- gochecknoinits + - goconst + - gocritic + - gocyclo + - gofmt + - goimports + - golint + - gomnd + - goprintffuncname + - gosec + - gosimple + #- govet + - ineffassign + - lll + - misspell + - nakedret + - prealloc + - rowserrcheck + #- scopelint + - staticcheck + - structcheck + - stylecheck + - typecheck + - unconvert + - unparam + - unused + - varcheck + - whitespace + +issues: + # Excluding configuration per-path, per-linter, per-text and per-source + exclude-rules: + - path: _test\.go + linters: + - gomnd + - gosec + - dupl + +run: + skip-dirs: + - .github/ + - deployments/ + - docs/ + - images/ + - scripts/ diff --git a/Makefile b/Makefile index 8832e48e..92ba512f 100644 --- a/Makefile +++ b/Makefile @@ -22,6 +22,9 @@ image : test : scripts/test.sh +lint : + scripts/lint.sh + vendor : go mod tidy && go mod vendor diff --git a/scripts/lint.sh b/scripts/lint.sh new file mode 100755 index 00000000..53805851 --- /dev/null +++ b/scripts/lint.sh @@ -0,0 +1,32 @@ +#!/usr/bin/env bash +set -eo pipefail + +GOLANGCI_LINT_VER="v1.37.1" +GOLANGCI_BIN_NAME="golangci-lint" +GOLANGCI_INSTALL_URL="https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh" +RETRY=3 +TIMEOUT=300 + +repo_root="$( cd "$( dirname "${BASH_SOURCE[0]}" )/../" && pwd )" +repo_bin="${repo_root:?}/bin" +export PATH="${PATH}:${repo_bin}" + +# install golangci lint if not available in PATH +if ! command -v "${GOLANGCI_BIN_NAME}" &> /dev/null; then + mkdir -p "${repo_bin}" + + curl --silent --show-error --fail --location --retry "${RETRY}" \ + --connect-timeout "${TIMEOUT}" "${GOLANGCI_INSTALL_URL}" \ + | sh -s -- -b "${repo_bin}" "${GOLANGCI_LINT_VER}" + + export PATH="${PATH}:${repo_bin}" + + # validate that we can access golangci lint + if ! command -v "${GOLANGCI_BIN_NAME}" &> /dev/null; then + echo "failed to install golangci lint in '${repo_bin}'" + exit 2 + fi +fi + +cd "${repo_root}" +"${GOLANGCI_BIN_NAME}" run