diff --git a/.github/workflows/lint-go-reusable.yml b/.github/workflows/lint-go-reusable.yml new file mode 100644 index 0000000..3a7e978 --- /dev/null +++ b/.github/workflows/lint-go-reusable.yml @@ -0,0 +1,38 @@ +# This workflow defines a reusable Go linting flow, using Golangci-lint: https://golangci-lint.run/ +# https://golangci-lint.run/usage/configuration/ + +name: Lint code (reusable) + +on: + workflow_call: + inputs: + go-version: + required: true + type: string + description: "The Go version to use. This can be a specific version. E.g. 1.19 or 1.21.x" + lint-config-uri: + required: true + type: string + description: "The URI to the linter config file. This can be a local file or a remote file. E.g. https://raw.githubusercontent.com/kyma-project/eventing-tools/main/config/lint/.golangci.yaml" + +jobs: + unit: + runs-on: ubuntu-latest + steps: + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version: ${{ inputs.go-version }} # This can be a specific version. E.g. 1.19 or 1.21.x + cache: false # Disable cache to avoid issues with different Go versions + + - name: Checkout code + uses: actions/checkout@v4 + + - name: Download linter config + run: wget -O .golangci.yaml ${{ inputs.lint-config-uri }} # This can be a remote file only. E.g. https://raw.githubusercontent.com/kyma-project/eventing-tools/main/config/lint/.golangci.yaml + + - name: golangci-lint + uses: golangci/golangci-lint-action@v3 + with: + version: v1.55 + args: --timeout=5m --config=./.golangci.yaml --issues-exit-code 1 # Failed if any issues are found diff --git a/.github/workflows/lint-reusable.yml b/.github/workflows/lint-reusable.yml index adad7b6..47d2e67 100644 --- a/.github/workflows/lint-reusable.yml +++ b/.github/workflows/lint-reusable.yml @@ -22,4 +22,4 @@ jobs: uses: golangci/golangci-lint-action@v3 with: version: v1.55 - args: --timeout=5m + args: --timeout=5m \ No newline at end of file diff --git a/config/lint/.golangci.yaml b/config/lint/.golangci.yaml new file mode 100644 index 0000000..de0f234 --- /dev/null +++ b/config/lint/.golangci.yaml @@ -0,0 +1,168 @@ +linters: + enable-all: true + disable: + - contextcheck # too many false positives + - deadcode # deprecated (since v1.49.0) and replaced by 'unused' + - depguard # checks if package imports are whitelisted + - exhaustivestruct # deprecated (since v1.46.0) and replaced by 'exhaustruct' + - exhaustruct # TODO enable and fix, use regex to exclude certain cases + - golint # deprecated (since v1.41.0) and replaced by 'revive' + - ifshort # deprecated (since v1.48.0) + - interfacer # deprecated (since v1.38.0) + - lll + - maligned # deprecated (since v1.38.0) + - nlreturn # too strict and mostly code is not more readable + - nosnakecase # deprecated (since v1.48.1) and replaced by 'revive' + - scopelint # deprecated (since v1.39.0) and replaced by 'exportloopref' + - structcheck # deprecated (since v1.49.0) and replaced by 'unused' + - sqlclosecheck # not needed for this project + - varcheck # deprecated (since v1.49.0) and replaced by 'unused' + - wsl # too strict and mostly code is not more readable + ### disabled for now... will be enabled 1 by 1 + - dupl + - forcetypeassert + - gosec + - inamedparam + - ireturn + - maintidx + - nolintlint + - paralleltest + - prealloc + - testpackage + - tparallel + - unconvert + - varnamelen + - wrapcheck + ### Disable linters one by one + - gci + - tagalign + - dupword + - gomoddirectives + - gofumpt + - goerr113 + - funlen + - testifylint + - bodyclose + - containedctx + - thelper + - tagliatelle + - errchkjson + - perfsprint + - noctx + - godox + - goconst + + +linters-settings: + stylecheck: + dot-import-whitelist: + - github.com/onsi/ginkgo/v2 + - github.com/onsi/gomega + revive: + enable-all-rules: false + severity: error + rules: + - name: comment-spacings + disabled: true + - name: dot-imports + severity: warning + disabled: true + - name: line-length-limit + severity: warning + disabled: true + arguments: [ 120 ] + funlen: + lines: 80 + cyclop: + max-complexity: 20 + nestif: + min-complexity: 6 + gci: + sections: + - standard # Standard packages. + - default # Imports that could not be matched to another section type. + - prefix(github.com/kyma-project/eventing-manager) # Imports with the specified prefix. + - blank # Blank imports. + - dot # Dot imports. + custom-order: true + skip-generated: true + importas: + no-unaliased: false + no-extra-aliases: true + ## Version number must be added as suffix to the package name. As an example check `k8s.io/api/core/v1` + ## kubernetes APIs get the prefix `k`. As an example check `kcorev1` + ## Eventing Manager APIs get the prefix `em`. As an example check `emeventingv1alpha1` + ## Eventing Publisher Proxy APIs get the prefix `epp`. As an example check `eppapi` + ## Cloud Events APIs get the prefix `ce`. As an example check `ce` + ## Eventing Auth Manager APIs get the prefix `eam`. + ## Kyma Metrics Collector APIs get the prefix `kmc`. + ## NATS Manager APIs get the prefix `nm`. + + alias: + - pkg: "log" + alias: log + - pkg: k8s.io/api/core/v1 + alias: kcorev1 + - pkg: k8s.io/apimachinery/pkg/apis/meta/v1 + alias: kmetav1 + - pkg: k8s.io/client-go/dynamic/fake + alias: kdynamicfake + - pkg: github.com/nats-io/nats.go + alias: natsgo + - pkg: go.opencensus.io/trace/propagation + alias: ocpropagation + - pkg: github.com/kyma-project/eventing-publisher-proxy/testing + alias: epptestingutils + - pkg: github.com/kyma-project/eventing-publisher-proxy/pkg/legacy/api + alias: eppapi + - pkg: github.com/kyma-project/eventing-publisher-proxy/pkg/nats + alias: eppnats + - pkg : github.com/kyma-project/eventing-manager/pkg/logger + alias: emlogger + - pkg: github.com/kyma-project/eventing-manager/api/eventing/v1alpha1 + alias: emeventingv1alpha1 + - pkg: github.com/kyma-project/eventing-manager/api/eventing/v1alpha2 + alias: emeventingv2alpha1 + - pkg : github.com/cloudevents/sdk-go/v2 + alias: ce + - pkg : github.com/cloudevents/sdk-go/v2/protocol/http + alias: cehttp + - pkg : github.com/cloudevents/sdk-go/v2/event + alias: ceevent + - pkg : github.com/cloudevents/sdk-go/v2/client + alias: ceclient + - pkg : github.com/kyma-project/kyma/components/central-application-gateway/pkg/apis/applicationconnector/v1alpha1 + alias: kymaappconnv1alpha1 + + + + ireturn: + allow: + - anon + - error + - empty + - stdlib + - Client + - client.Object + - (or|er)$ + wrapcheck: + ignorePackageGlobs: +issues: + exclude-rules: + - path: "_test\\.go" + linters: + - wrapcheck + - gochecknoglobals + - funlen # Table driven unit and integration tests exceed function length by design + - maintidx # Table driven unit and integration tests exceed maintainability index by design + - linters: + - importas + text: has alias "" which is not part of config # Ignore false positives that emerged due to https://github.com/julz/importas/issues/15. + max-issues-per-linter: 0 + max-same-issues: 0 +output: + sort-results: true +run: + timeout: 15m + skip-files: + - zz_generated.deepcopy.go \ No newline at end of file