CI #6064
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: "CI" | |
# Limit concurrent runs of this workflow within a single PR | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} | |
cancel-in-progress: true | |
on: | |
# We're using merge-chains; so this needs to run then. | |
merge_group: | |
push: | |
branches: | |
- master | |
- release | |
pull_request: | |
schedule: | |
# Everyday at 4:00 AM | |
- cron: "0 4 * * *" | |
permissions: | |
checks: write | |
pull-requests: write | |
jobs: | |
build-test: | |
name: "Build & test" | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
include: | |
- package: plutus-cbor | |
- package: plutus-merkle-tree | |
- package: hydra-plutus | |
- package: hydra-tui | |
- package: hydra-node | |
- package: hydra-tx | |
- package: hydra-cluster | |
steps: | |
- name: π₯ Checkout repository | |
uses: actions/checkout@v4 | |
- name: β Prepare nix | |
uses: cachix/install-nix-action@v30 | |
with: | |
extra_nix_config: | | |
accept-flake-config = true | |
log-lines = 1000 | |
- name: β Cachix cache of nix derivations | |
uses: cachix/cachix-action@v15 | |
with: | |
name: cardano-scaling | |
authToken: '${{ secrets.CACHIX_CARDANO_SCALING_AUTH_TOKEN }}' | |
- name: β Test | |
if: ${{ matrix.package != 'hydra-tui' }} | |
run: | | |
cd ${{ matrix.package }} | |
nix build .#${{ matrix.package }}-tests | |
nix develop .#${{ matrix.package }}-tests --command tests | |
# This one is special, as it requires a tty. | |
- name: β Test (TUI) | |
id: test_tui | |
if: ${{ matrix.package == 'hydra-tui' }} | |
# https://giters.com/gfx/example-github-actions-with-tty | |
# The default shell does not allocate a TTY which breaks some tests | |
shell: 'script -q -e -c "bash {0}"' | |
env: | |
TERM: "xterm" | |
run: | | |
cd ${{ matrix.package }} | |
nix build .#${{ matrix.package }}-tests | |
nix develop .#${{ matrix.package }}-tests --command tests | |
- name: πΎ Upload build & test artifacts | |
uses: actions/upload-artifact@v4 | |
with: | |
name: test-results-${{ matrix.package }} | |
path: | | |
./**/test-results.xml | |
./**/hspec-results.md | |
if-no-files-found: ignore | |
# NOTE: This depends on the path used in hydra-cluster e2e tests | |
- name: πΎ Upload logs | |
if: always() | |
uses: actions/upload-artifact@v4 | |
with: | |
name: hydra-cluster-e2e-test-logs | |
path: /tmp/nix-shell.*/hydra-cluster-e2e-*/logs/* | |
if-no-files-found: ignore | |
publish-test-results: | |
name: Publish test results | |
needs: [build-test] | |
runs-on: ubuntu-latest | |
steps: | |
- name: π₯ Download test results | |
uses: actions/download-artifact@v4 | |
with: | |
pattern: test-results-* | |
merge-multiple: true | |
- name: β Publish test results to PR | |
uses: EnricoMi/publish-unit-test-result-action@v2 | |
with: | |
junit_files: ./**/test-results.xml | |
haddock: | |
name: "Build haddock using nix" | |
runs-on: ubuntu-latest | |
steps: | |
- name: π₯ Checkout repository | |
uses: actions/checkout@v4 | |
- name: β Prepare nix | |
uses: cachix/install-nix-action@v30 | |
with: | |
extra_nix_config: | | |
accept-flake-config = true | |
log-lines = 1000 | |
- name: β Cachix cache of nix derivations | |
uses: cachix/cachix-action@v15 | |
with: | |
name: cardano-scaling | |
authToken: '${{ secrets.CACHIX_CARDANO_SCALING_AUTH_TOKEN }}' | |
- name: π Documentation (Haddock) | |
run: | | |
nix build .#haddocks | |
mkdir -p haddocks | |
cp -aL result/* haddocks/ | |
- name: πΎ Upload haddock artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
name: haddocks | |
path: haddocks | |
benchmarks: | |
name: "Benchmarks" | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
include: | |
- package: hydra-node | |
bench: tx-cost | |
options: '--output-directory $(pwd)/../benchmarks' | |
- package: hydra-node | |
bench: micro | |
options: '-o $(pwd)/../benchmarks/ledger-bench.html' | |
- package: hydra-cluster | |
bench: bench-e2e | |
options: 'datasets datasets/1-node.json datasets/3-nodes.json --output-directory $(pwd)/../benchmarks --timeout 1000s' | |
- package: plutus-merkle-tree | |
bench: on-chain-cost | |
options: '$(pwd)/../benchmarks' | |
steps: | |
- name: π₯ Checkout repository | |
uses: actions/checkout@v4 | |
- name: β Prepare nix | |
uses: cachix/install-nix-action@v30 | |
with: | |
extra_nix_config: | | |
accept-flake-config = true | |
log-lines = 1000 | |
- name: β Cachix cache of nix derivations | |
uses: cachix/cachix-action@v15 | |
with: | |
name: cardano-scaling | |
authToken: '${{ secrets.CACHIX_CARDANO_SCALING_AUTH_TOKEN }}' | |
- name: π Benchmark | |
run: | | |
mkdir -p benchmarks | |
cd ${{ matrix.package }} | |
nix build .#${{ matrix.package }}-bench | |
nix develop .#${{ matrix.package }}-bench --command ${{ matrix.bench }} ${{ matrix.options }} | |
- name: πΎ Upload build & test artifacts | |
uses: actions/upload-artifact@v4 | |
with: | |
name: benchmarks-${{matrix.package}}-${{matrix.bench}} | |
path: benchmarks | |
# NOTE: This depends on the path used in hydra-cluster bench | |
- name: πΎ Upload logs | |
if: always() | |
uses: actions/upload-artifact@v4 | |
with: | |
name: hydra-cluster-bench-logs | |
path: /tmp/nix-shell.*/bench-*/**/*.log | |
if-no-files-found: ignore | |
publish-benchmark-results: | |
name: Publish benchmark results | |
if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository | |
# TODO: this is actually only requires the tx-cost benchmark results | |
needs: [benchmarks] | |
runs-on: ubuntu-latest | |
steps: | |
- name: π₯ Download generated documentation | |
uses: actions/download-artifact@v4 | |
with: | |
path: artifact | |
pattern: benchmarks-* | |
merge-multiple: true | |
- name: β Prepare comment body | |
id: comment-body | |
run: | | |
# Drop first 5 header lines and demote headlines one level | |
cat <(cat artifact/transaction-cost.md | sed '1,5d;s/^#/##/') <(cat artifact/end-to-end-benchmarks.md | sed '1,5d;s/^#/##/') | grep -v '^:::' > comment-body.md | |
- name: π Find Comment | |
uses: peter-evans/find-comment@v3 | |
id: find-comment | |
with: | |
issue-number: ${{ github.event.pull_request.number }} | |
comment-author: 'github-actions[bot]' | |
body-includes: Transaction costs | |
- name: β Create or update comment | |
uses: peter-evans/create-or-update-comment@v4 | |
with: | |
comment-id: ${{ steps.find-comment.outputs.comment-id }} | |
edit-mode: replace | |
issue-number: ${{ github.event.pull_request.number }} | |
body-file: comment-body.md | |
reactions: rocket | |
nix-flake-check: | |
name: "nix flake check" | |
runs-on: ubuntu-latest | |
steps: | |
- name: π₯ Checkout repository | |
uses: actions/checkout@v4 | |
- name: β Prepare nix | |
uses: cachix/install-nix-action@v30 | |
with: | |
extra_nix_config: | | |
accept-flake-config = true | |
log-lines = 1000 | |
- name: β Cachix cache of nix derivations | |
uses: cachix/cachix-action@v15 | |
with: | |
name: cardano-scaling | |
authToken: '${{ secrets.CACHIX_CARDANO_SCALING_AUTH_TOKEN }}' | |
- name: β Nix Flake Check | |
run: | | |
nix flake check -L | |
build-specification: | |
name: "Build specification using nix" | |
runs-on: ubuntu-latest | |
steps: | |
- name: π₯ Checkout repository | |
uses: actions/checkout@v4 | |
- name: β Prepare nix | |
uses: cachix/install-nix-action@v30 | |
with: | |
extra_nix_config: | | |
accept-flake-config = true | |
log-lines = 1000 | |
- name: β Cachix cache of nix derivations | |
uses: cachix/cachix-action@v15 | |
with: | |
name: cardano-scaling | |
authToken: '${{ secrets.CACHIX_CARDANO_SCALING_AUTH_TOKEN }}' | |
- name: β Build specification PDF | |
run: | | |
nix build .#spec && cp result/*.pdf . | |
- name: πΎ Upload specification | |
uses: actions/upload-artifact@v4 | |
with: | |
name: hydra-spec | |
path: | | |
documentation: | |
name: Documentation | |
needs: [haddock,benchmarks,build-test,build-specification] | |
runs-on: ubuntu-latest | |
steps: | |
- name: π₯ Checkout repository | |
uses: actions/checkout@v4 | |
with: | |
# For the cardanonical json schemas | |
submodules: true | |
# Ensure we have all history with all commits | |
fetch-depth: 0 | |
- name: β Prepare nix | |
uses: cachix/install-nix-action@v30 | |
with: | |
extra_nix_config: | | |
accept-flake-config = true | |
log-lines = 1000 | |
- name: Set up and use the "ci" devShell | |
uses: nicknovitski/nix-develop@v1 | |
with: | |
arguments: ".#ci" | |
# Technically, we don't need this, given we're in a Nix shell; | |
# but we will keep it for the caching. | |
- name: π§ Setup Node.js | |
uses: actions/setup-node@v4 | |
with: | |
node-version: 18 | |
cache: 'yarn' | |
cache-dependency-path: docs/yarn.lock | |
- name: β Test API reference | |
working-directory: docs | |
run: | | |
yarn | |
yarn validate | |
- name: π₯ Download benchmark results | |
uses: actions/download-artifact@v4 | |
with: | |
path: docs/benchmarks | |
pattern: benchmarks-* | |
merge-multiple: true | |
- name: π₯ Download haddock documentation | |
uses: actions/download-artifact@v4 | |
with: | |
name: haddocks | |
path: docs/static/haddock | |
- name: π₯ Download test results | |
uses: actions/download-artifact@v4 | |
with: | |
pattern: test-results-* | |
merge-multiple: true | |
path: docs/benchmarks/tests | |
- name: π₯ Download specification PDF | |
uses: actions/download-artifact@v4 | |
with: | |
name: hydra-spec | |
path: docs/static/ | |
- name: π Documentation sanity check | |
working-directory: docs | |
run: | | |
yarn | |
yarn build-dev | |
# Compute the cost difference between this branch and master. | |
tx-cost-diff: | |
name: Compute cost differences | |
runs-on: ubuntu-latest | |
# Only run on PR | |
if: github.event_name == 'pull_request' | |
steps: | |
- name: "Checkout the PR as the 'new' source" | |
uses: actions/checkout@v4 | |
with: | |
path: ./new | |
ref: ${{ github.event.pull_request.head.sha }} | |
- name: "Checkout `master` as the 'old' source" | |
uses: actions/checkout@v4 | |
with: | |
path: ./old | |
ref: master | |
- name: β Prepare nix | |
uses: cachix/install-nix-action@v30 | |
with: | |
extra_nix_config: | | |
accept-flake-config = true | |
log-lines = 1000 | |
- name: β Cachix cache of nix derivations | |
uses: cachix/cachix-action@v15 | |
with: | |
name: cardano-scaling | |
authToken: '${{ secrets.CACHIX_CARDANO_SCALING_AUTH_TOKEN }}' | |
- name: Set up and use the "ci" devShell | |
uses: nicknovitski/nix-develop@v1 | |
with: | |
arguments: "./new#costDifferences" | |
- name: "Compute costs on both old and new" | |
run: | | |
SEED=$RANDOM | |
echo "Using random seed $SEED" | |
nix run ./new/#tx-cost -- --seed $SEED >new.md | |
nix run ./old/#tx-cost -- --seed $SEED >old.md | |
- name: "Compute the difference markdown" | |
run: | | |
# Convert to HTML, as that's the easiest way to read the markdown | |
# tables via pandas (!!!) | |
pandoc -i new.md -o new.html | |
pandoc -i old.md -o old.html | |
cat new.md | grep '##' >new-headers.txt | |
cat old.md | grep '##' >old-headers.txt | |
# Stop if the heading columns aren't the same. | |
cmp old-headers.txt new-headers.txt | |
# Run the diff script; note that it's located in the "new" folder. | |
./new/.github/workflows/cost-differences/diff.py \ | |
old-headers.txt \ | |
old.html \ | |
new.html >diff.md | |
- name: π Find Comment | |
uses: peter-evans/find-comment@v3 | |
id: find-comment | |
with: | |
issue-number: ${{ github.event.pull_request.number }} | |
comment-author: 'github-actions[bot]' | |
body-includes: Transaction cost differences | |
- name: β Create or update comment | |
uses: peter-evans/create-or-update-comment@v4 | |
with: | |
comment-id: ${{ steps.find-comment.outputs.comment-id }} | |
edit-mode: replace | |
issue-number: ${{ github.event.pull_request.number }} | |
body-file: diff.md |