Haskell CI - NIGHTLY #14785
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: Haskell CI | |
# If it's a scheduled (for us: nightly) build, set the name of this run to a static value, so we can identify it easier. | |
# Otherwise, replicate the default run name: either the PR title if it exists, or the commit message otherwise. | |
run-name: | | |
${{github.event_name == 'schedule' && 'Haskell CI - NIGHTLY' | |
|| github.event.pull_request.title == '' && github.event.head_commit.message | |
|| github.event.pull_request.title}} | |
on: | |
push: | |
branches: [ "master", "release/**" ] | |
pull_request: | |
branches: [ "**" ] | |
schedule: | |
# "Nightly" builds: Every day at 06:00 UTC | |
- cron: '0 6 * * *' | |
# for running the workflow manually - useful for branches without PRs, for which jobs don't get ran automatically | |
workflow_dispatch: | |
inputs: | |
nightly: | |
description: Run with the same settings as a nightly build | |
type: boolean | |
default: false | |
# Cancel running workflows when a new workflow on the same PR or branch is started, | |
# but put scheduled workflows into their own group | |
concurrency: | |
group: ${{ | |
format('{0}-{1}{2}', | |
github.workflow, | |
github.event.pull_request.number || github.ref, | |
github.event_name == 'schedule' && '-scheduled' || '')}} | |
cancel-in-progress: true | |
jobs: | |
build: | |
strategy: | |
matrix: | |
ghc: ["8.10.7", "9.2.8", "9.6.5", "9.8.2"] | |
os: [ubuntu-latest] | |
fail-fast: false | |
runs-on: ${{ matrix.os }} | |
env: | |
# Modify this value to "invalidate" the cabal cache. | |
CABAL_CACHE_VERSION: "2023-07-17" | |
# current ref from: 27.02.2022 | |
SECP256K1_REF: ac83be33d0956faf6b7f61a60ab524ef7d6a473a | |
SECP_CACHE_VERSION: "2022-12-30" | |
defaults: | |
run: | |
shell: bash | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Install system dependencies | |
uses: input-output-hk/actions/base@latest | |
with: | |
use-sodium-vrf: false # default is true | |
- name: Install Haskell | |
id: install-haskell | |
uses: input-output-hk/actions/haskell@latest | |
with: | |
ghc-version: ${{ matrix.ghc }} | |
cabal-version: latest | |
- name: Configure to use libsodium | |
run: | | |
cat >> cabal.project <<EOF | |
package cardano-crypto-praos | |
flags: -external-libsodium-vrf | |
EOF | |
- name: Cabal update | |
run: cabal update | |
- name: Cabal configure | |
run: cabal configure --enable-tests --enable-benchmarks --write-ghc-environment-files=always | |
- uses: actions/cache@v4 | |
if: matrix.os != 'macos-latest' | |
name: Cache cabal store | |
with: | |
path: | | |
${{ steps.install-haskell.outputs.cabal-store }} | |
# cache is invalidated upon a change to cabal.project (and/or cabal.project.local), a bump to | |
# CABAL_CACHE_VERSION or after a week of inactivity | |
key: cache-${{ runner.os }}-${{ matrix.ghc }}-${{ env.CABAL_CACHE_VERSION }}-${{ hashFiles('cabal.project*') }} | |
# Restoring attempts are from current branch then master | |
restore-keys: | | |
cache-${{ runner.os }}-${{ matrix.ghc }}-${{ env.CABAL_CACHE_VERSION }}-${{ hashFiles('cabal.project*') }} | |
- name: Check workflow test matrix | |
run: cabal build all --dry-run && scripts/check-workflow-test-matrix.hs | |
- name: Build dependencies | |
run: cabal build all --only-dependencies | |
- name: Build | |
run: cabal build all | |
# Pass working directory to test jobs | |
- name: Archive working directory | |
# pax format is needed to avoid unnecessary rebuilding, because the | |
# default format uses a one-second resolution for timestamps | |
run: tar --format pax -cf /var/tmp/state.tar . && mv /var/tmp/state.tar . | |
- name: Upload working directory archive | |
# upload-artifact is pinned to avoid a bug in download-artifact | |
# See https://github.com/actions/download-artifact/issues/328 | |
uses: actions/[email protected] | |
with: | |
name: state-${{ matrix.ghc }}-${{ matrix.os }} | |
path: state.tar | |
overwrite: true | |
retention-days: 1 | |
test: | |
needs: build | |
strategy: | |
matrix: | |
package: | |
- byron-spec-chain | |
- byron-spec-ledger | |
- cardano-crypto-wrapper | |
- cardano-data | |
- cardano-ledger-allegra | |
- cardano-ledger-alonzo | |
- cardano-ledger-alonzo-test | |
- cardano-ledger-api | |
- cardano-ledger-babbage | |
- cardano-ledger-babbage-test | |
- cardano-ledger-binary | |
- cardano-ledger-byron | |
- cardano-ledger-conformance | |
- cardano-ledger-conway | |
- cardano-ledger-conway-test | |
- cardano-ledger-core | |
- cardano-ledger-mary | |
- cardano-ledger-shelley | |
- cardano-ledger-shelley-ma-test | |
- cardano-ledger-shelley-test | |
- cardano-ledger-test | |
- cardano-protocol-tpraos | |
- constrained-generators | |
- non-integral | |
- set-algebra | |
- small-steps | |
- vector-map | |
ghc: ["8.10.7", "9.2.8", "9.6.5", "9.8.2"] | |
os: [ubuntu-latest] | |
fail-fast: false | |
runs-on: ${{ matrix.os }} | |
name: ${{ matrix.package }}-${{ matrix.ghc }}-${{ matrix.os }} | |
env: | |
# Modify this value to "invalidate" the cabal cache. | |
CABAL_CACHE_VERSION: "2023-07-17" | |
# current ref from: 27.02.2022 | |
SECP256K1_REF: ac83be33d0956faf6b7f61a60ab524ef7d6a473a | |
SECP_CACHE_VERSION: "2022-12-30" | |
defaults: | |
run: | |
shell: bash | |
steps: | |
- name: Install system dependencies | |
uses: input-output-hk/actions/base@latest | |
with: | |
use-sodium-vrf: false # default is true | |
- name: Install Haskell | |
id: install-haskell | |
uses: input-output-hk/actions/haskell@latest | |
with: | |
ghc-version: ${{ matrix.ghc }} | |
cabal-version: latest | |
- name: Set up Ruby 2.7 | |
uses: ruby/setup-ruby@v1 | |
with: | |
ruby-version: 2.7 | |
- name: Install cbor-diag and cddl | |
run: | | |
gem install cddl -v 0.10.3 | |
gem install cbor-diag | |
- name: Download Mainnet Mirror | |
run: | | |
REF=a31ac75 | |
{ | |
curl -L https://github.com/input-output-hk/cardano-mainnet-mirror/tarball/$REF -o mainnet-mirror.tgz | |
tar -xzf mainnet-mirror.tgz | |
mv input-output-hk-cardano-mainnet-mirror-$REF/epochs . | |
} || | |
{ | |
git clone https://github.com/input-output-hk/cardano-mainnet-mirror | |
cd cardano-mainnet-mirror | |
git checkout $REF | |
mv epochs .. | |
cd .. | |
} | |
- name: Set NIGHTLY environment variable if the job was triggered by the scheduler | |
if: "${{ github.event_name == 'schedule' | |
|| contains(github.event.pull_request.title, 'nightly') | |
|| github.event_name == 'workflow_dispatch' && github.event.inputs.nightly }}" | |
run: | | |
echo "NIGHTLY=true" >> $GITHUB_ENV | |
# Retrieve working directory from build jobs | |
- name: Download working directory archive | |
uses: actions/download-artifact@v4 | |
with: | |
name: state-${{ matrix.ghc }}-${{ matrix.os }} | |
- name: Unarchive working directory | |
run: tar -xf state.tar && rm state.tar | |
- uses: actions/cache@v4 | |
if: matrix.os != 'macos-latest' | |
name: Cache cabal store | |
with: | |
path: | | |
${{ steps.install-haskell.outputs.cabal-store }} | |
# cache is invalidated upon a change to cabal.project (and/or cabal.project.local), a bump to | |
# CABAL_CACHE_VERSION or after a week of inactivity | |
key: cache-${{ runner.os }}-${{ matrix.ghc }}-${{ env.CABAL_CACHE_VERSION }}-${{ hashFiles('cabal.project*') }} | |
# Restoring attempts are from current branch then master | |
restore-keys: | | |
cache-${{ runner.os }}-${{ matrix.ghc }}-${{ env.CABAL_CACHE_VERSION }}-${{ hashFiles('cabal.project*') }} | |
- name: Cabal update | |
run: cabal update | |
- name: Run tests | |
run: | | |
export CARDANO_MAINNET_MIRROR="$(pwd)/epochs" | |
if [ -z "$NIGHTLY" ]; then | |
cabal test "${{ matrix.package }}" | |
else | |
TRIES=3 | |
scripts/cabal-test-with-retries.sh "${{ matrix.package }}" "$TRIES" | |
fi | |
complete: | |
name: Tests completed | |
runs-on: ubuntu-latest | |
needs: test | |
if: always() | |
steps: | |
- run: | | |
case ${{ needs.test.result }} in | |
success) | |
echo 'All tests completed successfully' | |
true;; | |
failure) | |
echo 'Some tests failed' | |
false;; | |
*) | |
echo 'Tests were ${{ needs.test.result }}' | |
false;; | |
esac | |
fourmolu: | |
runs-on: ubuntu-latest | |
defaults: | |
run: | |
shell: bash | |
strategy: | |
fail-fast: false | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Install fourmolu | |
run: | | |
FOURMOLU_VERSION="0.14.0.0" | |
mkdir -p "$HOME/.local/bin" | |
curl -sL "https://github.com/fourmolu/fourmolu/releases/download/v${FOURMOLU_VERSION}/fourmolu-${FOURMOLU_VERSION}-linux-x86_64" -o "$HOME/.local/bin/fourmolu" | |
chmod a+x "$HOME/.local/bin/fourmolu" | |
echo "$HOME/.local/bin" >> $GITHUB_PATH | |
- name: Run fourmolu | |
run: ./scripts/fourmolize.sh | |
cabal-format: | |
runs-on: ubuntu-latest | |
defaults: | |
run: | |
shell: bash | |
strategy: | |
fail-fast: false | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Format all cabal files | |
run: ./scripts/cabal-format.sh | |
gen-hie: | |
runs-on: ubuntu-latest | |
defaults: | |
run: | |
shell: bash | |
strategy: | |
fail-fast: false | |
steps: | |
- name: Cache implicit-hie executable (gen-hie) | |
id: cache-gen-hie | |
uses: actions/cache@v4 | |
with: | |
path: | | |
~/.cabal/bin/gen-hie | |
key: ${{ runner.os }}-cache-gen-hie | |
- name: Install gen-hie if not cached | |
if: steps.cache-gen-hie.outputs.cache-hit != 'true' | |
run: cabal update && cabal install implicit-hie --install-method=copy --overwrite-policy=always | |
- name: Add cabal-bin to PATH | |
run: echo "$HOME/.cabal/bin" >> $GITHUB_PATH | |
- uses: actions/checkout@v4 | |
- name: Regenerate hie.yaml and confirm that it is in sync | |
run: ./scripts/gen-hie.sh | |
branch-history: | |
name: Check branch history | |
runs-on: ubuntu-latest | |
if: ${{ github.base_ref != '' && github.ref != '' }} # Only true for PRs | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Ensure the branch doesn't contain any merges | |
run: | | |
PR_TARGET=${{ github.base_ref }} | |
PR_MERGE=${{ github.ref }} | |
PR_HEAD=${PR_MERGE%/merge}/head | |
git fetch origin -n --refmap= +$PR_TARGET:pr-target +$PR_HEAD:pr-head | |
if git log --merges --oneline --decorate pr-target..pr-head | grep .; then | |
echo 'Branch must not contain merges' | |
false | |
fi | |
notify-nightly-failure: | |
name: Send a slack notification on \#ledger-internal if the nightly build failed | |
runs-on: ubuntu-latest | |
needs: | |
- test | |
if: always() && github.event_name == 'schedule' && needs.test.result == 'failure' | |
steps: | |
- name: Send slack notification | |
id: slack | |
uses: slackapi/[email protected] | |
with: | |
payload: | | |
{ | |
"blocks": [ | |
{ | |
"type": "section", | |
"text": { | |
"type": "mrkdwn", | |
"text": "Nightly Github Actions build failed: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" | |
} | |
} | |
] | |
} | |
env: | |
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} | |
SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK |