Skip to content

WIP: Adding in fsync-like capabilities to HasBlockIO abstractions #2934

WIP: Adding in fsync-like capabilities to HasBlockIO abstractions

WIP: Adding in fsync-like capabilities to HasBlockIO abstractions #2934

Workflow file for this run

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-130824
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