Skip to content

Nightly backward compatibility #79

Nightly backward compatibility

Nightly backward compatibility #79

name: Nightly backward compatibility
on:
# Important note about scheduled workflows:
# Notifications for scheduled workflows are sent to the user who last modified the cron syntax in the workflow file.
schedule:
- cron: "30 2 * * *"
workflow_dispatch:
inputs:
total-releases:
description: "Total number of releases to test"
required: true
type: number
default: 3
cardano-node-version:
description: "Cardano node version used in e2e"
required: true
type: string
default: "10.1.2"
signed-entity-types:
description: "Signed entity types parameters (discriminants names in an ordered comma separated list)"
required: true
type: string
default: "CardanoTransactions,CardanoStakeDistribution"
jobs:
prepare-env-variables:
runs-on: ubuntu-22.04
outputs:
total_releases: ${{ steps.set-env.outputs.total_releases }}
cardano_node_version: ${{ steps.set-env.outputs.cardano_node_version }}
signed-entity-types: ${{ steps.set-env.outputs.signed-entity-types }}
steps:
- name: Prepare env variables
id: set-env
shell: bash
run: |
if [[ "${{ github.event_name }}" == "schedule" ]]; then
echo "total_releases=3" >> $GITHUB_OUTPUT
echo 'cardano_node_version=["10.1.2"]' >> $GITHUB_OUTPUT
echo 'signed-entity-types=CardanoTransactions,CardanoStakeDistribution' >> $GITHUB_OUTPUT
else
echo "total_releases=${{ inputs.total-releases }}" >> $GITHUB_OUTPUT
echo "cardano_node_version=[\"${{ inputs.cardano-node-version }}\"]" >> $GITHUB_OUTPUT
echo 'signed-entity-types=${{ inputs.signed-entity-types }}' >> $GITHUB_OUTPUT
fi
prepare-binaries:
runs-on: ubuntu-22.04
needs: [prepare-env-variables]
outputs:
tags: ${{ steps.tags-test-lab.outputs.tags }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Download releases artifacts binaries
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
shell: bash
run: |
./.github/workflows/scripts/download-distribution-binaries.sh ${{ needs.prepare-env-variables.outputs.total_releases }}
- name: Install stable toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: stable
- name: Build e2e
shell: bash
run: |
cargo build --release --bin mithril-end-to-end
cp ./target/release/mithril-end-to-end ./mithril-binaries/unstable
- name: Upload Mithril binaries
uses: actions/upload-artifact@v4
with:
name: mithril-binaries
path: ./mithril-binaries
- name: Prepare test lab tags
id: tags-test-lab
shell: bash
run: |
TAGS=$(jq -c '.' ./mithril-binaries/tags.json)
echo "Test Lab Tags: $TAGS"
echo "tags=$TAGS" >> $GITHUB_OUTPUT
e2e:
runs-on: ubuntu-22.04
needs: [prepare-env-variables, prepare-binaries]
strategy:
fail-fast: false
matrix:
tag: ${{ fromJSON(needs.prepare-binaries.outputs.tags) }}
node: [mithril-aggregator, mithril-client, mithril-signer]
cardano_node_version: ${{ fromJSON(needs.prepare-env-variables.outputs.cardano_node_version) }}
run_id: ["#1"]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Download binaries
uses: actions/download-artifact@v4
with:
name: mithril-binaries
path: ./mithril-binaries
- name: Prepare binaries
shell: bash
run: |
mkdir -p mithril-binaries/e2e
cp ./mithril-binaries/unstable/* ./mithril-binaries/e2e
cp --remove-destination ./mithril-binaries/${{ matrix.tag }}/${{ matrix.node }} ./mithril-binaries/e2e/
chmod +x ./mithril-binaries/e2e/mithril-aggregator
chmod +x ./mithril-binaries/e2e/mithril-client
chmod +x ./mithril-binaries/e2e/mithril-signer
chmod +x ./mithril-binaries/e2e/mithril-relay
chmod +x ./mithril-binaries/e2e/mithril-end-to-end
mkdir artifacts
- name: Run E2E tests
shell: bash
run: |
./mithril-binaries/e2e/mithril-end-to-end -vvv \
--bin-directory ./mithril-binaries/e2e \
--work-directory=./artifacts \
--devnet-scripts-directory=./mithril-test-lab/mithril-devnet \
--cardano-node-version ${{ matrix.cardano_node_version }} \
--cardano-slot-length 0.25 \
--cardano-epoch-length 45.0 \
--signed-entity-types ${{ needs.prepare-env-variables.outputs.signed-entity-types }} \
&& echo "SUCCESS=true" >> $GITHUB_ENV \
|| (echo "SUCCESS=false" >> $GITHUB_ENV && exit 1)
- name: Define the JSON file name for the test result
shell: bash
if: success() || failure()
run: echo "RESULT_FILE_NAME=e2e-test-result-run_${{ github.run_number }}-attempt_${{ github.run_attempt }}-tag_${{ matrix.tag }}-node-${{ matrix.node }}-cardano-${{ matrix.cardano_node_version }}-run_id_${{ matrix.run_id }}" >> $GITHUB_ENV
- name: Write test result JSON
if: success() || failure()
shell: bash
run: |
AGGREGATOR_TAG="unstable"
SIGNER_TAG="unstable"
CLIENT_TAG="unstable"
case "$NODE" in
mithril-aggregator)
AGGREGATOR_TAG="${{ matrix.tag }}"
;;
mithril-signer)
SIGNER_TAG="${{ matrix.tag }}"
;;
mithril-client)
CLIENT_TAG="${{ matrix.tag }}"
;;
esac
jq -n --arg TAG "${{ matrix.tag }}" \
--arg NODE "${{ matrix.node }}" \
--arg CARDANO_NODE "${{ matrix.cardano_node_version }}" \
--arg AGGREGATOR "$AGGREGATOR_TAG" \
--arg SIGNER "$SIGNER_TAG" \
--arg CLIENT "$CLIENT_TAG" \
--argjson SUCCESS "${{ env.SUCCESS }}" \
'{tag: $TAG, node: $NODE, mithril_signer: $SIGNER, mithril_aggregator: $AGGREGATOR, mithril_client: $CLIENT, cardano_node_version: $CARDANO_NODE, success: $SUCCESS}' \
> ./${{ env.RESULT_FILE_NAME }}.json
- name: Upload test result JSON
if: success() || failure()
uses: actions/upload-artifact@v4
with:
name: ${{ env.RESULT_FILE_NAME }}
path: ./${{ env.RESULT_FILE_NAME }}.json
- name: Upload E2E Tests Artifacts
if: ${{ failure() }}
uses: actions/upload-artifact@v4
with:
name: mithril-e2e-tests-artifacts-run_${{ github.run_number }}-attempt_${{ github.run_attempt }}-tag_${{ matrix.tag }}-node-${{ matrix.node }}-cardano-${{ matrix.cardano_node_version }}-run_id_${{ matrix.run_id }}
path: |
./artifacts/*
# including node.sock makes the upload fails so exclude them:
!./artifacts/**/node.sock
# exclude cardano tools, saving ~50mb of data:
!./artifacts/devnet/cardano-cli
!./artifacts/devnet/cardano-node
if-no-files-found: error
summarize-test-results:
runs-on: ubuntu-22.04
needs: [prepare-env-variables, e2e]
if: success() || failure()
steps:
- name: Download all test result artifacts
uses: actions/download-artifact@v4
with:
path: ./test-results
pattern: e2e-test-result*
merge-multiple: true
- name: Concatenate JSON result files into summary.json
shell: bash
run: |
jq -s '.' ./test-results/e2e-test-result-*.json > ./test-results/summary.json
- name: Add distributions backward compatibility summary
shell: bash
run: |
CHECK_MARK=":heavy_check_mark:"
CROSS_MARK=":no_entry:"
echo "## Distributions backward compatibility" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "This is the compatibility report of previous distributions nodes with the current unstable nodes." >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**Signed entity types**: ${{ needs.prepare-env-variables.outputs.signed-entity-types }}" >> $GITHUB_STEP_SUMMARY
echo "**Cardano nodes**: ${{ needs.prepare-env-variables.outputs.cardano_node_version }}" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "| Compatibility | mithril-signer | mithril-aggregator | mithril-client |" >> $GITHUB_STEP_SUMMARY
echo "| --- | :---: | :---: | :---: |" >> $GITHUB_STEP_SUMMARY
# Transform summary.json into Markdown table rows
jq -r --arg CHECK_MARK "$CHECK_MARK" --arg CROSS_MARK "$CROSS_MARK" \
'group_by(.tag) |
sort_by(.[0].tag | tonumber) | reverse |
.[] |
{
tag: .[0].tag,
signer: (map(select(.node == "mithril-signer") | if .success then $CHECK_MARK else $CROSS_MARK end) | join("")),
aggregator: (map(select(.node == "mithril-aggregator") | if .success then $CHECK_MARK else $CROSS_MARK end) | join("")),
client: (map(select(.node == "mithril-client") | if .success then $CHECK_MARK else $CROSS_MARK end) | join(""))
} |
"| `\(.tag)` | \(.signer) | \(.aggregator) | \(.client) |"' "./test-results/summary.json" >> $GITHUB_STEP_SUMMARY
cat "$GITHUB_STEP_SUMMARY"