diff --git a/.golangci.yaml b/.golangci.yaml new file mode 100644 index 0000000000..ab4582aedf --- /dev/null +++ b/.golangci.yaml @@ -0,0 +1,81 @@ +# This file contains all available configuration options +# with their default values. + +# options for analysis running +run: + # default concurrency is a available CPU number + concurrency: 4 + + # timeout for analysis, e.g. 30s, 5m, default is 1m + timeout: 1m + + # exit code when at least one issue was found, default is 1 + issues-exit-code: 1 + + # include test files or not, default is true + tests: true + + # which dirs to skip: issues from them won't be reported; + # can use regexp here: generated.*, regexp is applied on full path; + # default value is empty list, but default dirs are skipped independently + # from this option's value (see skip-dirs-use-default). + # "/" will be replaced by current OS file path separator to properly work + # on Windows. + skip-dirs: + - vendor + + # default is true. Enables skipping of directories: + # vendor$, third_party$, testdata$, examples$, Godeps$, builtin$ + skip-dirs-use-default: true + + # by default isn't set. If set we pass it to "go list -mod={option}". From "go help modules": + # If invoked with -mod=readonly, the go command is disallowed from the implicit + # automatic updating of go.mod described above. Instead, it fails when any changes + # to go.mod are needed. This setting is most useful to check that go.mod does + # not need updates, such as in a continuous integration and testing system. + # If invoked with -mod=vendor, the go command assumes that the vendor + # directory holds the correct copies of dependencies and ignores + # the dependency descriptions in go.mod. + modules-download-mode: vendor + + # Allow multiple parallel golangci-lint instances running. + # If false (default) - golangci-lint acquires file lock on start. + allow-parallel-runners: false + + +# output configuration options +output: + # colored-line-number|line-number|json|tab|checkstyle|code-climate|junit-xml|github-actions + # default is "colored-line-number" + format: tab + + # print lines of code with issue, default is true + print-issued-lines: true + + # print linter name in the end of issue text, default is true + print-linter-name: true + + # make issues output unique by line, default is true + uniq-by-line: true + + # add a prefix to the output file references; default is no prefix + path-prefix: "" + + # sorts results by: filepath, line and column + sort-results: false + +linters: + disable-all: true + enable: + # - deadcode + # - errcheck + # - gofmt + # - gosimple + # - govet + - ineffassign + # - staticcheck + # - structcheck + - typecheck + # - unused + - varcheck + fast: false diff --git a/Makefile b/Makefile index 8f8219f322..3bc010ede0 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,7 @@ +BIN_DIR?=./bin +GOLANGCI_LINT_BIN=$(BIN_DIR)/golangci-lint +GOLANGCI_LINT_VERSION=v1.40.1 + all: build .PHONY: all @@ -11,6 +15,7 @@ test: clean: rm -rf _output/ + rm -rf bin .PHONY: clean update-codegen-crds: @@ -21,3 +26,13 @@ verify-codegen-crds: verify-codegen: verify-codegen-crds verify: verify-codegen .PHONY: update-codegen-crds update-codegen verify-codegen-crds verify-codegen verify + + +.PHONY: lint +## Checks the code with golangci-lint +lint: $(GOLANGCI_LINT_BIN) + $(GOLANGCI_LINT_BIN) run -c .golangci.yaml --deadline=30m + +$(GOLANGCI_LINT_BIN): + mkdir -p $(BIN_DIR) + hack/golangci-lint.sh $(GOLANGCI_LINT_BIN) diff --git a/hack/golangci-lint.sh b/hack/golangci-lint.sh new file mode 100755 index 0000000000..7dfdccc5f4 --- /dev/null +++ b/hack/golangci-lint.sh @@ -0,0 +1,37 @@ +#!/bin/sh +set -e + +GOLANGCI_VERSION="1.40.1" + +OUTPUT_PATH=${1:-./bin/golangci-lint} + +GOOS=$(go env GOOS) +GOARCH=$(go env GOARCH) + +case $GOOS in + linux) + CHECKSUM="7c133b4b39c0a46cf8d67265da651f169079d137ae71aee9b5934e2281bd18d3" + ;; + darwin) + CHECKSUM="04715fb08566d7342a51352e36a544f246f632ec6bb7f4d7144d6c9e3a2ada7d" + ;; + *) + echo "Unsupported OS $GOOS" + exit 1 + ;; +esac + +if [ "$GOARCH" != "amd64" ]; then + echo "Unsupported architecture $GOARCH" + exit 1 +fi + +TEMPDIR=$(mktemp -d) +curl --silent --location -o "$TEMPDIR/golangci-lint.tar.gz" "https://github.com/golangci/golangci-lint/releases/download/v$GOLANGCI_VERSION/golangci-lint-$GOLANGCI_VERSION-$GOOS-$GOARCH.tar.gz" +tar xzf "$TEMPDIR/golangci-lint.tar.gz" --directory="$TEMPDIR" + +echo "$CHECKSUM" "$TEMPDIR/golangci-lint.tar.gz" | sha256sum -c --quiet + +BIN=$TEMPDIR/golangci-lint-$GOLANGCI_VERSION-$GOOS-$GOARCH/golangci-lint +mv "$BIN" "$OUTPUT_PATH" +rm -rf "$TEMPDIR"