Skip to content

PR(CI): Split matrix into smaller chunks #7

PR(CI): Split matrix into smaller chunks

PR(CI): Split matrix into smaller chunks #7

# Copyright 2024 Democratized Data Foundation
#
# Use of this software is governed by the Business Source License
# included in the file licenses/BSL.txt.
#
# As of the Change Date specified in that file, in accordance with
# the Business Source License, use of this software will be governed
# by the Apache License, Version 2.0, included in the file
# licenses/APL.txt.
name: Test And Upload Coverage Workflow
on:
pull_request:
branches:
- master
- develop
- Develop
push:
tags:
- 'v[0-9]+.[0-9]+.[0-9]+'
branches:
- master
- develop
# Default environment configuration settings.
env:
CGO_ENABLED: 1
DEFRA_CLIENT_GO: true
DEFRA_CLIENT_HTTP: false
DEFRA_CLIENT_CLI: false
DEFRA_BADGER_MEMORY: true
DEFRA_BADGER_FILE: false
DEFRA_BADGER_ENCRYPTION: false
DEFRA_MUTATION_TYPE: collection-save
DEFRA_LENS_TYPE: wasm-time
DEFRA_ACP_TYPE: local
DEFRA_VIEW_TYPE: cacheless
# We run all runners via the bash shell to provide us with a consistent set of env variables and commands
defaults:
run:
shell: bash
jobs:
# The basic matrix job tests the combination of client, database and mutation types using
# the default config settings for other options, all running on linux.
test-basic:
name: Test job
strategy:
fail-fast: false
matrix:
client-type: [go, http, cli]
database-type: [badger-file, badger-memory]
mutation-type: [gql, collection-named, collection-save]
runs-on: ubuntu-latest
# Overwrite the defaults based on the basic matrix
env:
DEFRA_CLIENT_GO: ${{ matrix.client-type == 'go' }}
DEFRA_CLIENT_HTTP: ${{ matrix.client-type == 'http' }}
DEFRA_CLIENT_CLI: ${{ matrix.client-type == 'cli' }}
DEFRA_BADGER_MEMORY: ${{ matrix.database-type == 'badger-memory' }}
DEFRA_BADGER_FILE: ${{ matrix.database-type == 'badger-file' }}
DEFRA_MUTATION_TYPE: ${{ matrix.mutation-type }}
steps:
- name: Checkout code into the directory
uses: actions/checkout@v4
- name: Setup defradb
uses: ./.github/composites/setup-defradb
- name: Run integration tests
run: make test:coverage
- name: Upload coverage artifact
uses: actions/upload-artifact@v4
with:
# Make sure the name is always unique per job as artifacts are now immutable.
# Note Issue: https://github.com/actions/upload-artifact/issues/478
# Solve: https://github.com/actions/upload-artifact/issues/478#issuecomment-1885470013
name: "coverage_basic\
_${{ matrix.client-type }}\
_${{ matrix.database-type }}\
_${{ matrix.mutation-type }}\
"
path: coverage.txt
if-no-files-found: error
retention-days: 7
# The source-hub matrix job tests the combinations of source-hub acp and client types on linux.
test-source-hub:
name: Test source-hub job
strategy:
fail-fast: false
matrix:
client-type: [go, http, cli]
runs-on: ubuntu-latest
env:
DEFRA_ACP_TYPE: source-hub
DEFRA_CLIENT_GO: ${{ matrix.client-type == 'go' }}
DEFRA_CLIENT_HTTP: ${{ matrix.client-type == 'http' }}
DEFRA_CLIENT_CLI: ${{ matrix.client-type == 'cli' }}
steps:
- name: Checkout code into the directory
uses: actions/checkout@v4
- name: Setup defradb
uses: ./.github/composites/setup-defradb
# We have to checkout the source-hub repo and install it ourselves because it
# contains replace commands in its go.mod file.
- name: Checkout sourcehub code into the directory
uses: actions/checkout@v4
with:
repository: sourcenetwork/sourcehub
path: _sourceHub
# Lock the sourcehub version until the dev branch is stable
# remove this when closed https://github.com/sourcenetwork/defradb/issues/2865
ref: c232133c35c96924509a4d955a7b450eb3624a15
- name: Install SourceHub CLI
working-directory: _sourceHub
run: make install
- name: Run integration tests
run: make test:coverage
- name: Upload coverage artifact
uses: actions/upload-artifact@v4
with:
# Make sure the name is always unique per job as artifacts are now immutable.
# Note Issue: https://github.com/actions/upload-artifact/issues/478
# Solve: https://github.com/actions/upload-artifact/issues/478#issuecomment-1885470013
name: "coverage_source-hub\
_${{ matrix.client-type }}\
"
path: coverage.txt
if-no-files-found: error
retention-days: 7
# The lens matrix job tests the wazero and wasmer lens on linux.
test-lens:
name: Test lens job
strategy:
fail-fast: false
matrix:
lens-type: [wazero, wasmer]
runs-on: ubuntu-latest
env:
DEFRA_LENS_TYPE: ${{ matrix.lens-type }}
steps:
- name: Checkout code into the directory
uses: actions/checkout@v4
- name: Setup Go environment explicitly
uses: actions/setup-go@v5
with:
go-version-file: 'go.mod'
check-latest: true
cache: false
- name: Set cache paths
id: cache-paths
shell: bash
run: |
echo "GO_CACHE=$(go env GOCACHE)" >> "${GITHUB_OUTPUT}"
echo "GO_MODCACHE=$(go env GOMODCACHE)" >> "${GITHUB_OUTPUT}"
echo "CARGO_CACHE=~/.cargo" >> "${GITHUB_OUTPUT}"
- name: Go cache/restore
uses: actions/cache@v4
with:
key: ${{ runner.os }}-go-${{ hashFiles('**/go.mod') }}
path: |
${{ steps.cache-paths.outputs.GO_CACHE }}
${{ steps.cache-paths.outputs.GO_MODCACHE }}
- name: Cargo cache/restore
uses: actions/cache@v4
with:
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.toml') }}
path: |
${{ steps.cache-paths.outputs.CARGO_CACHE }}
**/target/
- name: Restore modified time
uses: chetan/git-restore-mtime-action@v2
- name: Build dependencies
run: |
make deps:modules
make deps:test
- name: Run integration tests
run: make test:coverage
- name: Upload coverage artifact
uses: actions/upload-artifact@v4
with:
# Make sure the name is always unique per job as artifacts are now immutable.
# Note Issue: https://github.com/actions/upload-artifact/issues/478
# Solve: https://github.com/actions/upload-artifact/issues/478#issuecomment-1885470013
name: "coverage_lens\
_${{ matrix.lens-type }}\
"
path: coverage.txt
if-no-files-found: error
retention-days: 7
# This job runs the database with encryption tests using default configuration, on linux.
test-encryption:
name: Test encryption job
runs-on: ubuntu-latest
env:
DEFRA_BADGER_ENCRYPTION: true
steps:
- name: Checkout code into the directory
uses: actions/checkout@v4
- name: Setup Go environment explicitly
uses: actions/setup-go@v5
with:
go-version-file: 'go.mod'
check-latest: true
cache: false
- name: Set cache paths
id: cache-paths
shell: bash
run: |
echo "GO_CACHE=$(go env GOCACHE)" >> "${GITHUB_OUTPUT}"
echo "GO_MODCACHE=$(go env GOMODCACHE)" >> "${GITHUB_OUTPUT}"
echo "CARGO_CACHE=~/.cargo" >> "${GITHUB_OUTPUT}"
- name: Go cache/restore
uses: actions/cache@v4
with:
key: ${{ runner.os }}-go-${{ hashFiles('**/go.mod') }}
path: |
${{ steps.cache-paths.outputs.GO_CACHE }}
${{ steps.cache-paths.outputs.GO_MODCACHE }}
- name: Cargo cache/restore
uses: actions/cache@v4
with:
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.toml') }}
path: |
${{ steps.cache-paths.outputs.CARGO_CACHE }}
**/target/
- name: Restore modified time
uses: chetan/git-restore-mtime-action@v2
- name: Build dependencies
run: |
make deps:modules
make deps:test
- name: Run integration tests
run: make test:coverage
- name: Upload coverage artifact
uses: actions/upload-artifact@v4
with:
# Make sure the name is always unique per job as artifacts are now immutable.
# Note Issue: https://github.com/actions/upload-artifact/issues/478
# Solve: https://github.com/actions/upload-artifact/issues/478#issuecomment-1885470013
name: "coverage_encryption"
path: coverage.txt
if-no-files-found: error
retention-days: 7
# This job runs the materialized view tests using default configuration, on linux.
test-materialized:
name: Test materialized job
runs-on: ubuntu-latest
env:
DEFRA_VIEW_TYPE: materialized
steps:
- name: Checkout code into the directory
uses: actions/checkout@v4
- name: Setup Go environment explicitly
uses: actions/setup-go@v5
with:
go-version-file: 'go.mod'
check-latest: true
cache: false
- name: Set cache paths
id: cache-paths
shell: bash
run: |
echo "GO_CACHE=$(go env GOCACHE)" >> "${GITHUB_OUTPUT}"
echo "GO_MODCACHE=$(go env GOMODCACHE)" >> "${GITHUB_OUTPUT}"
echo "CARGO_CACHE=~/.cargo" >> "${GITHUB_OUTPUT}"
- name: Go cache/restore
uses: actions/cache@v4
with:
key: ${{ runner.os }}-go-${{ hashFiles('**/go.mod') }}
path: |
${{ steps.cache-paths.outputs.GO_CACHE }}
${{ steps.cache-paths.outputs.GO_MODCACHE }}
- name: Cargo cache/restore
uses: actions/cache@v4
with:
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.toml') }}
path: |
${{ steps.cache-paths.outputs.CARGO_CACHE }}
**/target/
- name: Restore modified time
uses: chetan/git-restore-mtime-action@v2
- name: Build dependencies
run: |
make deps:modules
make deps:test
- name: Run integration tests
run: make test:coverage
- name: Upload coverage artifact
uses: actions/upload-artifact@v4
with:
# Make sure the name is always unique per job as artifacts are now immutable.
# Note Issue: https://github.com/actions/upload-artifact/issues/478
# Solve: https://github.com/actions/upload-artifact/issues/478#issuecomment-1885470013
name: "coverage_materialized"
path: coverage.txt
if-no-files-found: error
retention-days: 7
# This job runs the tests on macos using default configurations.
test-macos:
name: Test macos job
runs-on: macos-latest
steps:
- name: Checkout code into the directory
uses: actions/checkout@v4
- name: Setup Go environment explicitly
uses: actions/setup-go@v5
with:
go-version-file: 'go.mod'
check-latest: true
cache: false
- name: Set cache paths
id: cache-paths
shell: bash
run: |
echo "GO_CACHE=$(go env GOCACHE)" >> "${GITHUB_OUTPUT}"
echo "GO_MODCACHE=$(go env GOMODCACHE)" >> "${GITHUB_OUTPUT}"
echo "CARGO_CACHE=~/.cargo" >> "${GITHUB_OUTPUT}"
- name: Go cache/restore
uses: actions/cache@v4
with:
key: ${{ runner.os }}-go-${{ hashFiles('**/go.mod') }}
path: |
${{ steps.cache-paths.outputs.GO_CACHE }}
${{ steps.cache-paths.outputs.GO_MODCACHE }}
- name: Cargo cache/restore
uses: actions/cache@v4
with:
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.toml') }}
path: |
${{ steps.cache-paths.outputs.CARGO_CACHE }}
**/target/
- name: Restore modified time
uses: chetan/git-restore-mtime-action@v2
- name: Build dependencies
run: |
make deps:modules
make deps:test
- name: Run integration tests
run: make test:coverage
- name: Upload coverage artifact
uses: actions/upload-artifact@v4
with:
# Make sure the name is always unique per job as artifacts are now immutable.
# Note Issue: https://github.com/actions/upload-artifact/issues/478
# Solve: https://github.com/actions/upload-artifact/issues/478#issuecomment-1885470013
name: "coverage_macos"
path: coverage.txt
if-no-files-found: error
retention-days: 7
## This job gathers all the coverage reports and uploads them to code-cov
upload-coverage:
name: Upload test code coverage job
needs:
- test-basic # 18 test(s)
- test-source-hub # 3 test(s)
- test-lens # 2 test(s)
- test-encryption # 1 test(s)
- test-materialized # 1 test(s)
- test-macos # 1 test(s)
# Important to know:
# - We didn't use `if: always()` here, so this job doesn't run if we manually canceled.
# - `if: success()` is always implied unless `always()` or `failure()` is specified.
if: success() || failure()
runs-on: ubuntu-latest
steps:
- name: Checkout code into the directory
uses: actions/checkout@v4
- name: Download coverage reports
uses: actions/download-artifact@v4
with:
pattern: coverage_*
# Note: https://github.com/actions/download-artifact/blob/main/docs/MIGRATION.md
merge-multiple: false
path: coverage_reports
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
name: defradb-codecov
files: coverage_reports/**/*.txt
flags: all-tests
os: 'linux'
fail_ci_if_error: true
verbose: true