Haskell CI #3056
Workflow file for this run
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 | |
on: | |
push: | |
branches: [ "main" ] | |
pull_request: | |
merge_group: | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} | |
cancel-in-progress: true | |
permissions: | |
contents: read | |
jobs: | |
# Build and test | |
build: | |
runs-on: ${{ matrix.os }} | |
strategy: | |
fail-fast: false | |
matrix: | |
# TODO: Change "9.12.0.20241031" --> "9.12.1" after official release | |
ghc: ["8.10.7", "9.2.8", "9.4.8", "9.6.4", "9.8.2", "9.10.1", "9.12.0.20241031"] | |
cabal: ["3.10.2.1"] | |
os: [ubuntu-latest, windows-latest, macOS-latest] | |
cabal-flags: [""] | |
cabal-project-file: ["cabal.project.debug"] | |
exclude: | |
- ghc: "8.10.7" | |
os: macOS-latest | |
include: | |
- ghc: "8.10.7" | |
cabal: "3.10.2.1" | |
os: macOS-13 | |
cabal-project-file: "cabal.project.debug" | |
- ghc: "9.6.4" | |
cabal: "3.10.2.1" | |
os: ubuntu-latest | |
cabal-flags: "+serialblockio" | |
cabal-project-file: "cabal.project.debug" | |
- ghc: "9.6.4" | |
cabal: "3.10.2.1" | |
os: ubuntu-latest | |
cabal-project-file: "cabal.project.release" | |
timeout-minutes: 60 | |
steps: | |
- name: CPU info (macOS) | |
if: ${{ startsWith(matrix.os, 'macOS') }} | |
run: sysctl -a machdep.cpu | |
- name: CPU info (Linux) | |
if: ${{ startsWith(matrix.os, 'ubuntu') }} | |
run: cat /proc/cpuinfo | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
- name: Setup Haskell | |
id: setup-haskell | |
uses: haskell-actions/setup@v2 | |
with: | |
ghc-version: ${{ matrix.ghc }} | |
cabal-version: ${{ matrix.cabal }} | |
cabal-update: true | |
# TODO: remove once 9.12.1 is officially released | |
ghcup-release-channel: https://raw.githubusercontent.com/haskell/ghcup-metadata/master/ghcup-prereleases-0.0.8.yaml | |
- name: Install liburing (on Linux) | |
id: setup-liburing | |
if: ${{ startsWith(matrix.os, 'ubuntu') }} | |
run: | | |
sudo apt-get update || true | |
sudo apt-get -y install liburing-dev | |
sudo apt-get -y install librocksdb-dev | |
- name: Configure the build | |
run: | | |
cabal configure --project-file="${{ matrix.cabal-project-file }}" --enable-tests --enable-benchmark --ghc-options="-Werror" --flag="${{ matrix.cabal-flags }}" | |
cat "${{ matrix.cabal-project-file }}.local" | |
- name: Record cabal dependencies | |
id: record-deps | |
run: | | |
cabal build all --project-file="${{ matrix.cabal-project-file }}" --dry-run | |
- name: "Restore cache" | |
uses: actions/cache/restore@v4 | |
id: restore-cabal-cache | |
env: | |
cache-name: cache-cabal-build-031224 | |
with: | |
path: ${{ steps.setup-haskell.outputs.cabal-store }} | |
key: ${{ runner.os }}-${{ matrix.ghc }}-${{ env.cache-name }}-${{ hashFiles('*.cabal') }}-${{ hashFiles('cabal.project*') }}-${{ matrix.cabal-project-file }} | |
restore-keys: | | |
${{ runner.os }}-${{ matrix.ghc }}-${{ env.cache-name }}-${{ hashFiles('*.cabal') }}-${{ hashFiles('cabal.project*') }} | |
${{ runner.os }}-${{ matrix.ghc }}-${{ env.cache-name }}-${{ hashFiles('*.cabal') }}- | |
${{ runner.os }}-${{ matrix.ghc }}-${{ env.cache-name }}- | |
- name: Install cabal dependencies | |
id: build-dependencies | |
run: | | |
cabal build --project-file="${{ matrix.cabal-project-file }}" --only-dependencies --enable-tests --enable-benchmarks all | |
- name: "Save cache" | |
uses: actions/cache/save@v4 | |
id: save-cabal-cache | |
# Note: cache-hit will be set to true only when cache hit occurs for the | |
# exact key match. For a partial key match via restore-keys or a cache | |
# miss, it will be set to false. | |
if: steps.build-dependencies.outcome == 'success' && steps.restore-cabal-cache.outputs.cache-hit != 'true' | |
with: | |
path: ${{ steps.setup-haskell.outputs.cabal-store }} | |
key: ${{ steps.restore-cabal-cache.outputs.cache-primary-key }} | |
- name: Build | |
run: | | |
cabal build all --project-file="${{ matrix.cabal-project-file }}" | |
# https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#setting-an-environment-variable | |
- name: Set test timeout (Unix) | |
if: ${{ startsWith(matrix.os, 'ubuntu') || startsWith(matrix.os, 'macOS') }} | |
run: | | |
echo "TASTY_TIMEOUT=5m" >> "$GITHUB_ENV" | |
# https://github.com/actions/runner/issues/2281#issuecomment-1326748709 | |
- name: Set test timeout (Windows) | |
if: ${{ startsWith(matrix.os, 'windows') }} | |
run: | | |
echo "TASTY_TIMEOUT=5m" >> "$env:GITHUB_ENV" | |
- name: Run tests | |
run: | | |
cabal test -j1 --test-show-details=direct all --project-file="${{ matrix.cabal-project-file }}" | |
- name: cabal-docspec | |
if: ${{ startsWith(matrix.os, 'ubuntu') }} | |
run: | | |
curl -sL https://github.com/phadej/cabal-extras/releases/download/cabal-docspec-0.0.0.20240414/cabal-docspec-0.0.0.20240414-x86_64-linux.xz > cabal-docspec.xz | |
echo '2d18a3f79619e8ec5f11870f926f6dc2616e02a6c889315b7f82044b95a1adb9 cabal-docspec.xz' | sha256sum -c - | |
xz -d < cabal-docspec.xz > ./cabal-docspec | |
chmod a+x ./cabal-docspec | |
./cabal-docspec --extra-package lsm-tree:prototypes -XOverloadedStrings -XNumericUnderscores -XTypeApplications | |
# Check formatting for Haskell files | |
stylish-haskell: | |
runs-on: ${{ matrix.os }} | |
strategy: | |
fail-fast: false | |
matrix: | |
ghc: ["9.6.4"] | |
cabal: ["3.10.2.1"] | |
os: [ubuntu-latest] | |
# Fix the index-state so we can get proper caching effects. Change this to a | |
# more recent time if you want to use a newer version of stylish-haskell, or | |
# if you want stylish-haskell to use updated dependencies. | |
# | |
# We use this environment variable in the primary key of our caches, and as | |
# an argument to cabal install. This ensures that we never rebuild | |
# dependencies because of newly uploaded packages unless we want to. | |
env: | |
hackage-index-state: "2024-04-10T14:36:07Z" | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
- name: Setup Haskell | |
id: setup-haskell | |
uses: haskell-actions/setup@v2 | |
with: | |
ghc-version: ${{ matrix.ghc }} | |
cabal-version: ${{ matrix.cabal }} | |
cabal-update: false | |
- name: Cabal update | |
run: | | |
cabal update --ignore-project | |
- name: Setup cabal bin path | |
run: echo "$HOME/.cabal/bin" >> $GITHUB_PATH | |
- name: Cache cabal store | |
uses: actions/cache@v4 | |
env: | |
cache-name: cache-cabal-stylish | |
with: | |
path: ${{ steps.setup-haskell.outputs.cabal-store }} | |
key: ${{ runner.os }}-${{ matrix.ghc }}-${{ env.cache-name }}-${{ env.hackage-index-state }} | |
restore-keys: | | |
${{ runner.os }}-${{ matrix.ghc }}-${{ env.cache-name }}- | |
- name: Install stylish-haskell | |
run: | | |
cabal install --ignore-project --index-state="${{ env.hackage-index-state }}" stylish-haskell --constraint 'stylish-haskell == 0.14.6.0' | |
- name: Record stylish-haskell version | |
run: | | |
which stylish-haskell | |
stylish-haskell --version | |
- name: Run stylish-haskell | |
run: | | |
./scripts/format-stylish.sh | |
git diff --exit-code | |
# Check formatting for cabal files | |
cabal-fmt: | |
runs-on: ${{ matrix.os }} | |
strategy: | |
fail-fast: false | |
matrix: | |
ghc: ["9.6.4"] | |
cabal: ["3.10.2.1"] | |
os: [ubuntu-latest] | |
# See the comment on the hackage-index-state environment variable for the | |
# stylish-haskell job. | |
env: | |
hackage-index-state: "2024-04-27T12:31:04Z" | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
- name: Setup Haskell | |
id: setup-haskell | |
uses: haskell-actions/setup@v2 | |
with: | |
ghc-version: ${{ matrix.ghc }} | |
cabal-version: ${{ matrix.cabal }} | |
cabal-update: false | |
- name: Cabal update | |
run: | | |
cabal update --ignore-project | |
- name: Setup cabal bin path | |
run: echo "$HOME/.cabal/bin" >> $GITHUB_PATH | |
- name: Cache cabal store | |
uses: actions/cache@v4 | |
env: | |
cache-name: cache-cabal-cabal-fmt-11 | |
with: | |
path: ${{ steps.setup-haskell.outputs.cabal-store }} | |
key: ${{ runner.os }}-${{ matrix.ghc }}-${{ env.cache-name }}-${{ env.hackage-index-state }} | |
restore-keys: | | |
${{ runner.os }}-${{ matrix.ghc }}-${{ env.cache-name }}- | |
- name: Install cabal-fmt | |
run: | | |
cabal install --ignore-project cabal-fmt --index-state="${{ env.hackage-index-state }}" --constraint 'cabal-fmt == 0.1.12' | |
- name: Record cabal-fmt version | |
run: | | |
which cabal-fmt | |
cabal-fmt --version | |
- name: Run cabal-fmt | |
run: | | |
./scripts/format-cabal.sh | |
git diff --exit-code | |
# Check cabal files | |
cabal-check: | |
runs-on: ${{ matrix.os }} | |
strategy: | |
fail-fast: false | |
matrix: | |
ghc: ["9.6.4"] | |
cabal: ["3.10.2.1"] | |
os: [ubuntu-latest] | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
- name: Setup Haskell | |
id: setup-haskell | |
uses: haskell-actions/setup@v2 | |
with: | |
ghc-version: ${{ matrix.ghc }} | |
cabal-version: ${{ matrix.cabal }} | |
cabal-update: false | |
- name: Cabal update | |
run: | |
cabal update --ignore-project | |
- name: Run cabal check | |
run: | | |
./scripts/check-cabal.sh | |
# HLint | |
hlint: | |
runs-on: ubuntu-latest | |
strategy: | |
fail-fast: false | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
- name: 'Set up HLint' | |
uses: haskell-actions/hlint-setup@v2 | |
with: | |
version: '3.8' | |
- name: 'Run HLint' | |
uses: haskell-actions/hlint-run@v2 | |
with: | |
path: '[ "src/", "test/", "src-extras/", "src-fcntl-nocache/", "src-kmerge/", "src-mcg/", "src-monkey/", "src-rocksdb/" ]' | |
fail-on: suggestion |