Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CI #1

Merged
merged 3 commits into from
May 3, 2024
Merged

CI #1

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
198 changes: 198 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,198 @@
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:[email protected]: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: ui/.eslintcache
key: eslint-v1-${{ runner.os }}-${{ matrix.node-version }}-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
eslint-v1-${{ runner.os }}-${{ matrix.node-version }}-

- name: Run ESLint ✨
run: npm run lint

- name: Run TSC 🔧
run: npm exec tsc
# Check tsc compilation even if there were linting issues:
if: always()

- name: Build 🏗️
run: npm exec vite build
92 changes: 92 additions & 0 deletions .golangci.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
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

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
- rw # common for http.ResponseWriter
- sb # common convention for string builder
- t
- tt # common convention for table tests
- tx
- wg
95 changes: 95 additions & 0 deletions .golangci.yml
Original file line number Diff line number Diff line change
@@ -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
Loading
Loading