Merge pull request #14680 from rgacogne/ddist18-backport-14562 #9936
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--- | |
name: 'Build and test everything' | |
on: | |
push: | |
pull_request: | |
workflow_call: | |
inputs: | |
branch-name: | |
description: 'Checkout to a specific branch' | |
required: true | |
default: '' | |
type: string | |
schedule: | |
- cron: '0 22 * * 3' | |
permissions: # least privileges, see https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#permissions | |
contents: read | |
jobs: | |
build-dnsdist: | |
name: build dnsdist | |
if: ${{ !github.event.schedule || vars.SCHEDULED_JOBS_BUILD_AND_TEST_ALL }} | |
runs-on: ubuntu-20.04 | |
strategy: | |
matrix: | |
sanitizers: [ubsan+asan, tsan] | |
features: [least, full] | |
exclude: | |
- sanitizers: tsan | |
features: least | |
env: | |
ASAN_OPTIONS: detect_leaks=0 | |
SANITIZERS: ${{ matrix.sanitizers }} | |
UBSAN_OPTIONS: "print_stacktrace=1:halt_on_error=1:suppressions=${{ github.workspace }}/build-scripts/UBSan.supp" | |
UNIT_TESTS: yes | |
defaults: | |
run: | |
working-directory: ./pdns/dnsdistdist/ | |
steps: | |
- uses: PowerDNS/pdns/set-ubuntu-mirror@meta | |
- uses: actions/checkout@v3 | |
with: | |
fetch-depth: 5 | |
submodules: recursive | |
ref: ${{ inputs.branch-name }} | |
- name: get timestamp for cache | |
id: get-stamp | |
run: | | |
echo "stamp=$(/bin/date +%s)" >> "$GITHUB_OUTPUT" | |
shell: bash | |
- name: let GitHub cache our ccache data | |
uses: actions/cache@v3 | |
with: | |
path: ~/.ccache | |
key: dnsdist-${{ matrix.features }}-${{ matrix.sanitizers }}-ccache-${{ steps.get-stamp.outputs.stamp }} | |
restore-keys: dnsdist-${{ matrix.features }}-${{ matrix.sanitizers }}-ccache- | |
- run: ../../build-scripts/gh-actions-setup-inv # this runs apt update+upgrade | |
- run: inv apt-fresh | |
- run: inv install-clang | |
- run: inv install-dnsdist-build-deps | |
- run: inv ci-autoconf | |
- run: inv ci-dnsdist-configure ${{ matrix.features }} | |
- run: inv ci-dnsdist-make | |
- run: inv ci-dnsdist-run-unit-tests | |
- run: inv ci-make-install | |
- run: ccache -s | |
- run: echo "normalized-branch-name=${{ inputs.branch-name || github.ref_name }}" | tr "/" "-" >> "$GITHUB_ENV" | |
- name: Store the binaries | |
uses: actions/upload-artifact@v3 # this takes 30 seconds, maybe we want to tar | |
with: | |
name: dnsdist-${{ matrix.features }}-${{ matrix.sanitizers }}-${{ env.normalized-branch-name }} | |
path: /opt/dnsdist | |
retention-days: 1 | |
test-dnsdist-regression: | |
needs: build-dnsdist | |
runs-on: ubuntu-20.04 | |
strategy: | |
matrix: | |
sanitizers: [ubsan+asan, tsan] | |
env: | |
UBSAN_OPTIONS: "print_stacktrace=1:halt_on_error=1:suppressions=${{ github.workspace }}/build-scripts/UBSan.supp" | |
# Disabling (intercept_send=0) the custom send wrappers for ASAN and TSAN because they cause the tools to report a race that doesn't exist on actual implementations of send(), see https://github.com/google/sanitizers/issues/1498 | |
ASAN_OPTIONS: detect_leaks=0:intercept_send=0 | |
TSAN_OPTIONS: "halt_on_error=1:intercept_send=0:suppressions=${{ github.workspace }}/pdns/dnsdistdist/dnsdist-tsan.supp" | |
# IncludeDir tests are disabled because of a weird interaction between TSAN and these tests which ever only happens on GH actions | |
SKIP_INCLUDEDIR_TESTS: yes | |
steps: | |
- uses: PowerDNS/pdns/set-ubuntu-mirror@meta | |
- uses: actions/checkout@v3 | |
with: | |
fetch-depth: 5 | |
submodules: recursive | |
ref: ${{ inputs.branch-name }} | |
- run: echo "normalized-branch-name=${{ inputs.branch-name || github.ref_name }}" | tr "/" "-" >> "$GITHUB_ENV" | |
- name: Fetch the binaries | |
uses: actions/download-artifact@v3 | |
with: | |
name: dnsdist-full-${{ matrix.sanitizers }}-${{ env.normalized-branch-name }} | |
path: /opt/dnsdist | |
- run: build-scripts/gh-actions-setup-inv # this runs apt update+upgrade | |
- run: inv install-clang-runtime | |
- run: inv install-dnsdist-test-deps | |
- run: inv test-dnsdist | |
collect: | |
needs: | |
- build-dnsdist | |
- test-dnsdist-regression | |
if: success() || failure() | |
runs-on: ubuntu-22.04 | |
steps: | |
- name: Install jq and jc | |
run: "sudo apt-get update && sudo apt-get install jq jc" | |
- name: Fail job if any of the previous jobs failed | |
run: "for i in `echo '${{ toJSON(needs) }}' | jq -r '.[].result'`; do if [[ $i == 'failure' ]]; then echo '${{ toJSON(needs) }}'; exit 1; fi; done;" | |
- uses: actions/checkout@v3 | |
with: | |
fetch-depth: 5 | |
submodules: recursive | |
ref: ${{ inputs.branch-name }} | |
- name: Get list of jobs in the workflow | |
run: "cat .github/workflows/build-and-test-all.yml | jc --yaml | jq -rS '.[].jobs | keys | .[]' | grep -v collect | tee /tmp/workflow-jobs-list.yml" | |
- name: Get list of prerequisite jobs | |
run: "echo '${{ toJSON(needs) }}' | jq -rS 'keys | .[]' | tee /tmp/workflow-needs-list.yml" | |
- name: Fail if there is a job missing on the needs list | |
run: "if ! diff -q /tmp/workflow-jobs-list.yml /tmp/workflow-needs-list.yml; then exit 1; fi" | |
# FIXME: if we can make upload/download-artifact fasts, running unit tests outside of build can let regression tests start earlier |