Run long-lived Hermetic tests #1118
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: Run long-lived Hermetic tests | |
on: | |
schedule: | |
- cron: "0 0/8 * * *" # Every 8 hours | |
workflow_dispatch: # manually triggered | |
inputs: | |
test_selector: | |
type: string | |
description: Path regex passed to Jest to select which tests to run | |
required: true | |
default: correctness/fast | |
env: | |
CARGO_TERM_COLOR: always | |
SCCACHE_GHA_ENABLED: "true" | |
RUSTC_WRAPPER: "sccache" | |
jobs: | |
generate-matrix: | |
name: Generate Matrix | |
runs-on: ubuntu-latest | |
outputs: | |
networks: ${{ steps.generate-matrix.outputs.networks }} | |
build_tag: ${{ steps.generate-matrix.outputs.build_tag }} | |
steps: | |
- | |
name: Checkout | |
uses: actions/checkout@v3 | |
- | |
name: Generate network matrix | |
id: generate-matrix | |
run: | | |
NETWORKS=$(ls networks | jq -R -s -c '. | gsub(".yaml"; "") | split("\n")[:-1]') | |
echo "Networks:" | |
echo ${NETWORKS} | |
echo "networks=${NETWORKS}" >> $GITHUB_OUTPUT | |
# Choose unique name for this build | |
BUILD_TAG="$(echo ${{ github.sha }} | head -c 8)-${{ github.run_id }}" | |
echo "Build tag:" | |
echo ${BUILD_TAG} | |
echo "build_tag=${BUILD_TAG}" >> $GITHUB_OUTPUT | |
cat $GITHUB_OUTPUT | |
publish-suite: | |
name: Publish Suite | |
runs-on: ubuntu-latest | |
needs: generate-matrix | |
steps: | |
- uses: actions/checkout@v3 | |
- name: Set up Docker Buildx | |
uses: docker/setup-buildx-action@v2 | |
- name: Login to Public ECR | |
uses: docker/login-action@v2 | |
with: | |
registry: public.ecr.aws | |
username: ${{ secrets.AWS_ACCESS_KEY_ID }} | |
password: ${{ secrets.AWS_SECRET_ACCESS_KEY }} | |
env: | |
AWS_REGION: us-east-1 | |
- name: Build and Publish | |
run: make BUILD_TAG=${{ needs.generate-matrix.outputs.build_tag }} publish-suite | |
build-driver: | |
name: Build 'hermetic-driver' binary | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: dtolnay/rust-toolchain@stable | |
- uses: Swatinem/rust-cache@v2 | |
with: | |
# The prefix cache key, this can be changed to start a new cache manually. | |
# default: "v0-rust" | |
prefix-key: v0 | |
# Cache only the cargo registry | |
cache-targets: false | |
- uses: mozilla-actions/sccache-action@v0.0.3 | |
- name: Build Tester | |
run: make BUILD_PROFILE=release driver | |
- uses: actions/upload-artifact@master | |
with: | |
name: hermetic-driver | |
path: ./target/release/hermetic-driver | |
retention-days: 1 | |
run-tests: | |
name: Test | |
runs-on: ubuntu-latest | |
environment: test | |
needs: | |
- generate-matrix | |
- build-driver | |
- publish-suite | |
strategy: | |
fail-fast: false | |
matrix: | |
networks: ${{ fromJSON(needs.generate-matrix.outputs.networks) }} | |
steps: | |
- | |
name: Checkout | |
uses: actions/checkout@v3 | |
- | |
name: Setup GKE auth | |
uses: 'google-github-actions/auth@v1' | |
with: | |
credentials_json: ${{ secrets.GKE_SA_KEY }} | |
- | |
name: Get GKE credentials | |
uses: 'google-github-actions/get-gke-credentials@v1' | |
with: | |
cluster_name: ${{ vars.GKE_CLUSTER }} | |
location: ${{ vars.GKE_ZONE }} | |
- uses: actions/download-artifact@master | |
with: | |
name: hermetic-driver | |
path: ./bin | |
- | |
name: Test ${{ matrix.networks }} | |
run: | | |
export BUILD_TAG=${{ needs.generate-matrix.outputs.build_tag }} | |
export TEST_NETWORK=./networks/${{ matrix.networks }}.yaml | |
chmod +x ./bin/hermetic-driver | |
# For scheduled events, "test_selector" will be null, so default to running all tests. | |
test_selector=${{ github.event.inputs.test_selector || 'correctness' }} | |
# Clear the test suffix and set a 2 week TTL so that the latest suite image runs against the same long-lived | |
# networks for 2 weeks before the network is cleaned up and recreated. | |
make TEST_SELECTOR="$test_selector" HERMETIC_SUFFIX= HERMETIC_TTL=1209600 HERMETIC_CMD=./bin/hermetic-driver hermetic-tests | |
run-migration-tests: | |
name: Test Migrations | |
runs-on: ubuntu-latest | |
environment: test | |
needs: | |
- build-driver | |
- publish-suite | |
- generate-matrix #Needed to know the BUILD_TAG | |
steps: | |
- | |
name: Checkout | |
uses: actions/checkout@v3 | |
- | |
name: Setup GKE auth | |
uses: 'google-github-actions/auth@v1' | |
with: | |
credentials_json: ${{ secrets.GKE_SA_KEY }} | |
- | |
name: Get GKE credentials | |
uses: 'google-github-actions/get-gke-credentials@v1' | |
with: | |
cluster_name: ${{ vars.GKE_CLUSTER }} | |
location: ${{ vars.GKE_ZONE }} | |
- uses: actions/download-artifact@master | |
with: | |
name: hermetic-driver | |
path: ./bin | |
- | |
name: Test ${{ matrix.networks }} | |
run: | | |
set -euxo pipefail | |
export BUILD_TAG=${{ needs.generate-matrix.outputs.build_tag }} | |
chmod +x ./bin/hermetic-driver | |
make HERMETIC_CMD=./bin/hermetic-driver migration-tests | |
collect-results: | |
name: Long-Lived Hermetic Test Results | |
if: ${{ always() }} | |
runs-on: ubuntu-latest | |
needs: [run-tests, run-migration-tests] | |
steps: | |
- run: exit 1 | |
# see https://stackoverflow.com/a/67532120/4907315 | |
if: >- | |
${{ | |
contains(needs.*.result, 'failure') | |
|| contains(needs.*.result, 'cancelled') | |
}} |