diff --git a/.github/workflows/coder.yaml b/.github/workflows/coder.yaml index 6fd8ae9737331..7ddc3f366a135 100644 --- a/.github/workflows/coder.yaml +++ b/.github/workflows/coder.yaml @@ -28,6 +28,16 @@ permissions: statuses: none jobs: + style-lint-golangci: + name: style/lint/golangci + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: golangci-lint + uses: golangci/golangci-lint-action@v2 + with: + version: latest + style: name: "style/${{ matrix.style }}" runs-on: ubuntu-latest @@ -81,9 +91,17 @@ jobs: with: go-version: "^1.17" - # Check that go is available - # TODO: Implement actual test run - - run: go version + - run: go install gotest.tools/gotestsum@latest + + # Windows is not happy with backslashed commands. + - run: gotestsum --jsonfile="gotests.json" --packages="./..." -- -covermode=atomic -coverprofile="gotests.coverage" + + - uses: codecov/codecov-action@v2 + with: + token: ${{ secrets.CODECOV_TOKEN }} + files: ./gotests.coverage + flags: ${{ matrix.os }} + fail_ci_if_error: true test-js: name: "test/js" diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 0000000000000..140df27953294 --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,258 @@ +# See https://golangci-lint.run/usage/configuration/ +# Over time we should try tightening some of these. + +linters-settings: + gocognit: + min-complexity: 46 # Min code complexity (def 30). + + goconst: + min-len: 4 # Min length of string consts (def 3). + min-occurrences: 3 # Min number of const occurrences (def 3). + + gocritic: + enabled-checks: + # - appendAssign + # - appendCombine + - argOrder + # - assignOp + # - badCall + - badCond + - badLock + - badRegexp + - boolExprSimplify + # - builtinShadow + - builtinShadowDecl + - captLocal + - caseOrder + - codegenComment + # - commentedOutCode + - commentedOutImport + # - commentFormatting + - defaultCaseOrder + - deferUnlambda + # - deprecatedComment + # - docStub + - dupArg + - dupBranchBody + - dupCase + - dupImport + - dupSubExpr + # - elseif + - emptyFallthrough + # - emptyStringTest + # - equalFold + # - evalOrder + # - exitAfterDefer + # - exposedSyncMutex + # - filepathJoin + - flagDeref + - flagName + - hexLiteral + # - httpNoBody + # - hugeParam + # - ifElseChain + # - importShadow + - indexAlloc + - initClause + # - ioutilDeprecated + - mapKey + - methodExprCall + # - nestingReduce + - newDeref + - nilValReturn + # - octalLiteral + - offBy1 + # - paramTypeCombine + # - preferStringWriter + # - preferWriteByte + # - ptrToRefParam + # - rangeExprCopy + # - rangeValCopy + - regexpMust + - regexpPattern + # - regexpSimplify + - ruleguard + - singleCaseSwitch + - sloppyLen + # - sloppyReassign + - sloppyTypeAssert + - sortSlice + # - sprintfQuotedString + - sqlQuery + # - stringConcatSimplify + # - stringXbytes + # - suspiciousSorting + - switchTrue + - truncateCmp + - typeAssertChain + # - typeDefFirst + - typeSwitchVar + # - typeUnparen + - underef + # - unlabelStmt + # - unlambda + # - unnamedResult + # - unnecessaryBlock + # - unnecessaryDefer + # - unslice + - valSwap + - weakCond + # - whyNoLint + # - wrapperFunc + # - yodaStyleExpr + settings: + ruleguard: + failOn: all + rules: "${configDir}/lib/go/lintrules/*.go" + + goimports: + local-prefixes: coder.com,cdr.dev,go.coder.com,github.com/cdr,github.com/coder + + gocyclo: + min-complexity: 50 + + importas: + no-unaliased: true + alias: + - pkg: k8s.io/api/(\w+)/(v[\w\d]+) + alias: ${1}${2} + + - pkg: k8s.io/apimachinery/pkg/apis/meta/(v[\w\d]+) + alias: meta${1} + + - pkg: k8s.io/client-go/kubernetes/typed/(\w+)/(v[\w\d]+) + alias: ${1}${2}client + + - pkg: k8s.io/metrics/pkg/apis/metrics/(v[\w\d]+) + alias: metrics${1} + + - pkg: github.com/docker/docker/api/types + alias: dockertypes + + - pkg: github.com/docker/docker/client + alias: dockerclient + + misspell: + locale: US + + nestif: + min-complexity: 4 # Min complexity of if statements (def 5, goal 4) + + revive: + # see https://github.com/mgechev/revive#available-rules for details. + ignore-generated-header: true + severity: warning + rules: + - name: atomic + - name: bare-return + - name: blank-imports + - name: bool-literal-in-expr + - name: call-to-gc + - name: confusing-naming + - name: confusing-results + - name: constant-logical-expr + - name: context-as-argument + - name: context-keys-type + - name: deep-exit + - name: defer + - name: dot-imports + - name: duplicated-imports + - name: early-return + - name: empty-block + - name: empty-lines + - name: error-naming + - name: error-return + - name: error-strings + - name: errorf + - name: exported + - name: flag-parameter + - name: get-return + - name: identical-branches + - name: if-return + - name: import-shadowing + - name: increment-decrement + - name: indent-error-flow + - name: modifies-parameter + - name: modifies-value-receiver + - name: package-comments + - name: range + - name: range-val-address + - name: range-val-in-closure + - name: receiver-naming + - name: redefines-builtin-id + - name: string-of-int + - name: struct-tag + - name: superfluous-else + - name: time-naming + - name: unconditional-recursion + - name: unexported-naming + - name: unexported-return + - name: unhandled-error + - name: unnecessary-stmt + - name: unreachable-code + - name: unused-parameter + - name: unused-receiver + - name: var-declaration + - name: var-naming + - name: waitgroup-by-value + +issues: + # Rules listed here: https://github.com/securego/gosec#available-rules + exclude-rules: + - path: _test\.go + linters: + # We use assertions rather than explicitly checking errors in tests + - errcheck + + fix: true + max-issues-per-linter: 0 + max-same-issues: 0 + +run: + concurrency: 4 + skip-dirs: + - node_modules + timeout: 5m + +# Over time, add more and more linters from +# https://golangci-lint.run/usage/linters/ as the code improves. +linters: + disable-all: true + enable: + - asciicheck + - bidichk + - bodyclose + - contextcheck + - deadcode + - dogsled + - errcheck + - errname + - errorlint + - exportloopref + - forcetypeassert + - gocritic + - gocyclo + - goimports + - gomodguard + - gosec + - gosimple + - govet + - importas + - ineffassign + # - ireturn + - makezero + - misspell + - nilnil + - noctx + - revive + - rowserrcheck + - sqlclosecheck + - staticcheck + - structcheck + - tenv + - typecheck + - unconvert + - unused + - varcheck + - varnamelen + - wastedassign diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000000..b133181f2da7d --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,15 @@ +{ + "go.lintTool": "golangci-lint", + "go.lintFlags": ["--fast"], + "go.lintOnSave": "package", + "go.coverOnSave": true, + "go.coverageDecorator": { + "type": "gutter", + "coveredHighlightColor": "rgba(64,128,128,0.5)", + "uncoveredHighlightColor": "rgba(128,64,64,0.25)", + "coveredBorderColor": "rgba(64,128,128,0.5)", + "uncoveredBorderColor": "rgba(128,64,64,0.25)", + "coveredGutterStyle": "blockgreen", + "uncoveredGutterStyle": "blockred" + } +} diff --git a/cmd/coder/main.go b/cmd/coder/main.go new file mode 100644 index 0000000000000..b1b14d0c797c1 --- /dev/null +++ b/cmd/coder/main.go @@ -0,0 +1,7 @@ +package main + +import "fmt" + +func main() { + fmt.Println("Hello World!") +} diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 0000000000000..e7e51257c0e96 --- /dev/null +++ b/codecov.yml @@ -0,0 +1,20 @@ +codecov: + require_ci_to_pass: false + +comment: + show_carryforward_flags: yes + +coverage: + notify: + slack: + default: + url: secret:v1::ALa1/e2X+k36fPseab5D7+kBFc9bJyIoIQioD0IMA5jr+0HXVpBRNDCHZhHjCdGc67yff6PPixPEOLwEZpxC37rM23RBZOYlqAq9A5e0MeZVlEoVq19aOYN4Xel17hMJ6GGm7n17wrYpCpcvlVSqNrN0+cr3guVDyG10kQyfh2Y= + threshold: 1% + only_pulls: false + branches: + - "main" + status: + project: + default: + target: 80% + informational: yes diff --git a/go.mod b/go.mod new file mode 100644 index 0000000000000..ff7eaabf436fb --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module github.com/coder/coder + +go 1.17
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: