Skip to content

Commit

Permalink
initial import
Browse files Browse the repository at this point in the history
Co-authored-by: Brandur Leach <brandur@brandur.org>
  • Loading branch information
bgentry and brandur committed Nov 8, 2023
0 parents commit 5620728
Show file tree
Hide file tree
Showing 139 changed files with 22,353 additions and 0 deletions.
16 changes: 16 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates

version: 2
updates:
- package-ecosystem: "gomod"
directory: "/" # Location of package manifests
groups:
go-dependencies:
update-types:
- "minor"
- "patch"
schedule:
interval: "weekly"
212 changes: 212 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,212 @@
name: CI

env:
# Database to connect to that can create other databases with `CREATE DATABASE`.
ADMIN_DATABASE_URL: postgres://postgres:postgres@localhost:5432

# Just a common place for steps to put binaries they need and which is added
# to GITHUB_PATH/PATH.
BIN_PATH: /home/runner/bin

# A suitable URL for non-test database.
DATABASE_URL: postgres://postgres:postgres@127.0.0.1:5432/river_dev?sslmode=disable

on:
- push

jobs:
build_and_test:
runs-on: ubuntu-latest
strategy:
matrix:
go-version:
- "1.21"
timeout-minutes: 5

services:
postgres:
image: postgres
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@v3

- name: Setup Go ${{ matrix.go-version }}
uses: actions/setup-go@v4
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: Set up test DBs
run: go run ./internal/cmd/testdbman create
env:
PGHOST: 127.0.0.1
PGPORT: 5432
PGUSER: postgres
PGPASSWORD: postgres
PGSSLMODE: disable

- name: Test
run: go test -p 1 -race ./...
env:
TEST_DATABASE_URL: postgres://postgres:postgres@127.0.0.1:5432/river_testdb?sslmode=disable

cli:
runs-on: ubuntu-latest
timeout-minutes: 3

services:
postgres:
image: postgres
env:
POSTGRES_PASSWORD: postgres
options: >-
--health-cmd pg_isready
--health-interval 2s
--health-timeout 5s
--health-retries 5
ports:
- 5432:5432

steps:
- uses: actions/setup-go@v4
with:
go-version: "stable"
check-latest: true

- name: Checkout
uses: actions/checkout@v3

- name: Build CLI
run: go build ./cmd/river

- name: Create database
run: psql --echo-errors --quiet -c '\timing off' -c "CREATE DATABASE river_dev;" ${ADMIN_DATABASE_URL}

- name: river migrate-up
run: ./river migrate-up --database-url $DATABASE_URL

- name: river migrate-down
run: ./river migrate-down --database-url $DATABASE_URL --max-steps 100

golangci:
name: lint
runs-on: ubuntu-latest
permissions:
contents: read
# allow read access to pull request. Use with `only-new-issues` option.
pull-requests: read
steps:
- uses: actions/setup-go@v4
with:
go-version: "stable"
check-latest: true

- name: Checkout
uses: actions/checkout@v3

- name: golangci-lint
uses: golangci/golangci-lint-action@v3
with:
# Optional: show only new issues if it's a pull request. The default value is `false`.
only-new-issues: true

version: v1.54.2

producer_sample:
runs-on: ubuntu-latest
timeout-minutes: 2

services:
postgres:
image: postgres
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@v3

- name: Setup Go ${{ matrix.go-version }}
uses: actions/setup-go@v4
with:
go-version: "stable"
check-latest: true

- name: Display Go version
run: go version

- name: Install dependencies
run: |
echo "::group::go get"
go get -t ./...
echo "::endgroup::"
- name: Build CLI
run: go build ./cmd/river

- name: Create database
run: psql --echo-errors --quiet -c '\timing off' -c "CREATE DATABASE river_dev;" ${ADMIN_DATABASE_URL}

- name: river migrate-up
run: ./river migrate-up --database-url $DATABASE_URL

- name: Build producersample
run: go build ./internal/cmd/producersample

- name: Run producersample
run: |
( sleep 5 && killall -SIGTERM producersample ) &
./producersample
sqlc_generates:
runs-on: ubuntu-latest
timeout-minutes: 2

env:
SQLC_VERSION: 1.22.0

steps:
- name: Create BIN_PATH and add to PATH
run: |
mkdir -p "$BIN_PATH"
echo "$BIN_PATH" >> $GITHUB_PATH
- name: Install sqlc
run: |
curl -L https://github.com/kyleconroy/sqlc/releases/download/v${{ env.SQLC_VERSION }}/sqlc_${{ env.SQLC_VERSION }}_linux_amd64.tar.gz | tar -xz -C $BIN_PATH
chmod +x $BIN_PATH/sqlc
- name: Checkout
uses: actions/checkout@v3

- name: Run sqlc
run: make generate

- name: Check git diff
working-directory: ./internal/dbsqlc
run: |
echo "Please make sure that all sqlc changes are checked in!"
git diff --exit-code .
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/river
/internal/cmd/riverbench/riverbench
/internal/cmd/producersample/producersample
/internal/cmd/testdbman/testdbman
93 changes: 93 additions & 0 deletions .golangci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
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"
not-test:
files: ["!$test"]
deny:
- desc: "Don't use `dbadaptertest` package outside of test environments."
pkg: "github.com/riverqueue/river/internal/dbadaptertest"
- desc: "Don't use `riverinternaltest` package outside of test environments."
pkg: "github.com/riverqueue/river/internal/riverinternaltest"

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)

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

varnamelen:
ignore-names:
- db
- eg
- f
- i
- id
- j
- mu
- t
- tt # common convention for table tests
- tx
- wg
7 changes: 7 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
.PHONY: generate
generate:
generate: generate/sqlc

.PHONY: generate/sqlc
generate/sqlc:
cd internal/dbsqlc && sqlc generate
28 changes: 28 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# River

River is an experimental Postgres queue for Go.

## Development

### Run tests

Raise test databases:

go run ./internal/cmd/testdbman create

Run tests:

go test ./...

### Run lint

Run the linter and try to autofix:

golangci-lint run --fix

### Generate sqlc

The project uses sqlc (`brew install sqlc`) to generate Go targets for Postgres
queries. After changing an sqlc `.sql` file, generate Go with:

make generate
Loading

0 comments on commit 5620728

Please sign in to comment.