diff options
Diffstat (limited to '.github/workflows')
-rw-r--r-- | .github/workflows/compliance.yml | 20 | ||||
-rwxr-xr-x | .github/workflows/compliance/anonymize-license.pl | 11 | ||||
-rwxr-xr-x | .github/workflows/compliance/check-licenses.sh | 72 | ||||
-rwxr-xr-x | .github/workflows/compliance/ls-deps.pl | 24 | ||||
-rw-r--r-- | .github/workflows/docker.yml | 21 | ||||
-rw-r--r-- | .github/workflows/go.yml | 108 | ||||
-rw-r--r-- | .github/workflows/integration-tests.yml | 55 | ||||
-rw-r--r-- | .github/workflows/sql.yml | 58 | ||||
-rw-r--r-- | .github/workflows/version.yml | 25 |
9 files changed, 394 insertions, 0 deletions
diff --git a/.github/workflows/compliance.yml b/.github/workflows/compliance.yml new file mode 100644 index 0000000..c094754 --- /dev/null +++ b/.github/workflows/compliance.yml @@ -0,0 +1,20 @@ +name: Compliance +on: + push: + branches: + - master + pull_request: {} + +jobs: + licenses: + runs-on: ubuntu-latest + steps: + - run: sudo apt install -y moreutils + + - uses: actions/setup-go@v2 + with: + go-version: 1.18.x + + - uses: actions/checkout@v2 + + - run: .github/workflows/compliance/check-licenses.sh diff --git a/.github/workflows/compliance/anonymize-license.pl b/.github/workflows/compliance/anonymize-license.pl new file mode 100755 index 0000000..573eba6 --- /dev/null +++ b/.github/workflows/compliance/anonymize-license.pl @@ -0,0 +1,11 @@ +#!/usr/bin/perl -pi + +use warnings; +use strict; +use autodie qw(:all); + +if (/^ ?(?:\w+ )?Copyright / || /^All rights reserved\.$/ || /^(?:The )?\S+ License(?: \(.+?\))?$/ || /^$/) { + $_ = "" +} + +s/Google Inc\./the copyright holder/g diff --git a/.github/workflows/compliance/check-licenses.sh b/.github/workflows/compliance/check-licenses.sh new file mode 100755 index 0000000..63ff76f --- /dev/null +++ b/.github/workflows/compliance/check-licenses.sh @@ -0,0 +1,72 @@ +#!/bin/bash + +set -eo pipefail + +find_license_file() { + MOD_NAME="$1" + LICENSE_DIR="vendor/$MOD_NAME" + LICENSE_FILES=({,../}{,UN}LICENSE{,.txt,.md}) + + for LICENSE_FILE in "${LICENSE_FILES[@]}"; do + LICENSE_FILE="${LICENSE_DIR}/$LICENSE_FILE" + + if [ -e "$LICENSE_FILE" ]; then + echo "$LICENSE_FILE" + return + fi + done + + echo "Module ${MOD_NAME}: license file missing in ${LICENSE_DIR}. Tried:" "${LICENSE_FILES[@]}" >&2 + false +} + +list_all_deps() { + for MAIN_MOD in ./cmd/*; do + go list -deps "$MAIN_MOD" + done +} + +COMPATIBLE_LINE=$(($LINENO + 2)) + +COMPATIBLE=( + # public domain + 3cee2c43614ad4572d9d594c81b9348cf45ed5ac # vendor/github.com/vbauerster/mpb/v6/UNLICENSE + # MIT + 66d504eb2f162b9cbf11b07506eeed90c6edabe1 # vendor/github.com/cespare/xxhash/v2/LICENSE.txt + 1513ff663e946fdcadb630bed670d253b8b22e1e # vendor/github.com/davecgh/go-spew/spew/../LICENSE + 90a1030e6314df9a898e5bfbdb4c6176d0a1f81c # vendor/github.com/jmoiron/sqlx/LICENSE + # BSD-2 + 8762249b76928cb6995b98a95a9396c5aaf104f3 # vendor/github.com/go-redis/redis/v8/LICENSE + d550c89174b585d03dc67203952b38372b4ce254 # vendor/github.com/pkg/errors/LICENSE + # BSD-3 + b23b967bba92ea3c5ccde9962027cd70400865eb # vendor/github.com/google/uuid/LICENSE + 604b38b184689a3db06a0617216d52a95aea10d8 # vendor/github.com/pmezard/go-difflib/difflib/../LICENSE + # MPLv2 + 0a2b84dd9b124c4d95dd24418c3e84fd870cc0ac # vendor/github.com/go-sql-driver/mysql/LICENSE +) + +MY_DIR="$(dirname "$0")" + +go mod vendor + +for MOD_NAME in $(list_all_deps | "${MY_DIR}/ls-deps.pl"); do + LICENSE_FILE="$(find_license_file "$MOD_NAME")" + + "${MY_DIR}/anonymize-license.pl" "$LICENSE_FILE" + tr -d ., <"$LICENSE_FILE" | tr \\n\\t ' ' | sponge "$LICENSE_FILE" + perl -p0 -i -e 's/ +/ /g; s/ +$//; $_ = lc' "$LICENSE_FILE" + + for SHA1 in "${COMPATIBLE[@]}"; do + if sha1sum -c <<<"$SHA1 $LICENSE_FILE" >/dev/null 2>&1; then + continue 2 + fi + done + + echo "Module ${MOD_NAME}: unknown license. Run 'go mod vendor' (or see below), verify by yourself whether" \ + "$LICENSE_FILE is GPLv2 compatible and (if yes) update the license text hashes list at ${0}:$COMPATIBLE_LINE" \ + "and eventually .github/workflows/compliance/anonymize-license.pl:7" >&2 + + sha1sum "$LICENSE_FILE" + head "$LICENSE_FILE" + false +done diff --git a/.github/workflows/compliance/ls-deps.pl b/.github/workflows/compliance/ls-deps.pl new file mode 100755 index 0000000..a7a033a --- /dev/null +++ b/.github/workflows/compliance/ls-deps.pl @@ -0,0 +1,24 @@ +#!/usr/bin/perl + +use warnings; +use strict; +use autodie qw(:all); + +my @mods = <>; +chomp @mods; +s~^vendor/~~ for @mods; + +@mods = grep m~^[^./]+\.~, @mods; +@mods = grep !m~^golang\.org/x(?:/|$)~, @mods; +@mods = grep !m~^github\.com/icinga/icingadb(?:/|$)~, @mods; +@mods = sort @mods; + +my $lastMod = undef; + +for (@mods) { + # prefixed with last mod (e.g. "go.uber.org/zap/buffer" after "go.uber.org/zap"), so redundant + next if defined($lastMod) && /$lastMod/; + + $lastMod = '^' . quotemeta("$_/"); + print "$_\n" +} diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml new file mode 100644 index 0000000..1469426 --- /dev/null +++ b/.github/workflows/docker.yml @@ -0,0 +1,21 @@ +name: Docker image + +on: + pull_request: {} + push: + branches: + - master + release: + types: + - published + +jobs: + docker: + runs-on: ubuntu-latest + + steps: + - name: Docker image + uses: Icinga/docker-icingadb@master + env: + INPUT_TOKEN: '${{ github.token }}' + DOCKER_HUB_PASSWORD: '${{ secrets.DOCKER_HUB_PERSONAL_TOKEN }}' diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml new file mode 100644 index 0000000..de15521 --- /dev/null +++ b/.github/workflows/go.yml @@ -0,0 +1,108 @@ +name: Go +on: + push: + branches: + - master + pull_request: {} + +jobs: + build-test: + + strategy: + matrix: + os: [ macos-latest, ubuntu-latest ] + runs-on: ${{ matrix.os }} + + steps: + - uses: actions/checkout@v2 + + - uses: actions/setup-go@v2 + with: + go-version: 1.18.x + + - run: go build -gcflags="-m" ./... + + - run: go test -v -race ./... + + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - uses: actions/setup-go@v2 + with: + go-version: 1.18.x + + - uses: dominikh/staticcheck-action@29e9b80fb8de0521ba4ed3fdf68fed5bbe82a2d2 # v1.1.0 + with: + install-go: false + + vet: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - uses: actions/setup-go@v2 + with: + go-version: 1.18.x + + - run: go vet ./... + + fmt: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - uses: actions/setup-go@v2 + with: + go-version: 1.18.x + + - name: Run gofmt -d . + run: | + fmtvar="$(gofmt -d .)" + echo "$fmtvar" + test -z "$fmtvar" + + modtidy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - uses: actions/setup-go@v2 + with: + go-version: 1.18.x + + - name: Run go mod tidy + run: | + go mod tidy + gitdiff="$(git diff -U0)" + echo "$gitdiff" + test -z "$gitdiff" + + vendor-diff: + if: github.event_name == 'pull_request' + runs-on: ubuntu-latest + steps: + - uses: actions/setup-go@v3 + with: + go-version: ^1.18 + + - name: Checkout base commit + uses: actions/checkout@v3 + with: + path: a + ref: ${{ github.base_ref }} + - name: Download dependencies of base commit + run: go mod vendor + working-directory: a + + - name: Checkout PR + uses: actions/checkout@v3 + with: + path: b + - name: Download dependencies of PR + run: go mod vendor + working-directory: b + + - name: Diff of dependencies + run: diff -ur --color=always a/vendor b/vendor || true diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml new file mode 100644 index 0000000..dff8112 --- /dev/null +++ b/.github/workflows/integration-tests.yml @@ -0,0 +1,55 @@ +name: Integration Tests + +on: + push: + branches: + - master + pull_request: {} + schedule: + - cron: '57 3 * * *' + +jobs: + integration-tests: + strategy: + fail-fast: false + matrix: + database: + - name: mysql + pretty_name: MySQL + - name: pgsql + pretty_name: PostgreSQL + + name: ${{ matrix.database.pretty_name }} + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Setup Go + uses: actions/setup-go@v2 + with: + go-version: '^1.18' + - name: Build Icinga DB + run: go build ./cmd/icingadb + env: + CGO_ENABLED: 0 + - name: Build Integration Tests + run: go test -o ../icingadb-test -c . + working-directory: tests/ + - name: Run Integration Tests + run: ./icingadb-test -icingatesting.debuglog debug.log -test.v + env: + ICINGADB_TESTS_DATABASE_TYPE: ${{ matrix.database.name }} + ICINGA_TESTING_ICINGADB_BINARY: ${{ github.workspace }}/icingadb + ICINGA_TESTING_ICINGADB_SCHEMA_MYSQL: ${{ github.workspace }}/schema/mysql/schema.sql + ICINGA_TESTING_ICINGADB_SCHEMA_PGSQL: ${{ github.workspace }}/schema/pgsql/schema.sql + - name: Compress Debug Log + if: ${{ always() }} + run: xz -9 debug.log + - name: Upload Debug Log + if: ${{ always() }} + uses: actions/upload-artifact@v2 + with: + name: ${{ matrix.database.name }}-debug.log.xz + path: debug.log.xz + retention-days: 1 diff --git a/.github/workflows/sql.yml b/.github/workflows/sql.yml new file mode 100644 index 0000000..c5e4304 --- /dev/null +++ b/.github/workflows/sql.yml @@ -0,0 +1,58 @@ +name: SQL + +on: + push: + branches: + - master + pull_request: {} + +jobs: + sql: + name: ${{ matrix.database.name }} + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + database: + - {type: MYSQL, name: MySQL 5.5, image: "icinga/icingadb-mysql:5.5"} + - {type: MYSQL, name: MySQL 5.6, image: "icinga/icingadb-mysql:5.6"} + - {type: MYSQL, name: MySQL 5.7, image: "mysql:5.7"} + - {type: MYSQL, name: MySQL latest, image: "mysql:latest"} + - {type: MYSQL, name: MariaDB 10.1, image: "mariadb:10.1"} + - {type: MYSQL, name: MariaDB 10.2, image: "mariadb:10.2"} + - {type: MYSQL, name: MariaDB 10.3, image: "mariadb:10.3"} + - {type: MYSQL, name: MariaDB 10.4, image: "mariadb:10.4"} + - {type: MYSQL, name: MariaDB 10.5, image: "mariadb:10.5"} + - {type: MYSQL, name: MariaDB 10.6, image: "mariadb:10.6"} + - {type: MYSQL, name: MariaDB 10.7, image: "mariadb:10.7"} + - {type: MYSQL, name: MariaDB latest, image: "mariadb:latest"} + - {type: PGSQL, name: PostgreSQL 9.6, image: "postgres:9.6"} + - {type: PGSQL, name: PostgreSQL 10, image: "postgres:10"} + - {type: PGSQL, name: PostgreSQL 11, image: "postgres:11"} + - {type: PGSQL, name: PostgreSQL 12, image: "postgres:12"} + - {type: PGSQL, name: PostgreSQL 13, image: "postgres:13"} + - {type: PGSQL, name: PostgreSQL latest, image: "postgres:latest"} + + steps: + - name: Setup Go + uses: actions/setup-go@v1 + with: + go-version: '^1.16' + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Download dependencies + run: go get -v -t -d ./... + working-directory: tests/ + + - name: Run tests + env: + ICINGADB_TESTS_DATABASE_TYPE: ${{ matrix.database.type }} + ICINGA_TESTING_${{ matrix.database.type }}_IMAGE: ${{ matrix.database.image }} + ICINGA_TESTING_ICINGADB_SCHEMA_MYSQL: ${{ github.workspace }}/schema/mysql/schema.sql + ICINGA_TESTING_ICINGADB_SCHEMA_PGSQL: ${{ github.workspace }}/schema/pgsql/schema.sql + timeout-minutes: 10 + run: go test -v -timeout 5m ./sql + working-directory: tests/ diff --git a/.github/workflows/version.yml b/.github/workflows/version.yml new file mode 100644 index 0000000..98d28c0 --- /dev/null +++ b/.github/workflows/version.yml @@ -0,0 +1,25 @@ +name: Version +on: + push: + branches: + - master + pull_request: {} + +jobs: + version: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + - uses: actions/setup-go@v2 + with: + go-version: 1.18.x + - name: Check version + # TODO(elippmann): Needs adjustments as soon as we release from (support) branches too. + run: | + actual="$(go run cmd/icingadb/main.go --version | head -n1 | sed 's/Icinga DB version: \(.*\)/v\1/')" + expected="$(git describe --tags $(git rev-list --tags --max-count=1))" + echo "Actual version: $actual" + echo "Expected version: $expected" + test "$actual" = "$expected" || (echo "Versions do not match"; (exit 1)) |