From a1963aed804d1d5f2751a13891c6557f17f3967a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20=22Pisco=22=20Fernandes?= Date: Thu, 16 Jan 2025 07:02:54 -0800 Subject: [PATCH] TUN-8866: Add linter to cloudflared repository ## Summary To improve our code, this commit adds a linter that will start checking for issues from this commit onwards, also forcing issues to be fixed on the file changed and not only on the changes themselves. This should help improve our code quality overtime. Closes TUN-8866 --- .golangci.yaml | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++ Makefile | 11 ++++++- README.md | 20 ++++++++++++ cfsetup.yaml | 6 ++-- 4 files changed, 123 insertions(+), 3 deletions(-) create mode 100644 .golangci.yaml diff --git a/.golangci.yaml b/.golangci.yaml new file mode 100644 index 00000000..04900a0e --- /dev/null +++ b/.golangci.yaml @@ -0,0 +1,89 @@ +linters: + enable: + # Some of the linters below are commented out. We should uncomment and start running them, but they return + # too many problems to fix in one commit. Something for later. + - asasalint # Check for pass []any as any in variadic func(...any). + - asciicheck # Checks that all code identifiers does not have non-ASCII symbols in the name. + - bidichk # Checks for dangerous unicode character sequences. + - bodyclose # Checks whether HTTP response body is closed successfully. + - decorder # Check declaration order and count of types, constants, variables and functions. + - dogsled # Checks assignments with too many blank identifiers (e.g. x, , , _, := f()). + - dupl # Tool for code clone detection. + - dupword # Checks for duplicate words in the source code. + - durationcheck # Check for two durations multiplied together. + - errcheck # Errcheck is a program for checking for unchecked errors in Go code. These unchecked errors can be critical bugs in some cases. + - errname # Checks that sentinel errors are prefixed with the Err and error types are suffixed with the Error. + - exhaustive # Check exhaustiveness of enum switch statements. + - gofmt # Gofmt checks whether code was gofmt-ed. By default this tool runs with -s option to check for code simplification. + - goimports # Check import statements are formatted according to the 'goimport' command. Reformat imports in autofix mode. + - gosec # Inspects source code for security problems. + - gosimple # Linter for Go source code that specializes in simplifying code. + - govet # Vet examines Go source code and reports suspicious constructs. It is roughly the same as 'go vet' and uses its passes. + - ineffassign # Detects when assignments to existing variables are not used. + - importas # Enforces consistent import aliases. + - misspell # Finds commonly misspelled English words. + - prealloc # Finds slice declarations that could potentially be pre-allocated. + - promlinter # Check Prometheus metrics naming via promlint. + - sloglint # Ensure consistent code style when using log/slog. + - sqlclosecheck # Checks that sql.Rows, sql.Stmt, sqlx.NamedStmt, pgx.Query are closed. + - staticcheck # It's a set of rules from staticcheck. It's not the same thing as the staticcheck binary. + - tenv # Tenv is analyzer that detects using os.Setenv instead of t.Setenv since Go1.17. + - testableexamples # Linter checks if examples are testable (have an expected output). + - testifylint # Checks usage of github.com/stretchr/testify. + - tparallel # Tparallel detects inappropriate usage of t.Parallel() method in your Go test codes. + - unconvert # Remove unnecessary type conversions. + - unused # Checks Go code for unused constants, variables, functions and types. + - wastedassign # Finds wasted assignment statements. + - whitespace # Whitespace is a linter that checks for unnecessary newlines at the start and end of functions, if, for, etc. + - zerologlint # Detects the wrong usage of zerolog that a user forgets to dispatch with Send or Msg. + # Other linters are disabled, list of all is here: https://golangci-lint.run/usage/linters/ +run: + timeout: 5m + modules-download-mode: vendor + +# output configuration options +output: + formats: + - format: 'colored-line-number' + print-issued-lines: true + print-linter-name: true + +issues: + # Maximum issues count per one linter. + # Set to 0 to disable. + # Default: 50 + max-issues-per-linter: 50 + # Maximum count of issues with the same text. + # Set to 0 to disable. + # Default: 3 + max-same-issues: 15 + # Show only new issues: if there are unstaged changes or untracked files, + # only those changes are analyzed, else only changes in HEAD~ are analyzed. + # It's a super-useful option for integration of golangci-lint into existing large codebase. + # It's not practical to fix all existing issues at the moment of integration: + # much better don't allow issues in new code. + # + # Default: false + new: true + # Show only new issues created after git revision `REV`. + # Default: "" + new-from-rev: ac34f94d423273c8fa8fdbb5f2ac60e55f2c77d5 + # Show issues in any part of update files (requires new-from-rev or new-from-patch). + # Default: false + whole-files: true + # Which dirs to exclude: issues from them won't be reported. + # Can use regexp here: `generated.*`, regexp is applied on full path, + # including the path prefix if one is set. + # Default dirs are skipped independently of this option's value (see exclude-dirs-use-default). + # "/" will be replaced by current OS file path separator to properly work on Windows. + # Default: [] + exclude-dirs: + - vendor + +linters-settings: + # Check exhaustiveness of enum switch statements. + exhaustive: + # Presence of "default" case in switch statements satisfies exhaustiveness, + # even if all enum members are not listed. + # Default: false + default-signifies-exhaustive: true diff --git a/Makefile b/Makefile index c572954a..2e0e82e8 100644 --- a/Makefile +++ b/Makefile @@ -255,4 +255,13 @@ vet: .PHONY: fmt fmt: - goimports -l -w -local github.com/cloudflare/cloudflared $$(go list -mod=vendor -f '{{.Dir}}' -a ./... | fgrep -v tunnelrpc/proto) + @goimports -l -w -local github.com/cloudflare/cloudflared $$(go list -mod=vendor -f '{{.Dir}}' -a ./... | fgrep -v tunnelrpc/proto) + @go fmt $$(go list -mod=vendor -f '{{.Dir}}' -a ./... | fgrep -v tunnelrpc/proto) + +.PHONY: fmt-check +fmt-check: + @./fmt-check.sh + +.PHONY: lint +lint: + @golangci-lint run diff --git a/README.md b/README.md index e0db8dc0..799af254 100644 --- a/README.md +++ b/README.md @@ -56,3 +56,23 @@ Want to test Cloudflare Tunnel before adding a website to Cloudflare? You can do Cloudflare currently supports versions of cloudflared that are **within one year** of the most recent release. Breaking changes unrelated to feature availability may be introduced that will impact versions released more than one year ago. You can read more about upgrading cloudflared in our [developer documentation](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/#updating-cloudflared). For example, as of January 2023 Cloudflare will support cloudflared version 2023.1.1 to cloudflared 2022.1.1. + +## Development + +### Requirements +- [GNU Make](https://www.gnu.org/software/make/) +- [capnp](https://capnproto.org/install.html) +- [cloudflare go toolchain](https://github.com/cloudflare/go) +- Optional tools: + - [capnpc-go](https://pkg.go.dev/zombiezen.com/go/capnproto2/capnpc-go) + - [goimports](https://pkg.go.dev/golang.org/x/tools/cmd/goimports) + - [golangci-lint](https://github.com/golangci/golangci-lint) + +### Build +To build cloudflared locally run `make cloudflared` + +### Test +To locally run the tests run `make test` + +### Linting +To format the code and keep a good code quality use `make fmt` and `make lint` diff --git a/cfsetup.yaml b/cfsetup.yaml index 05ffd20f..7c7ac750 100644 --- a/cfsetup.yaml +++ b/cfsetup.yaml @@ -13,10 +13,14 @@ bullseye: &bullseye - rubygem-fpm - rpm - libffi-dev + - golangci-lint pre-cache: &build_pre_cache - export GOCACHE=/cfsetup_build/.cache/go-build - go install golang.org/x/tools/cmd/goimports@latest post-cache: + # Linting + - make lint + - make fmt-check # Build binary for component test - GOOS=linux GOARCH=amd64 make cloudflared build-linux-fips: @@ -156,7 +160,6 @@ bullseye: &bullseye - export GOOS=linux - export GOARCH=amd64 - export PATH="$HOME/go/bin:$PATH" - - ./fmt-check.sh - make test | gotest-to-teamcity test-fips: build_dir: *build_dir @@ -167,7 +170,6 @@ bullseye: &bullseye - export GOARCH=amd64 - export FIPS=true - export PATH="$HOME/go/bin:$PATH" - - ./fmt-check.sh - make test | gotest-to-teamcity component-test: build_dir: *build_dir