From 0585623961125389427014284e200d390abe78bc Mon Sep 17 00:00:00 2001 From: Andreas Abel Date: Tue, 16 Dec 2025 20:16:01 +0100 Subject: [PATCH 1/4] Fix #130: support GHCup on 32bit architecture Allow 32bit architectures when constructing download path for GHCup. Closes #130. --- .github/workflows/workflow.yml | 72 ++++++++++++++++++++++++++++++++++ dist/index.js | 22 +++++++++-- lib/installer.js | 18 ++++++++- lib/opts.d.ts | 2 +- lib/opts.js | 4 +- src/installer.ts | 19 ++++++++- src/opts.ts | 6 +-- 7 files changed, 132 insertions(+), 11 deletions(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index 2fedf07..d8a17d8 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -301,3 +301,75 @@ jobs: echo "Returned stack-root: ${{ steps.setup.outputs.stack-root }}" exit 1 fi + + + # Test architecture ia32, see https://github.com/haskell-actions/setup/issues/130 + # + # From https://github.com/0rphee/cripto_final/actions/runs/20246908790/workflow + # https://github.com/0rphee/cripto_final/commit/403d115a61e4c6f960bf230e3b9149e1dee0c781 + ia32: + runs-on: ubuntu-latest + container: + image: 'i386/alpine:3.19' + volumes: + - /tmp:/__e/node24_alpine + # - /tmp:/__e/node20_alpine + permissions: + contents: read + steps: + + - name: Install system dependencies (Alpine) + run: | + apk update + apk add curl gcc g++ git gmp-dev libc-dev libffi-dev make musl-dev ncurses-dev perl tar xz bash + + - name: Install node for actions/checkout + run: | + apk add nodejs npm + mkdir -p /__e/node24_alpine/bin + ln -sf "$(which node)" /__e/node24_alpine/bin/node + ln -sf "$(which npm)" /__e/node24_alpine/bin/npm + ln -sf "$(which npx)" /__e/node24_alpine/bin/npx + # mkdir -p /__e/node20_alpine/bin + # ln -sf "$(which node)" /__e/node20_alpine/bin/node + # ln -sf "$(which npm)" /__e/node20_alpine/bin/npm + # ln -sf "$(which npx)" /__e/node20_alpine/bin/npx + + - uses: actions/checkout@v6 + + - uses: ./ + with: + ghc-version: latest + cabal-version: latest + enable-stack: false + + - name: Show installed versions and PATH + run: | + cabal --version + ghc --version + echo "$PATH" + + - name: Test runghc + run: | + runghc --version + runghc __tests__/hello.hs + + - name: Build test project + working-directory: __tests__/project + run: cabal build + + - name: Run test project + working-directory: __tests__/project + run: cabal run + + - name: Install test project + working-directory: __tests__/project + run: cabal install + + - name: Run installed test project + run: hello-haskell-setup + # This tests whether the default installdir has been added to the PATH (issue #130). + + - name: Build and run test with Hackage dependency + working-directory: __tests__/project-with-hackage-dependency + run: cabal build && cabal run diff --git a/dist/index.js b/dist/index.js index 752f551..107acc0 100644 --- a/dist/index.js +++ b/dist/index.js @@ -35191,6 +35191,22 @@ async function resetTool(tool, _version, os, arch) { return; } } +async function ghcupArchString(arch) { + switch (arch) { + case 'arm64': + return Promise.resolve('aarch64'); + case 'x64': + return Promise.resolve('x86_64'); + case 'arm': + return Promise.resolve('armv7'); + case 'ia32': + return Promise.resolve('i386'); + default: + const err = `Unsupported architecture: ${arch}`; + core.error(err); + return Promise.reject(err); + } +} async function stackArchString(arch) { switch (arch) { case 'arm64': @@ -35272,7 +35288,7 @@ async function ghcupBin(os, arch) { const cachedBin = tc.find('ghcup', opts_1.ghcup_version); if (cachedBin) return (0, path_1.join)(cachedBin, 'ghcup'); - const binArch = await stackArchString(arch); + const binArch = await ghcupArchString(arch); const bin = await tc.downloadTool(`https://downloads.haskell.org/ghcup/${opts_1.ghcup_version}/${binArch}-${os === 'darwin' ? 'apple-darwin' : 'linux'}-ghcup-${opts_1.ghcup_version}`); await fs_1.promises.chmod(bin, 0o755); return (0, path_1.join)(await tc.cacheFile(bin, 'ghcup', 'ghcup', opts_1.ghcup_version), 'ghcup'); @@ -35510,11 +35526,11 @@ function resolve(version, supported, tool, os, verbose // If resolution isn't th ) { const result = version === 'latest' ? supported[0] - : supported.find(v => v === version) ?? + : (supported.find(v => v === version) ?? supported.find(v => v.startsWith(version + '.')) ?? // Andreas, 2023-05-19, issue #248 // Append "." so that eg stack "2.1" resolves to "2.1.3" and not "2.11.1". - version; + version); // Andreas 2022-12-29, issue #144: inform about resolution here where we can also output ${tool}. if (verbose === true && version !== result) core.info(`Resolved ${tool} ${version} to ${result}`); diff --git a/lib/installer.js b/lib/installer.js index b5727aa..bb1e89f 100644 --- a/lib/installer.js +++ b/lib/installer.js @@ -215,6 +215,22 @@ async function resetTool(tool, _version, os, arch) { return; } } +async function ghcupArchString(arch) { + switch (arch) { + case 'arm64': + return Promise.resolve('aarch64'); + case 'x64': + return Promise.resolve('x86_64'); + case 'arm': + return Promise.resolve('armv7'); + case 'ia32': + return Promise.resolve('i386'); + default: + const err = `Unsupported architecture: ${arch}`; + core.error(err); + return Promise.reject(err); + } +} async function stackArchString(arch) { switch (arch) { case 'arm64': @@ -296,7 +312,7 @@ async function ghcupBin(os, arch) { const cachedBin = tc.find('ghcup', opts_1.ghcup_version); if (cachedBin) return (0, path_1.join)(cachedBin, 'ghcup'); - const binArch = await stackArchString(arch); + const binArch = await ghcupArchString(arch); const bin = await tc.downloadTool(`https://downloads.haskell.org/ghcup/${opts_1.ghcup_version}/${binArch}-${os === 'darwin' ? 'apple-darwin' : 'linux'}-ghcup-${opts_1.ghcup_version}`); await fs_1.promises.chmod(bin, 0o755); return (0, path_1.join)(await tc.cacheFile(bin, 'ghcup', 'ghcup', opts_1.ghcup_version), 'ghcup'); diff --git a/lib/opts.d.ts b/lib/opts.d.ts index 9bd22ab..fae5d45 100644 --- a/lib/opts.d.ts +++ b/lib/opts.d.ts @@ -6,7 +6,7 @@ export type Revisions = Record>>; export type OS = 'linux' | 'darwin' | 'win32'; -export type Arch = 'arm64' | 'x64'; +export type Arch = 'arm64' | 'x64' | 'arm' | 'ia32'; export type Tool = 'cabal' | 'ghc' | 'stack'; export interface ProgramOpt { enable: boolean; diff --git a/lib/opts.js b/lib/opts.js index a4c9601..98c5be9 100644 --- a/lib/opts.js +++ b/lib/opts.js @@ -98,11 +98,11 @@ function resolve(version, supported, tool, os, verbose // If resolution isn't th ) { const result = version === 'latest' ? supported[0] - : supported.find(v => v === version) ?? + : (supported.find(v => v === version) ?? supported.find(v => v.startsWith(version + '.')) ?? // Andreas, 2023-05-19, issue #248 // Append "." so that eg stack "2.1" resolves to "2.1.3" and not "2.11.1". - version; + version); // Andreas 2022-12-29, issue #144: inform about resolution here where we can also output ${tool}. if (verbose === true && version !== result) core.info(`Resolved ${tool} ${version} to ${result}`); diff --git a/src/installer.ts b/src/installer.ts index 5b972ae..c5c5fc3 100644 --- a/src/installer.ts +++ b/src/installer.ts @@ -221,6 +221,23 @@ export async function resetTool( } } +async function ghcupArchString(arch: Arch): Promise { + switch (arch) { + case 'arm64': + return Promise.resolve('aarch64'); + case 'x64': + return Promise.resolve('x86_64'); + case 'arm': + return Promise.resolve('armv7'); + case 'ia32': + return Promise.resolve('i386'); + default: + const err = `Unsupported architecture: ${arch}`; + core.error(err); + return Promise.reject(err); + } +} + async function stackArchString(arch: Arch): Promise { switch (arch) { case 'arm64': @@ -323,7 +340,7 @@ async function ghcupBin(os: OS, arch: Arch): Promise { const cachedBin = tc.find('ghcup', ghcup_version); if (cachedBin) return join(cachedBin, 'ghcup'); - const binArch = await stackArchString(arch); + const binArch = await ghcupArchString(arch); const bin = await tc.downloadTool( `https://downloads.haskell.org/ghcup/${ghcup_version}/${binArch}-${ os === 'darwin' ? 'apple-darwin' : 'linux' diff --git a/src/opts.ts b/src/opts.ts index b919513..8a0776f 100644 --- a/src/opts.ts +++ b/src/opts.ts @@ -14,7 +14,7 @@ export type Revisions = Record< Record> >; export type OS = 'linux' | 'darwin' | 'win32'; -export type Arch = 'arm64' | 'x64'; +export type Arch = 'arm64' | 'x64' | 'arm' | 'ia32'; export type Tool = 'cabal' | 'ghc' | 'stack'; export interface ProgramOpt { @@ -98,11 +98,11 @@ function resolve( const result = version === 'latest' ? supported[0] - : supported.find(v => v === version) ?? + : (supported.find(v => v === version) ?? supported.find(v => v.startsWith(version + '.')) ?? // Andreas, 2023-05-19, issue #248 // Append "." so that eg stack "2.1" resolves to "2.1.3" and not "2.11.1". - version; + version); // Andreas 2022-12-29, issue #144: inform about resolution here where we can also output ${tool}. if (verbose === true && version !== result) core.info(`Resolved ${tool} ${version} to ${result}`); From 056118c290cbb2773f1555c27e1ac2689d7787c7 Mon Sep 17 00:00:00 2001 From: Andreas Abel Date: Tue, 16 Dec 2025 20:22:04 +0100 Subject: [PATCH 2/4] WIP: CI: comment out most jobs --- .github/workflows/workflow.yml | 572 +++++++++++++++++---------------- 1 file changed, 287 insertions(+), 285 deletions(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index d8a17d8..5d4928b 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -15,292 +15,293 @@ defaults: shell: bash jobs: - test: - name: Unit Tests - ${{ matrix.os }} - runs-on: ${{ matrix.os }} - strategy: - matrix: - os: [ubuntu-latest, macOS-latest, windows-latest] - steps: - - uses: actions/checkout@v6 - - uses: actions/setup-node@v6 - with: - node-version: "24" - cache: "npm" - cache-dependency-path: package-lock.json - - run: npm ci --prefer-offline --no-audit --progress=false - - run: npm run bundle - - run: npm test - - name: Ensure generated files are up-to-date - run: git diff --exit-code dist/ lib/ - - install-haskell: - name: GHC ${{ matrix.plan.ghc }}, Cabal ${{ matrix.plan.cabal }} - ${{ matrix.os }} - runs-on: ${{ matrix.os }} - strategy: - - # Let's see how the other installs are doing and not fail on the first - fail-fast: false - - matrix: - os: [ubuntu-latest, macOS-latest, windows-latest] - plan: - - # Latest releases - - ghc: latest - cabal: latest - cabal_update: "true" - # cabal-3.12 build always needs a repo, so, `cabal update` is mandatory - - # Latest ghc with cabal head - - ghc: latest - cabal: head - cabal_update: "true" - - # Recent releases - - - ghc: "9.12" - cabal: "3.14" - cabal_update: "true" - - - ghc: "9.10" - cabal: "3.12" - cabal_update: "true" - - - ghc: "9.8" - cabal: "3.10" - cabal_update: "false" - - - ghc: "9.6" - cabal: "3.10" - cabal_update: "true" - # Test #210 (XDG): is the cabal store-dir set to something meaningful? - - - ghc: "9.4" - cabal: "3.10.2.1" - cabal_update: "false" - - - ghc: "9.2" - cabal: "3.10.2.0" - cabal_update: "false" - - # The following tests do not set 'cabal-update', which defaults to 'true' then. - - include: - - # Other macos - - - os: macos-15-intel - plan: - ghc: latest - cabal: latest - cabal_update: "true" - - - os: macos-14 - plan: - ghc: latest - cabal: latest - cabal_update: "true" - - # Some previously recommended releases of ghc with supported cabal - - - os: ubuntu-latest - plan: - ghc: "8.10" - cabal: "3.14.1.1" - - - os: ubuntu-latest - plan: - ghc: "8.8" - cabal: "3.14.1.0" - # cabal-3.0 install might have the Windows symlinking problem - # https://github.com/haskell/cabal/issues/5748 - - - os: ubuntu-latest - plan: - ghc: "8.6" - cabal: "3.12.1.0" - cabal_update: "true" - - # Test on ubuntu-24.04 with older ghc - - os: ubuntu-24.04 - plan: - ghc: "8.0" - cabal: "3.10.3.0" - cabal_update: "false" - - - os: ubuntu-22.04 - plan: - ghc: "8.0" - cabal: "3.10.2.1" - cabal_update: "false" - - # Test some old versions - - os: ubuntu-latest - plan: - ghc: "8.2.2" - cabal: "3.10.2.0" - cabal_update: "false" - - # Test ghcup pre-release channel - - os: ubuntu-latest - ghcup_release_channel: "https://raw.githubusercontent.com/haskell/ghcup-metadata/master/ghcup-prereleases-0.0.9.yaml" - plan: - ghc: "9.12.1.20250219" - # 2025-07-29: just not out yet: "9.10.2.20250725" - cabal: "latest" - - # Test ghc nightly - - os: ubuntu-latest - ghcup_release_channel: "https://ghc.gitlab.haskell.org/ghcup-metadata/ghcup-nightlies-0.0.7.yaml" - # 2025-07-29: 0.0.8 and 0.0.9 do not exist - plan: - ghc: "latest-nightly" - cabal: "latest" - - steps: - - uses: actions/checkout@v6 - - - uses: ./ - id: setup - with: - ghc-version: ${{ matrix.plan.ghc }} - ghcup-release-channel: ${{ matrix.ghcup_release_channel }} - cabal-version: ${{ matrix.plan.cabal }} - cabal-update: ${{ matrix.plan.cabal_update }} - - - name: Show installed versions and PATH - run: | - cabal --version - ghc --version - echo "$PATH" - - - name: Confirm resolved and installed versions match - shell: bash - run: | - CABALVER="$(cabal --numeric-version)" - GHCVER="$(ghc --numeric-version)" - echo "CABALVER=${CABALVER}" >> "${GITHUB_ENV}" - echo "GHCVER=${GHCVER}" >> "${GITHUB_ENV}" - if [[ "${{ steps.setup.outputs.ghc-version }}" == "latest-nightly" ]] - then - GHCVER_EXPECTED=$( \ - curl "${{ matrix.ghcup_release_channel }}" | \ - yq '.ghcupDownloads.GHC[] | select(.viTags[] | contains("LatestNightly")) | key' \ - ) - echo "Latest nightly: ${GHCVER_EXPECTED}" - else - GHCVER_EXPECTED="${{ steps.setup.outputs.ghc-version }}" - fi - if [[ "${{ steps.setup.outputs.cabal-version }}" == "head" ]] - then - CABALVER_EXPECTED=$( \ - curl --silent https://raw.githubusercontent.com/haskell/cabal/master/cabal-install/cabal-install.cabal | \ - sed -E -n 's/^Version:[[:space:]]+//p' \ - ) - echo "Cabal head: ${CABALVER_EXPECTED}" - else - CABALVER_EXPECTED="${{ steps.setup.outputs.cabal-version }}" - fi - [[ "${CABALVER_EXPECTED}" == ${CABALVER}* ]] && \ - [[ "${GHCVER}" == "${GHCVER_EXPECTED}" ]] - - - name: Test runghc - run: | - runghc --version - runghc __tests__/hello.hs - - - name: Build test project - working-directory: __tests__/project - run: cabal build - - - name: Run test project - working-directory: __tests__/project - run: cabal run - - - name: Install test project - working-directory: __tests__/project - run: cabal install - - - name: Run installed test project - run: hello-haskell-setup - # This tests whether the default installdir has been added to the PATH (issue #130). - - - name: Build and run test with Hackage dependency - if: ${{ matrix.plan.cabal_update != 'false' }} - working-directory: __tests__/project-with-hackage-dependency - run: cabal build && cabal run - - - name: Confirm installed and expected versions match - shell: bash - # check that if given in the matrix, the actual version matches: - # - cabal: major version - # - ghc: major and minor version - # pure bash startsWith - run: | - if [[ "${{ matrix.plan.cabal }}" =~ ^([0-9]+\.[0-9]+) ]]; then cabalmajor="${BASH_REMATCH[1]}"; fi - if [[ "${{ matrix.plan.ghc }}" =~ ^([0-9]+\.[0-9]+) ]]; then ghcmajor="${BASH_REMATCH[1]}"; fi - if [[ "${{ matrix.plan.ghc }}" =~ ^([0-9]+\.[0-9]+\.[0-9]+) ]]; then ghcver="${BASH_REMATCH[1]}"; fi - [[ "${CABALVER}" =~ ^"${cabalmajor}" ]] && [[ "${GHCVER}" =~ ^"${ghcmajor}" ]] && [[ "${GHCVER}" =~ ^"${ghcver}" ]] - - test-fallback: - name: Test GHC Installation Fallbacks - ${{ matrix.os }} - runs-on: ${{ matrix.os }} - strategy: - matrix: - os: [ubuntu-latest, macOS-latest, windows-latest] - steps: - - uses: actions/checkout@v6 - - uses: ./ - id: setup - env: - RUNNER_DEBUG: "1" - with: - ghc-version: 8.21.5 - - name: Error on success - if: steps.setup.outputs.failed != 'true' - # NB: 'failed' is an undeclared output of the setup action, used in debug mode - run: | - echo "Error: ghc 8.21.5 didn't fail to install" - - install-stack: - name: Stack ${{ matrix.stack }} ${{ matrix.os }} - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - os: [ubuntu-latest, macOS-latest, windows-latest] - stack: ["latest", "3.3.1"] - # test latest and recommended version of stack - - steps: - - uses: actions/checkout@v6 - - - uses: ./ - id: setup - with: - enable-stack: true - stack-no-global: true - stack-version: ${{ matrix.stack }} - - - run: | - stack --version - stack --help - - - name: Checking if returned stack-root output is correct - shell: bash - # NB: we invoke `stack path` twice, because the first time it - # might install things (like MSYS2 on Windows) which clobber the output. - run: | - stack path --system-ghc --stack-root - expected_stack_root=$(stack path --system-ghc --stack-root) - if [ "${expected_stack_root}" != "${{ steps.setup.outputs.stack-root }}" ]; then - echo "Stack-root does not match expected value" - echo "Expected stack-root: ${expected_stack_root}" - echo "Returned stack-root: ${{ steps.setup.outputs.stack-root }}" - exit 1 - fi + # test: + # name: Unit Tests - ${{ matrix.os }} + # runs-on: ${{ matrix.os }} + # strategy: + # matrix: + # os: [ubuntu-latest, macOS-latest, windows-latest] + # steps: + # - uses: actions/checkout@v6 + # - uses: actions/setup-node@v6 + # with: + # node-version: "24" + # cache: "npm" + # cache-dependency-path: package-lock.json + # - run: npm ci --prefer-offline --no-audit --progress=false + # - run: npm run bundle + # - run: npm test + # - name: Ensure generated files are up-to-date + # run: git diff --exit-code dist/ lib/ + + # install-haskell: + # name: GHC ${{ matrix.plan.ghc }}, Cabal ${{ matrix.plan.cabal }} - ${{ matrix.os }} + # runs-on: ${{ matrix.os }} + # strategy: + + # # Let's see how the other installs are doing and not fail on the first + # fail-fast: false + + # matrix: + # os: [ubuntu-latest, macOS-latest, windows-latest] + # plan: + + # # Latest releases + # - ghc: latest + # cabal: latest + # cabal_update: "true" + # # cabal-3.12 build always needs a repo, so, `cabal update` is mandatory + + # # Latest ghc with cabal head + # - ghc: latest + # cabal: head + # cabal_update: "true" + + # # Recent releases + + # - ghc: "9.12" + # cabal: "3.14" + # cabal_update: "true" + + # - ghc: "9.10" + # cabal: "3.12" + # cabal_update: "true" + + # - ghc: "9.8" + # cabal: "3.10" + # cabal_update: "false" + + # - ghc: "9.6" + # cabal: "3.10" + # cabal_update: "true" + # # Test #210 (XDG): is the cabal store-dir set to something meaningful? + + # - ghc: "9.4" + # cabal: "3.10.2.1" + # cabal_update: "false" + + # - ghc: "9.2" + # cabal: "3.10.2.0" + # cabal_update: "false" + + # # The following tests do not set 'cabal-update', which defaults to 'true' then. + + # include: + + # # Other macos + + # - os: macos-15-intel + # plan: + # ghc: latest + # cabal: latest + # cabal_update: "true" + + # - os: macos-14 + # plan: + # ghc: latest + # cabal: latest + # cabal_update: "true" + + # # Some previously recommended releases of ghc with supported cabal + + # - os: ubuntu-latest + # plan: + # ghc: "8.10" + # cabal: "3.14.1.1" + + # - os: ubuntu-latest + # plan: + # ghc: "8.8" + # cabal: "3.14.1.0" + # # cabal-3.0 install might have the Windows symlinking problem + # # https://github.com/haskell/cabal/issues/5748 + + # - os: ubuntu-latest + # plan: + # ghc: "8.6" + # cabal: "3.12.1.0" + # cabal_update: "true" + + # # Test on ubuntu-24.04 with older ghc + # - os: ubuntu-24.04 + # plan: + # ghc: "8.0" + # cabal: "3.10.3.0" + # cabal_update: "false" + + # - os: ubuntu-22.04 + # plan: + # ghc: "8.0" + # cabal: "3.10.2.1" + # cabal_update: "false" + + # # Test some old versions + # - os: ubuntu-latest + # plan: + # ghc: "8.2.2" + # cabal: "3.10.2.0" + # cabal_update: "false" + + # # Test ghcup pre-release channel + # - os: ubuntu-latest + # ghcup_release_channel: "https://raw.githubusercontent.com/haskell/ghcup-metadata/master/ghcup-prereleases-0.0.9.yaml" + # plan: + # ghc: "9.12.1.20250219" + # # 2025-07-29: just not out yet: "9.10.2.20250725" + # cabal: "latest" + + # # Test ghc nightly + # - os: ubuntu-latest + # ghcup_release_channel: "https://ghc.gitlab.haskell.org/ghcup-metadata/ghcup-nightlies-0.0.7.yaml" + # # 2025-07-29: 0.0.8 and 0.0.9 do not exist + # plan: + # ghc: "latest-nightly" + # cabal: "latest" + + # steps: + # - uses: actions/checkout@v6 + + # - uses: ./ + # id: setup + # with: + # ghc-version: ${{ matrix.plan.ghc }} + # ghcup-release-channel: ${{ matrix.ghcup_release_channel }} + # cabal-version: ${{ matrix.plan.cabal }} + # cabal-update: ${{ matrix.plan.cabal_update }} + + # - name: Show installed versions and PATH + # run: | + # cabal --version + # ghc --version + # echo "$PATH" + + # - name: Confirm resolved and installed versions match + # shell: bash + # run: | + # CABALVER="$(cabal --numeric-version)" + # GHCVER="$(ghc --numeric-version)" + # echo "CABALVER=${CABALVER}" >> "${GITHUB_ENV}" + # echo "GHCVER=${GHCVER}" >> "${GITHUB_ENV}" + # if [[ "${{ steps.setup.outputs.ghc-version }}" == "latest-nightly" ]] + # then + # GHCVER_EXPECTED=$( \ + # curl "${{ matrix.ghcup_release_channel }}" | \ + # yq '.ghcupDownloads.GHC[] | select(.viTags[] | contains("LatestNightly")) | key' \ + # ) + # echo "Latest nightly: ${GHCVER_EXPECTED}" + # else + # GHCVER_EXPECTED="${{ steps.setup.outputs.ghc-version }}" + # fi + # if [[ "${{ steps.setup.outputs.cabal-version }}" == "head" ]] + # then + # CABALVER_EXPECTED=$( \ + # curl --silent https://raw.githubusercontent.com/haskell/cabal/master/cabal-install/cabal-install.cabal | \ + # sed -E -n 's/^Version:[[:space:]]+//p' \ + # ) + # echo "Cabal head: ${CABALVER_EXPECTED}" + # else + # CABALVER_EXPECTED="${{ steps.setup.outputs.cabal-version }}" + # fi + # [[ "${CABALVER_EXPECTED}" == ${CABALVER}* ]] && \ + # [[ "${GHCVER}" == "${GHCVER_EXPECTED}" ]] + + # - name: Test runghc + # run: | + # runghc --version + # runghc __tests__/hello.hs + + # - name: Build test project + # working-directory: __tests__/project + # run: cabal build + + # - name: Run test project + # working-directory: __tests__/project + # run: cabal run + + # - name: Install test project + # working-directory: __tests__/project + # run: cabal install + + # - name: Run installed test project + # run: hello-haskell-setup + # # This tests whether the default installdir has been added to the PATH (issue #130). + + # - name: Build and run test with Hackage dependency + # if: ${{ matrix.plan.cabal_update != 'false' }} + # working-directory: __tests__/project-with-hackage-dependency + # run: cabal build && cabal run + + # - name: Confirm installed and expected versions match + # shell: bash + # # check that if given in the matrix, the actual version matches: + # # - cabal: major version + # # - ghc: major and minor version + # # pure bash startsWith + # run: | + # if [[ "${{ matrix.plan.cabal }}" =~ ^([0-9]+\.[0-9]+) ]]; then cabalmajor="${BASH_REMATCH[1]}"; fi + # if [[ "${{ matrix.plan.ghc }}" =~ ^([0-9]+\.[0-9]+) ]]; then ghcmajor="${BASH_REMATCH[1]}"; fi + # if [[ "${{ matrix.plan.ghc }}" =~ ^([0-9]+\.[0-9]+\.[0-9]+) ]]; then ghcver="${BASH_REMATCH[1]}"; fi + # [[ "${CABALVER}" =~ ^"${cabalmajor}" ]] && [[ "${GHCVER}" =~ ^"${ghcmajor}" ]] && [[ "${GHCVER}" =~ ^"${ghcver}" ]] + + # test-fallback: + # name: Test GHC Installation Fallbacks - ${{ matrix.os }} + # runs-on: ${{ matrix.os }} + # strategy: + # matrix: + # os: [ubuntu-latest, macOS-latest, windows-latest] + # steps: + # - uses: actions/checkout@v6 + # - uses: ./ + # id: setup + # env: + # RUNNER_DEBUG: "1" + # with: + # ghc-version: 8.21.5 + # - name: Error on success + # if: steps.setup.outputs.failed != 'true' + # # NB: 'failed' is an undeclared output of the setup action, used in debug mode + # run: | + # echo "Error: ghc 8.21.5 didn't fail to install" + + # install-stack: + # name: Stack ${{ matrix.stack }} ${{ matrix.os }} + # runs-on: ${{ matrix.os }} + # strategy: + # fail-fast: false + # matrix: + # os: [ubuntu-latest, macOS-latest, windows-latest] + # stack: ["latest", "3.3.1"] + # # test latest and recommended version of stack + + # steps: + # - uses: actions/checkout@v6 + + # - uses: ./ + # id: setup + # with: + # enable-stack: true + # stack-no-global: true + # stack-version: ${{ matrix.stack }} + + # - run: | + # stack --version + # stack --help + + # - name: Checking if returned stack-root output is correct + # shell: bash + # # NB: we invoke `stack path` twice, because the first time it + # # might install things (like MSYS2 on Windows) which clobber the output. + # run: | + # stack path --system-ghc --stack-root + # expected_stack_root=$(stack path --system-ghc --stack-root) + + # if [ "${expected_stack_root}" != "${{ steps.setup.outputs.stack-root }}" ]; then + # echo "Stack-root does not match expected value" + # echo "Expected stack-root: ${expected_stack_root}" + # echo "Returned stack-root: ${{ steps.setup.outputs.stack-root }}" + # exit 1 + # fi # Test architecture ia32, see https://github.com/haskell-actions/setup/issues/130 @@ -319,6 +320,7 @@ jobs: steps: - name: Install system dependencies (Alpine) + shell: sh run: | apk update apk add curl gcc g++ git gmp-dev libc-dev libffi-dev make musl-dev ncurses-dev perl tar xz bash From 39c661ac2e1cf45ff207da4d0ca44e46a449e6e0 Mon Sep 17 00:00:00 2001 From: Andreas Abel Date: Tue, 16 Dec 2025 20:26:54 +0100 Subject: [PATCH 3/4] WIP CI: disable stack --- .github/workflows/workflow.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index 5d4928b..793beff 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -343,7 +343,7 @@ jobs: with: ghc-version: latest cabal-version: latest - enable-stack: false + # enable-stack: 'false' - name: Show installed versions and PATH run: | From 1ce8b19d02a56018ac3423f7598c98f174eadb76 Mon Sep 17 00:00:00 2001 From: Andreas Abel Date: Tue, 16 Dec 2025 20:35:20 +0100 Subject: [PATCH 4/4] WIP CI: reenable rest of workflow --- .github/workflows/workflow.yml | 583 ++++++++++++++++----------------- 1 file changed, 291 insertions(+), 292 deletions(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index 793beff..0115f57 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -16,305 +16,306 @@ defaults: jobs: - # test: - # name: Unit Tests - ${{ matrix.os }} - # runs-on: ${{ matrix.os }} - # strategy: - # matrix: - # os: [ubuntu-latest, macOS-latest, windows-latest] - # steps: - # - uses: actions/checkout@v6 - # - uses: actions/setup-node@v6 - # with: - # node-version: "24" - # cache: "npm" - # cache-dependency-path: package-lock.json - # - run: npm ci --prefer-offline --no-audit --progress=false - # - run: npm run bundle - # - run: npm test - # - name: Ensure generated files are up-to-date - # run: git diff --exit-code dist/ lib/ - - # install-haskell: - # name: GHC ${{ matrix.plan.ghc }}, Cabal ${{ matrix.plan.cabal }} - ${{ matrix.os }} - # runs-on: ${{ matrix.os }} - # strategy: - - # # Let's see how the other installs are doing and not fail on the first - # fail-fast: false - - # matrix: - # os: [ubuntu-latest, macOS-latest, windows-latest] - # plan: - - # # Latest releases - # - ghc: latest - # cabal: latest - # cabal_update: "true" - # # cabal-3.12 build always needs a repo, so, `cabal update` is mandatory - - # # Latest ghc with cabal head - # - ghc: latest - # cabal: head - # cabal_update: "true" - - # # Recent releases - - # - ghc: "9.12" - # cabal: "3.14" - # cabal_update: "true" - - # - ghc: "9.10" - # cabal: "3.12" - # cabal_update: "true" - - # - ghc: "9.8" - # cabal: "3.10" - # cabal_update: "false" - - # - ghc: "9.6" - # cabal: "3.10" - # cabal_update: "true" - # # Test #210 (XDG): is the cabal store-dir set to something meaningful? - - # - ghc: "9.4" - # cabal: "3.10.2.1" - # cabal_update: "false" - - # - ghc: "9.2" - # cabal: "3.10.2.0" - # cabal_update: "false" - - # # The following tests do not set 'cabal-update', which defaults to 'true' then. - - # include: - - # # Other macos - - # - os: macos-15-intel - # plan: - # ghc: latest - # cabal: latest - # cabal_update: "true" - - # - os: macos-14 - # plan: - # ghc: latest - # cabal: latest - # cabal_update: "true" - - # # Some previously recommended releases of ghc with supported cabal - - # - os: ubuntu-latest - # plan: - # ghc: "8.10" - # cabal: "3.14.1.1" - - # - os: ubuntu-latest - # plan: - # ghc: "8.8" - # cabal: "3.14.1.0" - # # cabal-3.0 install might have the Windows symlinking problem - # # https://github.com/haskell/cabal/issues/5748 - - # - os: ubuntu-latest - # plan: - # ghc: "8.6" - # cabal: "3.12.1.0" - # cabal_update: "true" - - # # Test on ubuntu-24.04 with older ghc - # - os: ubuntu-24.04 - # plan: - # ghc: "8.0" - # cabal: "3.10.3.0" - # cabal_update: "false" - - # - os: ubuntu-22.04 - # plan: - # ghc: "8.0" - # cabal: "3.10.2.1" - # cabal_update: "false" - - # # Test some old versions - # - os: ubuntu-latest - # plan: - # ghc: "8.2.2" - # cabal: "3.10.2.0" - # cabal_update: "false" - - # # Test ghcup pre-release channel - # - os: ubuntu-latest - # ghcup_release_channel: "https://raw.githubusercontent.com/haskell/ghcup-metadata/master/ghcup-prereleases-0.0.9.yaml" - # plan: - # ghc: "9.12.1.20250219" - # # 2025-07-29: just not out yet: "9.10.2.20250725" - # cabal: "latest" - - # # Test ghc nightly - # - os: ubuntu-latest - # ghcup_release_channel: "https://ghc.gitlab.haskell.org/ghcup-metadata/ghcup-nightlies-0.0.7.yaml" - # # 2025-07-29: 0.0.8 and 0.0.9 do not exist - # plan: - # ghc: "latest-nightly" - # cabal: "latest" - - # steps: - # - uses: actions/checkout@v6 - - # - uses: ./ - # id: setup - # with: - # ghc-version: ${{ matrix.plan.ghc }} - # ghcup-release-channel: ${{ matrix.ghcup_release_channel }} - # cabal-version: ${{ matrix.plan.cabal }} - # cabal-update: ${{ matrix.plan.cabal_update }} - - # - name: Show installed versions and PATH - # run: | - # cabal --version - # ghc --version - # echo "$PATH" - - # - name: Confirm resolved and installed versions match - # shell: bash - # run: | - # CABALVER="$(cabal --numeric-version)" - # GHCVER="$(ghc --numeric-version)" - # echo "CABALVER=${CABALVER}" >> "${GITHUB_ENV}" - # echo "GHCVER=${GHCVER}" >> "${GITHUB_ENV}" - # if [[ "${{ steps.setup.outputs.ghc-version }}" == "latest-nightly" ]] - # then - # GHCVER_EXPECTED=$( \ - # curl "${{ matrix.ghcup_release_channel }}" | \ - # yq '.ghcupDownloads.GHC[] | select(.viTags[] | contains("LatestNightly")) | key' \ - # ) - # echo "Latest nightly: ${GHCVER_EXPECTED}" - # else - # GHCVER_EXPECTED="${{ steps.setup.outputs.ghc-version }}" - # fi - # if [[ "${{ steps.setup.outputs.cabal-version }}" == "head" ]] - # then - # CABALVER_EXPECTED=$( \ - # curl --silent https://raw.githubusercontent.com/haskell/cabal/master/cabal-install/cabal-install.cabal | \ - # sed -E -n 's/^Version:[[:space:]]+//p' \ - # ) - # echo "Cabal head: ${CABALVER_EXPECTED}" - # else - # CABALVER_EXPECTED="${{ steps.setup.outputs.cabal-version }}" - # fi - # [[ "${CABALVER_EXPECTED}" == ${CABALVER}* ]] && \ - # [[ "${GHCVER}" == "${GHCVER_EXPECTED}" ]] - - # - name: Test runghc - # run: | - # runghc --version - # runghc __tests__/hello.hs - - # - name: Build test project - # working-directory: __tests__/project - # run: cabal build - - # - name: Run test project - # working-directory: __tests__/project - # run: cabal run - - # - name: Install test project - # working-directory: __tests__/project - # run: cabal install - - # - name: Run installed test project - # run: hello-haskell-setup - # # This tests whether the default installdir has been added to the PATH (issue #130). - - # - name: Build and run test with Hackage dependency - # if: ${{ matrix.plan.cabal_update != 'false' }} - # working-directory: __tests__/project-with-hackage-dependency - # run: cabal build && cabal run - - # - name: Confirm installed and expected versions match - # shell: bash - # # check that if given in the matrix, the actual version matches: - # # - cabal: major version - # # - ghc: major and minor version - # # pure bash startsWith - # run: | - # if [[ "${{ matrix.plan.cabal }}" =~ ^([0-9]+\.[0-9]+) ]]; then cabalmajor="${BASH_REMATCH[1]}"; fi - # if [[ "${{ matrix.plan.ghc }}" =~ ^([0-9]+\.[0-9]+) ]]; then ghcmajor="${BASH_REMATCH[1]}"; fi - # if [[ "${{ matrix.plan.ghc }}" =~ ^([0-9]+\.[0-9]+\.[0-9]+) ]]; then ghcver="${BASH_REMATCH[1]}"; fi - # [[ "${CABALVER}" =~ ^"${cabalmajor}" ]] && [[ "${GHCVER}" =~ ^"${ghcmajor}" ]] && [[ "${GHCVER}" =~ ^"${ghcver}" ]] - - # test-fallback: - # name: Test GHC Installation Fallbacks - ${{ matrix.os }} - # runs-on: ${{ matrix.os }} - # strategy: - # matrix: - # os: [ubuntu-latest, macOS-latest, windows-latest] - # steps: - # - uses: actions/checkout@v6 - # - uses: ./ - # id: setup - # env: - # RUNNER_DEBUG: "1" - # with: - # ghc-version: 8.21.5 - # - name: Error on success - # if: steps.setup.outputs.failed != 'true' - # # NB: 'failed' is an undeclared output of the setup action, used in debug mode - # run: | - # echo "Error: ghc 8.21.5 didn't fail to install" - - # install-stack: - # name: Stack ${{ matrix.stack }} ${{ matrix.os }} - # runs-on: ${{ matrix.os }} - # strategy: - # fail-fast: false - # matrix: - # os: [ubuntu-latest, macOS-latest, windows-latest] - # stack: ["latest", "3.3.1"] - # # test latest and recommended version of stack - - # steps: - # - uses: actions/checkout@v6 - - # - uses: ./ - # id: setup - # with: - # enable-stack: true - # stack-no-global: true - # stack-version: ${{ matrix.stack }} - - # - run: | - # stack --version - # stack --help - - # - name: Checking if returned stack-root output is correct - # shell: bash - # # NB: we invoke `stack path` twice, because the first time it - # # might install things (like MSYS2 on Windows) which clobber the output. - # run: | - # stack path --system-ghc --stack-root - # expected_stack_root=$(stack path --system-ghc --stack-root) - - # if [ "${expected_stack_root}" != "${{ steps.setup.outputs.stack-root }}" ]; then - # echo "Stack-root does not match expected value" - # echo "Expected stack-root: ${expected_stack_root}" - # echo "Returned stack-root: ${{ steps.setup.outputs.stack-root }}" - # exit 1 - # fi + test: + name: Unit Tests - ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, macOS-latest, windows-latest] + steps: + - uses: actions/checkout@v6 + - uses: actions/setup-node@v6 + with: + node-version: "24" + cache: "npm" + cache-dependency-path: package-lock.json + - run: npm ci --prefer-offline --no-audit --progress=false + - run: npm run bundle + - run: npm test + - name: Ensure generated files are up-to-date + run: git diff --exit-code dist/ lib/ + + install-haskell: + name: GHC ${{ matrix.plan.ghc }}, Cabal ${{ matrix.plan.cabal }} - ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + + # Let's see how the other installs are doing and not fail on the first + fail-fast: false + + matrix: + os: [ubuntu-latest, macOS-latest, windows-latest] + plan: + + # Latest releases + - ghc: latest + cabal: latest + cabal_update: "true" + # cabal-3.12 build always needs a repo, so, `cabal update` is mandatory + + # Latest ghc with cabal head + - ghc: latest + cabal: head + cabal_update: "true" + + # Recent releases + + - ghc: "9.12" + cabal: "3.14" + cabal_update: "true" + + - ghc: "9.10" + cabal: "3.12" + cabal_update: "true" + + - ghc: "9.8" + cabal: "3.10" + cabal_update: "false" + + - ghc: "9.6" + cabal: "3.10" + cabal_update: "true" + # Test #210 (XDG): is the cabal store-dir set to something meaningful? + + - ghc: "9.4" + cabal: "3.10.2.1" + cabal_update: "false" + + - ghc: "9.2" + cabal: "3.10.2.0" + cabal_update: "false" + + # The following tests do not set 'cabal-update', which defaults to 'true' then. + + include: + + # Other macos + + - os: macos-15-intel + plan: + ghc: latest + cabal: latest + cabal_update: "true" + + - os: macos-14 + plan: + ghc: latest + cabal: latest + cabal_update: "true" + + # Some previously recommended releases of ghc with supported cabal + + - os: ubuntu-latest + plan: + ghc: "8.10" + cabal: "3.14.1.1" + + - os: ubuntu-latest + plan: + ghc: "8.8" + cabal: "3.14.1.0" + # cabal-3.0 install might have the Windows symlinking problem + # https://github.com/haskell/cabal/issues/5748 + + - os: ubuntu-latest + plan: + ghc: "8.6" + cabal: "3.12.1.0" + cabal_update: "true" + + # Test on ubuntu-24.04 with older ghc + - os: ubuntu-24.04 + plan: + ghc: "8.0" + cabal: "3.10.3.0" + cabal_update: "false" + + - os: ubuntu-22.04 + plan: + ghc: "8.0" + cabal: "3.10.2.1" + cabal_update: "false" + + # Test some old versions + - os: ubuntu-latest + plan: + ghc: "8.2.2" + cabal: "3.10.2.0" + cabal_update: "false" + + # Test ghcup pre-release channel + - os: ubuntu-latest + ghcup_release_channel: "https://raw.githubusercontent.com/haskell/ghcup-metadata/master/ghcup-prereleases-0.0.9.yaml" + plan: + ghc: "9.12.1.20250219" + # 2025-07-29: just not out yet: "9.10.2.20250725" + cabal: "latest" + + # Test ghc nightly + - os: ubuntu-latest + ghcup_release_channel: "https://ghc.gitlab.haskell.org/ghcup-metadata/ghcup-nightlies-0.0.7.yaml" + # 2025-07-29: 0.0.8 and 0.0.9 do not exist + plan: + ghc: "latest-nightly" + cabal: "latest" + + steps: + - uses: actions/checkout@v6 + + - uses: ./ + id: setup + with: + ghc-version: ${{ matrix.plan.ghc }} + ghcup-release-channel: ${{ matrix.ghcup_release_channel }} + cabal-version: ${{ matrix.plan.cabal }} + cabal-update: ${{ matrix.plan.cabal_update }} + + - name: Show installed versions and PATH + run: | + cabal --version + ghc --version + echo "$PATH" + + - name: Confirm resolved and installed versions match + shell: bash + run: | + CABALVER="$(cabal --numeric-version)" + GHCVER="$(ghc --numeric-version)" + echo "CABALVER=${CABALVER}" >> "${GITHUB_ENV}" + echo "GHCVER=${GHCVER}" >> "${GITHUB_ENV}" + if [[ "${{ steps.setup.outputs.ghc-version }}" == "latest-nightly" ]] + then + GHCVER_EXPECTED=$( \ + curl "${{ matrix.ghcup_release_channel }}" | \ + yq '.ghcupDownloads.GHC[] | select(.viTags[] | contains("LatestNightly")) | key' \ + ) + echo "Latest nightly: ${GHCVER_EXPECTED}" + else + GHCVER_EXPECTED="${{ steps.setup.outputs.ghc-version }}" + fi + if [[ "${{ steps.setup.outputs.cabal-version }}" == "head" ]] + then + CABALVER_EXPECTED=$( \ + curl --silent https://raw.githubusercontent.com/haskell/cabal/master/cabal-install/cabal-install.cabal | \ + sed -E -n 's/^Version:[[:space:]]+//p' \ + ) + echo "Cabal head: ${CABALVER_EXPECTED}" + else + CABALVER_EXPECTED="${{ steps.setup.outputs.cabal-version }}" + fi + [[ "${CABALVER_EXPECTED}" == ${CABALVER}* ]] && \ + [[ "${GHCVER}" == "${GHCVER_EXPECTED}" ]] + + - name: Test runghc + run: | + runghc --version + runghc __tests__/hello.hs + + - name: Build test project + working-directory: __tests__/project + run: cabal build + + - name: Run test project + working-directory: __tests__/project + run: cabal run + + - name: Install test project + working-directory: __tests__/project + run: cabal install + + - name: Run installed test project + run: hello-haskell-setup + # This tests whether the default installdir has been added to the PATH (issue #130). + + - name: Build and run test with Hackage dependency + if: ${{ matrix.plan.cabal_update != 'false' }} + working-directory: __tests__/project-with-hackage-dependency + run: cabal build && cabal run + + - name: Confirm installed and expected versions match + shell: bash + # check that if given in the matrix, the actual version matches: + # - cabal: major version + # - ghc: major and minor version + # pure bash startsWith + run: | + if [[ "${{ matrix.plan.cabal }}" =~ ^([0-9]+\.[0-9]+) ]]; then cabalmajor="${BASH_REMATCH[1]}"; fi + if [[ "${{ matrix.plan.ghc }}" =~ ^([0-9]+\.[0-9]+) ]]; then ghcmajor="${BASH_REMATCH[1]}"; fi + if [[ "${{ matrix.plan.ghc }}" =~ ^([0-9]+\.[0-9]+\.[0-9]+) ]]; then ghcver="${BASH_REMATCH[1]}"; fi + [[ "${CABALVER}" =~ ^"${cabalmajor}" ]] && [[ "${GHCVER}" =~ ^"${ghcmajor}" ]] && [[ "${GHCVER}" =~ ^"${ghcver}" ]] + + test-fallback: + name: Test GHC Installation Fallbacks - ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, macOS-latest, windows-latest] + steps: + - uses: actions/checkout@v6 + - uses: ./ + id: setup + env: + RUNNER_DEBUG: "1" + with: + ghc-version: 8.21.5 + - name: Error on success + if: steps.setup.outputs.failed != 'true' + # NB: 'failed' is an undeclared output of the setup action, used in debug mode + run: | + echo "Error: ghc 8.21.5 didn't fail to install" + + install-stack: + name: Stack ${{ matrix.stack }} ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macOS-latest, windows-latest] + stack: ["latest", "3.3.1"] + # test latest and recommended version of stack + + steps: + - uses: actions/checkout@v6 + + - uses: ./ + id: setup + with: + enable-stack: true + stack-no-global: true + stack-version: ${{ matrix.stack }} + + - run: | + stack --version + stack --help + + - name: Checking if returned stack-root output is correct + shell: bash + # NB: we invoke `stack path` twice, because the first time it + # might install things (like MSYS2 on Windows) which clobber the output. + run: | + stack path --system-ghc --stack-root + expected_stack_root=$(stack path --system-ghc --stack-root) + + if [ "${expected_stack_root}" != "${{ steps.setup.outputs.stack-root }}" ]; then + echo "Stack-root does not match expected value" + echo "Expected stack-root: ${expected_stack_root}" + echo "Returned stack-root: ${{ steps.setup.outputs.stack-root }}" + exit 1 + fi # Test architecture ia32, see https://github.com/haskell-actions/setup/issues/130 + ################################################################################# # # From https://github.com/0rphee/cripto_final/actions/runs/20246908790/workflow # https://github.com/0rphee/cripto_final/commit/403d115a61e4c6f960bf230e3b9149e1dee0c781 + # ia32: runs-on: ubuntu-latest container: image: 'i386/alpine:3.19' volumes: - /tmp:/__e/node24_alpine - # - /tmp:/__e/node20_alpine permissions: contents: read steps: @@ -332,10 +333,6 @@ jobs: ln -sf "$(which node)" /__e/node24_alpine/bin/node ln -sf "$(which npm)" /__e/node24_alpine/bin/npm ln -sf "$(which npx)" /__e/node24_alpine/bin/npx - # mkdir -p /__e/node20_alpine/bin - # ln -sf "$(which node)" /__e/node20_alpine/bin/node - # ln -sf "$(which npm)" /__e/node20_alpine/bin/npm - # ln -sf "$(which npx)" /__e/node20_alpine/bin/npx - uses: actions/checkout@v6 @@ -343,7 +340,9 @@ jobs: with: ghc-version: latest cabal-version: latest - # enable-stack: 'false' + + # Copy of steps from main job + ############################################################ - name: Show installed versions and PATH run: |