Skip to content

feat: conditionally run unit tests #24

feat: conditionally run unit tests

feat: conditionally run unit tests #24

Workflow file for this run

name: Core Unit Tests
on:
push:
branches:
- develop
- "release/*"
merge_group:
pull_request:
jobs:
filter:
name: Detect Changes
permissions:
pull-requests: read
outputs:
should-run-all-tests: ${{ steps.match-some.outputs.test-data == 'true' }}
runs-on: ubuntu-latest
steps:
- name: Checkout the repo
uses: actions/[email protected]
with:
repository: smartcontractkit/chainlink
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
id: match-some
with:
# "if any changed file matches one or more of the conditions" (https://github.com/dorny/paths-filter/issues/225)
predicate-quantifier: some
# test-data - any changes to any testdata files/paths
filters: |
test-data:
- '**/testdata/**'
run-unit-tests:
name: Tests (${{ matrix.type.test-suite }})
needs: filter
runs-on: ubuntu22.04-32cores-128GB
permissions:
id-token: write
contents: write
strategy:
fail-fast: false
matrix:
type:
- test-suite: "core"
module-directory: "./"
build-flags: "-tags=integration"
- test-suite: "ccip-deployment"
module-directory: "./deployment"
env:
# We explicitly have this env var not be "CL_DATABASE_URL" to avoid having it be used by core related tests
# when they should not be using it, while still allowing us to DRY up the setup
DB_URL: postgresql://postgres:postgres@localhost:5432/chainlink_test?sslmode=disable
collect-coverage: ${{ github.event_name == 'pull_request' }}
steps:
- name: Checkout the repo
uses: actions/[email protected]
- name: Setup CI Core Environment
uses: ./.github/actions/setup-ci-core-tests
with:
build-cache-version: ${{ matrix.type.test-suite }}
restore-build-cache-only: "true"
db-url: ${{ env.DB_URL }}
go-mod-download-directory: ${{ matrix.type.test-suite == 'ccip-deployment' && matrix.type.module-directory || '' }}
- name: Build Tests
uses: smartcontractkit/.github/apps/go-test-caching@feat/go-test-binary-comparison
timeout-minutes: 10
with:
pipeline-step: "build"
build-concurrency: "32"
collect-coverage: ${{ env.collect-coverage }}
test-suite: ${{ matrix.type.test-suite }}
module-directory: ${{ matrix.type.module-directory }}
github-token: ${{ secrets.GITHUB_TOKEN }}
build-flags: ${{ matrix.type.build-flags }}
- name: Run Tests
uses: smartcontractkit/.github/apps/go-test-caching@feat/go-test-binary-comparison
timeout-minutes: 15
env:
CL_DATABASE_URL: ${{ env.DB_URL }}
with:
pipeline-step: "run"
run-concurrency: "24"
run-all-tests: ${{ needs.filter.outputs.should-run-all-tests }}
collect-coverage: ${{ env.collect-coverage }}
test-suite: ${{ matrix.type.test-suite }}
module-directory: ${{ matrix.type.module-directory }}
github-token: ${{ secrets.GITHUB_TOKEN }}
- name: Update Test Index
uses: smartcontractkit/.github/apps/go-test-caching@feat/go-test-binary-comparison
with:
pipeline-step: "update"
force-update-index: "true"
collect-coverage: ${{ env.collect-coverage }}
test-suite: ${{ matrix.type.test-suite }}
github-token: ${{ secrets.GITHUB_TOKEN }}
- name: Print postgres logs
if: ${{ always() }}
run: docker compose logs postgres | tee ../../../postgres_logs.txt
working-directory: ./.github/actions/setup-postgres
scan:
name: SonarQube Scan
needs: run-unit-tests
runs-on: ubuntu-latest
steps:
- name: Checkout the repo
uses: actions/[email protected]
with:
# fetches all history for all tags and branches to provide more metadata for sonar reports
fetch-depth: 0
- name: Download all workflow run artifacts
uses: actions/[email protected]
with:
path: coverage
pattern: coverage-*
merge-multiple: true
- name: Check and Set SonarQube Report Paths
shell: bash
run: |
ARGS=""
sonarqube_coverage_report_paths=$(find ./coverage -name '*.cover.out' | paste -sd "," -)
# TODO uncomment when linting in enabled
# Check and assign paths for lint reports
# if [ -d "golangci-lint-report" ]; then
# sonarqube_lint_report_paths=$(find golangci-lint-report -name 'golangci-lint-report.xml' | paste -sd "," -)
# else
# sonarqube_lint_report_paths=""
# fi
# if [[ -z "$sonarqube_lint_report_paths" ]]; then
# echo "::warning::No lint report paths found, will not pass to sonarqube"
# else
# echo "Found lint report paths: $sonarqube_lint_report_paths"
# ARGS="$ARGS -Dsonar.go.golangci-lint.reportPaths=$sonarqube_lint_report_paths"
# fi
if [[ -z "$sonarqube_coverage_report_paths" ]]; then
echo "::warning::No coverage report paths found, will not pass to sonarqube"
else
echo "Found coverage report paths: $sonarqube_coverage_report_paths"
ARGS="$ARGS -Dsonar.go.coverage.reportPaths=$sonarqube_coverage_report_paths"
fi
echo "Final SONARQUBE_ARGS: $ARGS"
echo "SONARQUBE_ARGS=$ARGS" >> $GITHUB_ENV
- name: SonarQube Scan
if: ${{ env.SONARQUBE_ARGS != '' }}
uses: sonarsource/sonarqube-scan-action@aecaf43ae57e412bd97d70ef9ce6076e672fe0a9 # v2.3.0
with:
args: ${{ env.SONARQUBE_ARGS }}
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }}
SONAR_SCANNER_OPTS: "-Xms6g -Xmx8g"
run-fuzz-tests:
name: Tests (fuzz)
if: ${{ github.ref == 'refs/heads/dont-run' }}
runs-on: ubuntu22.04-32cores-128GB
env:
DB_URL: postgresql://postgres:postgres@localhost:5432/chainlink_test?sslmode=disable
steps:
- name: Checkout the repo
uses: actions/[email protected]
- name: Change Modtime of Files (cache optimization)
shell: bash
run: |
find . -type f,d -exec touch -r {} -d '1970-01-01T00:00:01' {} \; || true
- name: Setup CI Core Environment
uses: ./.github/actions/setup-ci-core-tests
with:
test-suite: "fuzz"
db-url: ${{ env.DB_URL }}
- name: Increase Timeouts
if: ${{ github.event_name == 'schedule'}}
run: |
echo "FUZZ_TIMEOUT_MINUTES=10">> $GITHUB_ENV
- name: Run Fuzz Tests
env:
OUTPUT_FILE: ./output.txt
CL_DATABASE_URL: ${{ env.DB_URL }}
run: ./tools/bin/go_core_fuzz ./...
- name: Print postgres logs
if: ${{ always() }}
run: docker compose logs postgres | tee ../../../postgres_logs.txt
working-directory: ./.github/actions/setup-postgres
run-race-tests:
name: Tests (race)
if: ${{ github.ref == 'refs/heads/dont-run' }}
runs-on: ubuntu22.04-32cores-128GB
env:
DB_URL: postgresql://postgres:postgres@localhost:5432/chainlink_test?sslmode=disable
steps:
- name: Checkout the repo
uses: actions/[email protected]
- name: Change Modtime of Files (cache optimization)
shell: bash
run: |
find . -type f,d -exec touch -r {} -d '1970-01-01T00:00:01' {} \; || true
- name: Setup CI Core Environment
uses: ./.github/actions/setup-ci-core-tests
with:
test-suite: "race"
db-url: ${{ env.DB_URL }}
- name: Increase Timeouts
if: ${{ github.event_name == 'schedule'}}
run: |
echo "TIMEOUT=10m" >> $GITHUB_ENV
echo "COUNT=50" >> $GITHUB_ENV
- name: Run Race Tests
env:
OUTPUT_FILE: ./output.txt
CL_DATABASE_URL: ${{ env.DB_URL }}
run: ./tools/bin/go_core_race_tests ./...
- name: Print Races
id: print-races
if: ${{ failure() }}
run: |
find race.* | xargs cat > race.txt
if [[ -s race.txt ]]; then
cat race.txt
echo "post_to_slack=true" >> $GITHUB_OUTPUT
else
echo "post_to_slack=false" >> $GITHUB_OUTPUT
fi
echo "github.event_name: ${{ github.event_name }}"
echo "github.ref: ${{ github.ref }}"
- name: Print postgres logs
if: ${{ always() }}
run: docker compose logs postgres | tee ../../../postgres_logs.txt
working-directory: ./.github/actions/setup-postgres