From 0420bba83107a0400f09eddee6b2562cf0da4446 Mon Sep 17 00:00:00 2001 From: Ting-Gian LUA Date: Thu, 21 Nov 2024 13:56:30 +0800 Subject: [PATCH] [ ci ] Make Agda binary distributable hence cachable --- .github/workflows/test.yml | 104 +++++++++++++++++++++++++++++++------ 1 file changed, 88 insertions(+), 16 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f51e0aee..a21f9618 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -22,7 +22,8 @@ jobs: strategy: matrix: os: [windows-latest, ubuntu-latest, macos-latest] - agda: ["Agda-2.6.4", "Agda-2.7.0"] + agda: ["Agda-2.7.0"] + # agda: ["Agda-2.6.4", "Agda-2.7.0"] fail-fast: false # Steps represent a sequence of tasks that will be executed as part of the job @@ -41,9 +42,11 @@ jobs: cabal-update: false enable-stack: true + # $DIST is where the binary & its dependencies is placed - name: 🛠️ Setting variables run: | echo "STACK_LOCAL_BIN=$(stack path --local-bin)" >> "$GITHUB_ENV" + echo "DIST=${{ matrix.agda }}-${{ matrix.os }}" >> "$GITHUB_ENV" - name: 🔍 Reviewing variables run: | @@ -53,10 +56,12 @@ jobs: echo "stack-path = ${{ steps.haskell-setup.outputs.stack-path }}" echo "stack-exe = ${{ steps.haskell-setup.outputs.stack-exe }}" echo "stack-root = ${{ steps.haskell-setup.outputs.stack-root }}" - echo "STACK_LOCAL_BIN = $STACK_LOCAL_BIN" + echo "STACK_LOCAL_BIN = $STACK_LOCAL_BIN" + echo "DIST = $DIST" # cached stuff to be restored: - name: 💾 Restore cached stack global package db + # if : runner.os == 'Windows' id: stack-global uses: actions/cache/restore@v4 with: @@ -66,6 +71,7 @@ jobs: ${{ runner.os }}-stack-global - name: 💾 Restore stack-installed binaries in ~/.local/bin + # if : runner.os == 'Windows' id: stack-binaries uses: actions/cache/restore@v4 with: @@ -74,40 +80,105 @@ jobs: restore-keys: | ${{ runner.os }}-stack-binaries + - name: 💾 Restore Agda from ${{ env.DIST }} + id: agda-artefacts + uses: actions/cache/restore@v4 + with: + path: ${{ env.DIST }} + key: ${{ env.DIST }} + restore-keys: | + ${{ env.DIST }} + - name: ⏬ Setup Node.js environment uses: actions/setup-node@v4 with: node-version: 20.x - - - name: 🛠️ Add Stack install directory to PATH - run: echo $STACK_LOCAL_BIN >> $GITHUB_PATH + - name: 🛠️ Add ${{ env.DIST }} to PATH + run: echo ${{ env.DIST }} >> $GITHUB_PATH + - name: 🔍 Check if Agda has been installed id: check-agda continue-on-error: true - run: which agda + run: | + which agda + agda -V + agda --print-agda-dir + + - name: 📦 Setup ${{ env.DIST }} + continue-on-error: true + run: | + dist=${{ env.DIST }} + mkdir -p "${dist}" + mkdir -p "${dist}"/data - name: ⏬ Install Agda - if: ${{ steps.check-agda.outcome == 'failure'}} + # if: ${{ steps.check-agda.outcome == 'failure'}} run: | stack install --resolver=lts-20.26 ${{ matrix.agda }} + + # Copy Agda_datadir: + cp -a $(agda --print-agda-dir) ${{ env.DIST }}/data + + # Setting the $Agda_datadir environment variable as "${dist}"/data + echo "Agda_datadir=${{ env.DIST }}/data" >> "$GITHUB_ENV" + + + - name: 📦 Move artefacts to ${{ env.DIST }} + continue-on-error: true + run: | + + echo "Copied $(agda --print-agda-dir) to ${{ env.Agda_datadir }}" + echo "Agda_datadir = $Agda_datadir" + echo "inside Agda_datadir= " + ls -a ${{ env.Agda_datadir }} + + + dist=${{ env.DIST }} + + if [[ ${{ runner.os }} == "Windows" ]]; then + cp "${{ env.STACK_LOCAL_BIN }}"/agda.exe "${dist}" + strip "${dist}"/agda.exe + file "${dist}"/agda.exe + + else + cp "${{ env.STACK_LOCAL_BIN }}"/agda "${dist}" + strip "${dist}"/agda + file "${dist}"/agda + fi + + ls -a "${dist}"/data + + - name: 🔍 Check if Agda has been installed again + continue-on-error: true + run: | which agda - agda --version + agda -V + agda --print-agda-dir # things to be cached - name: 💾 Cache stack global package db - if: always() && env.AGDA_INSTALLED != '0' && steps.stack-global.outputs.cache-hit != 'true' + if: always() && steps.stack-global.outputs.cache-hit != 'true' + # if: always() && steps.stack-global.outputs.cache-hit != 'true' && ${{ runner.os }} == 'Windows' uses: actions/cache/save@v4 with: path: ${{ steps.haskell-setup.outputs.stack-root }} key: ${{ steps.stack-global.outputs.cache-primary-key }} - name: 💾 Cache stack-installed binaries - if: always() && env.AGDA_INSTALLED != '0' && steps.stack-binaries.outputs.cache-hit != 'true' + if: always() && steps.stack-binaries.outputs.cache-hit != 'true' + # if: always() && steps.stack-binaries.outputs.cache-hit != 'true' && ${{ runner.os }} == 'Windows' uses: actions/cache/save@v4 with: path: ${{ env.STACK_LOCAL_BIN }} key: ${{ steps.stack-binaries.outputs.cache-primary-key }} + + - name: 💾 Cache Agda in ${{ env.DIST }} + if: always() && steps.agda-artefacts.outputs.cache-hit != 'true' + uses: actions/cache/save@v4 + with: + path: ${{ env.DIST }} + key: ${{ steps.agda-artefacts.outputs.cache-primary-key }} - name: ⏬ Install NPM Dependencies run: npm install @@ -115,10 +186,11 @@ jobs: - name: 🔨 Build stuff run: npm run build - - name: 🚗 Run tests (Linux) - if: runner.os == 'Linux' - run: xvfb-run -a npm test + - name: 🚗 Run tests + run: | + if [[ ${{ runner.os }} == "Linux" ]]; then + xvfb-run -a npm test + else + npm test + fi - - name: 🚗 Run tests (Windows, MacOS) - if: runner.os != 'Linux' - run: npm test