Skip to content

End-to-end tests

End-to-end tests #1

Workflow file for this run

name: End-to-end tests
on:
workflow_dispatch:
inputs:
cardano-node-versions:
description: "Cardano node version used in e2e (comma separated list of versions)"
required: true
type: string
default: "11.0.1"
full-scenario-signed-entity-types:
description: "Signed entity types parameters for full scenarios (discriminants names in an ordered comma separated list)"
required: true
type: string
default: "CardanoTransactions,CardanoStakeDistribution,CardanoDatabase"
minimal-scenario-signed-entity-types:
description: "Signed entity type parameters for minimal scenarios (one discriminants name)"
required: true
type: string
default: "CardanoDatabase"
ref-to-build-nodes:
description: "Git tag or commit hash of the Mithril nodes to test"
required: true
type: string
default: "unstable"
ref-to-build-e2e:
description: "Git tag or commit hash to build the end-to-end binary"
required: true
type: string
default: "unstable"
additional-nodes-build-args:
description: "Additional arguments to pass to the Mithril nodes build command"
required: false
type: string
default: "--features future_snark"
workflow_call:
inputs:
cardano-node-versions:
type: string
default: "11.0.1"
full-scenario-signed-entity-types:
type: string
default: "CardanoTransactions,CardanoStakeDistribution,CardanoDatabase"
minimal-scenario-signed-entity-types:
type: string
default: "CardanoDatabase"
ref-to-build-nodes:
type: string
default: "unstable"
ref-to-build-e2e:
type: string
default: "unstable"
additional-nodes-build-args:
description: "Additional arguments to pass to the Mithril nodes build command"
required: false
type: string
default: "--features future_snark"
jobs:
prepare-env-variables:
runs-on: ubuntu-24.04
outputs:
cardano_node_versions: ${{ steps.set-env.outputs.cardano_node_versions }}
steps:
- name: Prepare env variables
id: set-env
shell: bash
run: |
versions=$(echo '${{ inputs.cardano-node-versions }}' | jq -R -c 'def trim: gsub("^\\s+|\\s+$"; ""); split(",") | map(trim)')
echo "cardano_node_versions=$versions" >> "$GITHUB_OUTPUT"
prepare-binaries:
runs-on: ubuntu-24.04
steps:
- name: Checkout
uses: actions/checkout@v6
with:
ref: ${{ inputs.ref-to-build-nodes }}
- name: Install stable toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: stable
target: x86_64-unknown-linux-musl
- name: Install musl toolchain prerequisites
run: |
sudo apt-get update
sudo apt-get install -y musl-tools build-essential pkg-config
- name: Build Mithril nodes
shell: bash
run: |
cargo build --release --bins --target=x86_64-unknown-linux-musl ${{ inputs.additional-nodes-build-args }} \
--package mithril-aggregator --package mithril-signer \
--package mithril-client-cli --package mithril-relay
- name: Upload Mithril binaries
uses: actions/upload-artifact@v7
with:
name: mithril-binaries
path: |
target/x86_64-unknown-linux-musl/release/mithril-aggregator
target/x86_64-unknown-linux-musl/release/mithril-client
target/x86_64-unknown-linux-musl/release/mithril-relay
target/x86_64-unknown-linux-musl/release/mithril-signer
prepare-e2e-runner:
runs-on: ubuntu-24.04
steps:
- name: Checkout
uses: actions/checkout@v6
with:
ref: ${{ inputs.ref-to-build-e2e }}
- name: Install stable toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: stable
- name: Build E2E runner
shell: bash
run: |
cargo build --release --bin mithril-end-to-end
- name: Upload E2E runner
uses: actions/upload-artifact@v7
with:
name: e2e-runner
path: target/release/mithril-end-to-end
minimal-e2e:
runs-on: ubuntu-24.04
needs: [prepare-env-variables, prepare-binaries, prepare-e2e-runner]
strategy:
fail-fast: false
matrix:
cardano_node_version: ${{ fromJSON(needs.prepare-env-variables.outputs.cardano_node_versions) }}
aggregate_signature_type: ["Concatenation"] # Todo: add "Snark" once the snark certificate chain is ready
extra_args: ["--cardano-slot-length 1.0 --cardano-epoch-length 60"]
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Download binaries
uses: actions/download-artifact@v8
with:
name: mithril-binaries
path: ./mithril-binaries
- name: Download e2e runner
uses: actions/download-artifact@v8
with:
name: e2e-runner
path: ./mithril-binaries
- name: Prepare binaries
shell: bash
run: |
chmod +x ./mithril-binaries/mithril-aggregator
chmod +x ./mithril-binaries/mithril-client
chmod +x ./mithril-binaries/mithril-signer
chmod +x ./mithril-binaries/mithril-relay
chmod +x ./mithril-binaries/mithril-end-to-end
mkdir -p artifacts
- name: Run E2E tests
uses: nick-fields/retry@v4
with:
shell: bash
max_attempts: 3
retry_on_exit_code: 2
timeout_minutes: 10
warning_on_retry: true
command: |
./mithril-binaries/mithril-end-to-end -vvv \
--bin-directory ./mithril-binaries/ \
--work-directory=./artifacts \
--devnet-scripts-directory=./mithril-test-lab/cardano-devnet \
--cardano-node-version ${{ matrix.cardano_node_version }} \
--aggregate-signature-type ${{ matrix.aggregate_signature_type }} \
${{ matrix.extra_args }} minimal --signed-entity-type ${{ inputs.minimal-scenario-signed-entity-types }}
EXIT_CODE=$?
if [ $EXIT_CODE -eq 0 ]; then
echo "RESULT=success" >> $GITHUB_ENV
elif [ $EXIT_CODE -eq 3 ]; then
echo "RESULT=incompatible" >> $GITHUB_ENV
exit 0
else
echo "RESULT=failure" >> $GITHUB_ENV
fi
exit $EXIT_CODE
- name: Upload E2E Tests Artifacts
if: ${{ failure() }}
uses: actions/upload-artifact@v7
with:
name: mithril-e2e-tests-artifacts-run_${{ github.run_number }}-attempt_${{ github.run_attempt }}-sig_type_${{ matrix.aggregate_signature_type }}--scenario_minimal--cardano-${{ matrix.cardano_node_version }}
path: |
./artifacts/*
# including node.sock makes the upload fails so exclude them:
!./artifacts/**/node.sock
# exclude cardano tools, saving ~500mb of data:
!./artifacts/devnet/bin/
if-no-files-found: error
full-e2e:
runs-on: ubuntu-24.04
needs: [prepare-env-variables, prepare-binaries, prepare-e2e-runner]
strategy:
fail-fast: false
matrix:
cardano_node_version: ${{ fromJSON(needs.prepare-env-variables.outputs.cardano_node_versions) }}
aggregate_signature_type: ["Concatenation"]
extra_args: ["--cardano-slot-length 1.0 --cardano-epoch-length 60"]
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Download binaries
uses: actions/download-artifact@v8
with:
name: mithril-binaries
path: ./mithril-binaries
- name: Download e2e runner
uses: actions/download-artifact@v8
with:
name: e2e-runner
path: ./mithril-binaries
- name: Prepare binaries
shell: bash
run: |
chmod +x ./mithril-binaries/mithril-aggregator
chmod +x ./mithril-binaries/mithril-client
chmod +x ./mithril-binaries/mithril-signer
chmod +x ./mithril-binaries/mithril-relay
chmod +x ./mithril-binaries/mithril-end-to-end
mkdir -p artifacts
- name: Run E2E tests
uses: nick-fields/retry@v4
with:
shell: bash
max_attempts: 3
retry_on_exit_code: 2
timeout_minutes: 10
warning_on_retry: true
command: |
./mithril-binaries/mithril-end-to-end -vvv \
--bin-directory ./mithril-binaries/ \
--work-directory=./artifacts \
--devnet-scripts-directory=./mithril-test-lab/cardano-devnet \
--cardano-node-version ${{ matrix.cardano_node_version }} \
--aggregate-signature-type ${{ matrix.aggregate_signature_type }} \
${{ matrix.extra_args }} full --signed-entity-types ${{ inputs.full-scenario-signed-entity-types }}
EXIT_CODE=$?
if [ $EXIT_CODE -eq 0 ]; then
echo "RESULT=success" >> $GITHUB_ENV
elif [ $EXIT_CODE -eq 3 ]; then
echo "RESULT=incompatible" >> $GITHUB_ENV
exit 0
else
echo "RESULT=failure" >> $GITHUB_ENV
fi
exit $EXIT_CODE
- name: Upload E2E Tests Artifacts
if: ${{ failure() }}
uses: actions/upload-artifact@v7
with:
name: mithril-e2e-tests-artifacts-run_${{ github.run_number }}-attempt_${{ github.run_attempt }}-sig_type_${{ matrix.aggregate_signature_type }}--scenario_full--cardano-${{ matrix.cardano_node_version }}
path: |
./artifacts/*
# including node.sock makes the upload fails so exclude them:
!./artifacts/**/node.sock
# exclude cardano tools, saving ~500mb of data:
!./artifacts/devnet/bin/
if-no-files-found: error