From 25a5338fb19f67814c6261f5677c47035ee2e1b0 Mon Sep 17 00:00:00 2001 From: Blake Gentry Date: Sat, 20 Apr 2024 20:27:30 -0500 Subject: [PATCH] WIP on CI flow --- .github/workflows/ci.yml | 204 +++++++++++++++++++++++++++++++++++++++ .golangci.yml | 95 ++++++++++++++++++ Makefile | 16 +++ ui/package.json | 20 ++-- 4 files changed, 325 insertions(+), 10 deletions(-) create mode 100644 .github/workflows/ci.yml create mode 100644 .golangci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..7f01cfc --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,204 @@ +name: CI + +env: + # Database to connect to that can create other databases with `CREATE DATABASE`. + ADMIN_DATABASE_URL: postgres://postgres:postgres@localhost:5432 + + # A suitable URL for the test database. + DATABASE_URL: postgres://postgres:postgres@127.0.0.1:5432/riverui_dev?sslmode=disable + +on: + push: + branches: + - master + pull_request: + +jobs: + go_build_and_test: + name: Go build and test + runs-on: ubuntu-latest + strategy: + matrix: + go-version: + - "1.22" + postgres-version: [16, 15] + fail-fast: false + timeout-minutes: 5 + + services: + postgres: + image: postgres:${{ matrix.postgres-version }} + env: + POSTGRES_PASSWORD: postgres + options: >- + --health-cmd pg_isready + --health-interval 2s + --health-timeout 5s + --health-retries 5 + ports: + - 5432:5432 + + steps: + - uses: actions/checkout@v4 + + - name: Setup Go ${{ matrix.go-version }} + uses: actions/setup-go@v5 + with: + go-version: ${{ matrix.go-version }} + + - name: Display Go version + run: go version + + - name: Install dependencies + run: | + echo "::group::go get" + go get -t ./... + echo "::endgroup::" + + - name: Install River CLI + run: go install github.com/riverqueue/river/cmd/river@latest + + - name: Create test DB + run: createdb riverui_dev + env: + PGHOST: 127.0.0.1 + PGUSER: postgres + PGPASSWORD: postgres + + - name: Migrate test DB + run: river migrate-up --database-url "$DATABASE_URL" + + # ensure that there is a file in `ui/dist` to prevent a lint error about + # it during CI when there is nothing there: + - name: touch file in ui/dist + run: mkdir -p ui/dist && touch ui/dist/keepfile.txt + + - name: Test + working-directory: . + run: go test -race ./... -timeout 2m + + golangci: + name: Go lint + runs-on: ubuntu-latest + env: + GOLANGCI_LINT_VERSION: v1.56 + permissions: + contents: read + # allow read access to pull request. Use with `only-new-issues` option. + pull-requests: read + + steps: + - uses: actions/setup-go@v5 + with: + go-version: "stable" + check-latest: true + + - name: Checkout + uses: actions/checkout@v4 + + # ensure that there is a file in `ui/dist` to prevent a lint error about + # it during CI when there is nothing there: + - name: touch file in ui/dist + run: mkdir -p ui/dist && touch ui/dist/keepfile.txt + + - name: Lint + uses: golangci/golangci-lint-action@v4 + with: + # golangci-lint needs to be run separately for every Go module, and + # its GitHub Action doesn't provide any way to do that. Have it fetch + # the golangci-lint binary, trick it into not running by sending only + # `--help`, then run the full set of lints below. DO NOT run separate + # modules as separate golangci-lint-action steps. Its post run caching + # can be extremely slow, and that's amplified in a very painful way if + # it needs to be run multiple times. + args: --help + version: ${{ env.GOLANGCI_LINT_VERSION }} + + - name: Run lint + run: make lint + + sqlc_generate: + runs-on: ubuntu-latest + timeout-minutes: 2 + name: sqlc generate + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup sqlc + uses: sqlc-dev/setup-sqlc@v4 + with: + sqlc-version: "1.25.0" + + - name: Run sqlc diff + run: | + echo "Please make sure that all sqlc changes are checked in!" + make verify + + # js_build_and_test: + # runs-on: ubuntu-latest + # timeout-minutes: 5 + + # env: + # NODE_ENV: test + + # permissions: + # contents: read + + js_lint: + name: JS Lint + runs-on: ubuntu-latest + strategy: + matrix: + node-version: + - "20.12.2" + fail-fast: false + timeout-minutes: 5 + defaults: + run: + working-directory: ui + + env: + NODE_ENV: test + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + cache: "npm" + cache-dependency-path: ui/package-lock.json + node-version: ${{ matrix.node-version }} + + - name: Install dependencies + run: npm install + shell: sh + + - name: Cache ESLint + id: cache-eslint + uses: actions/cache@v4 + with: + path: .eslintcache + key: eslint-v1-${{ runner.os }}-${{ matrix.node-version }}-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + eslint-v1-${{ runner.os }}-${{ matrix.node-version }}- + + - name: Cache Prettier + id: cache-prettier + uses: actions/cache@v4 + with: + path: node_modules/.cache/prettier + key: prettier-v1-${{ runner.os }}-${{ matrix.node-version }}-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + prettier-v1-${{ runner.os }}-${{ matrix.node-version }}-prettier- + + - name: Run ESLint ✨ + run: npm run lint + + - name: Run TSC 🔧 + run: npm run tsc + # Check tsc compilation even if there were linting issues: + if: always() diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 0000000..84c8c67 --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,95 @@ +issues: + exclude: + - 'Error return value of .(\w+\.Rollback(.*)). is not checked' + +linters: + presets: + - bugs + - comment + - format + - performance + - style + - test + - unused + + disable: + # disabled, but which we should enable with discussion + - wrapcheck # checks that errors are wrapped; currently not done anywhere + + # disabled because we're not compliant, but which we should think about + - exhaustruct # checks that properties in structs are exhaustively defined; may be a good idea + - testpackage # requires tests in test packages like `river_test` + + # disabled because they're annoying/bad + - interfacebloat # we do in fact want >10 methods on the Adapter interface or wherever we see fit. + - godox # bans TODO statements; total non-starter at the moment + - goerr113 # wants all errors to be defined as variables at the package level; quite obnoxious + - gomnd # detects "magic numbers", which it defines as any number; annoying + - ireturn # bans returning interfaces; questionable as is, but also buggy as hell; very, very annoying + - lll # restricts maximum line length; annoying + - nlreturn # requires a blank line before returns; annoying + - wsl # a bunch of style/whitespace stuff; annoying + +linters-settings: + depguard: + rules: + all: + files: ["$all"] + allow: + deny: + - desc: "Use `github.com/google/uuid` package for UUIDs instead." + pkg: "github.com/xtgo/uuid" + + forbidigo: + forbid: + - msg: "Use `require` variants instead." + p: '^assert\.' + - msg: "Use `Func` suffix for function variables instead." + p: 'Fn\b' + - msg: "Use built-in `max` function instead." + p: '\bmath\.Max\b' + - msg: "Use built-in `min` function instead." + p: '\bmath\.Min\b' + + gci: + sections: + - Standard + - Default + - Prefix(github.com/riverqueue) + + gomoddirectives: + replace-local: true + + gosec: + excludes: + - G404 # use of non-crypto random; overly broad for our use case + + revive: + rules: + - name: unused-parameter + disabled: true + + tagliatelle: + case: + rules: + json: snake + + testifylint: + enable-all: true + disable: + - go-require + + varnamelen: + ignore-names: + - db + - eg + - f + - i + - id + - j + - mu + - sb # common convention for string builder + - t + - tt # common convention for table tests + - tx + - wg diff --git a/Makefile b/Makefile index 0a9bf7b..ce4ae02 100644 --- a/Makefile +++ b/Makefile @@ -5,3 +5,19 @@ generate: generate/sqlc .PHONY: generate/sqlc generate/sqlc: cd internal/db && sqlc generate + +.PHONY: lint +lint: + cd . && golangci-lint run --fix + +.PHONY: test +test: + cd . && go test ./... + +.PHONY: verify +verify: +verify: verify/sqlc + +.PHONY: verify/sqlc +verify/sqlc: + cd internal/db && sqlc diff diff --git a/ui/package.json b/ui/package.json index 3ab50f6..dbc992c 100644 --- a/ui/package.json +++ b/ui/package.json @@ -3,16 +3,6 @@ "private": true, "version": "0.0.0", "type": "module", - "scripts": { - "dev": "vite", - "build": "tsc && vite build", - "fmt": "eslint . --fix --report-unused-disable-directives --max-warnings 0", - "lint": "eslint . --report-unused-disable-directives --max-warnings 0", - "preview": "vite preview", - "test": "vitest", - "storybook": "storybook dev -p 6006", - "build-storybook": "storybook build" - }, "dependencies": { "@dagrejs/dagre": "^1.0.4", "@headlessui/react": "^1.7.17", @@ -66,5 +56,15 @@ "vite": "^5.0.4", "vite-tsconfig-paths": "^4.2.1", "vitest": "^1.2.2" + }, + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "fmt": "eslint . --fix --report-unused-disable-directives --max-warnings 0", + "lint": "eslint --cache --quiet . && prettier --cache --log-level=warn -l --report-unused-disable-directives --max-warnings 0 .", + "preview": "vite preview", + "test": "vitest", + "storybook": "storybook dev -p 6006", + "build-storybook": "storybook build" } }