Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions .github/actions/setup-nix/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
name: Setup Nix
description: Install Nix with dev shell and optional KVM support

inputs:
enable-kvm:
description: Enable KVM for NixOS VM tests
default: 'false'

runs:
using: composite
steps:
- name: Enable KVM group permissions
if: inputs.enable-kvm == 'true'
shell: bash
run: |
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm

- name: Install Nix
uses: cachix/install-nix-action@v31
with:
extra_nix_config: |
experimental-features = nix-command flakes
system-features = nixos-test benchmark big-parallel kvm

- name: Setup magic-nix-cache
uses: DeterminateSystems/magic-nix-cache-action@main

- name: Install direnv
shell: bash
run: |
nix profile install nixpkgs#direnv nixpkgs#nix-direnv
echo 'source $HOME/.nix-profile/share/nix-direnv/direnvrc' >> "$HOME/.direnvrc"

- name: Load dev shell environment
shell: bash
run: |
direnv allow .
direnv export json | jq -r 'to_entries[] | select(.value | contains("\n") | not) | "\(.key)=\(.value)"' >> "$GITHUB_ENV"
91 changes: 91 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
name: CI

on:
push:
branches: [master, main]
pull_request:

env:
CARGO_TERM_COLOR: always
RUSTFLAGS: "-D warnings"

jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Setup Nix
uses: ./.github/actions/setup-nix

- name: Cache cargo
uses: Swatinem/rust-cache@v2

- name: Check formatting
run: cargo fmt --all -- --check

- name: Run clippy
run: cargo clippy --all-targets --all-features -- -D warnings

- name: Build all crates
run: cargo build --all-targets

- name: Run unit tests
run: cargo test --workspace --exclude portalbd-dst

dst-quick:
runs-on: ubuntu-latest
needs: [check]
steps:
- uses: actions/checkout@v4

- name: Setup Nix
uses: ./.github/actions/setup-nix

- name: Cache cargo
uses: Swatinem/rust-cache@v2

- name: Run quick DST (100 iterations)
env:
RUSTFLAGS: "--cfg tokio_unstable"
run: cargo test -p portalbd-dst simulation

build:
runs-on: ubuntu-latest
needs: [check]
steps:
- uses: actions/checkout@v4

- name: Setup Nix
uses: ./.github/actions/setup-nix

- name: Build portalbd
run: nix build

nixos-tests:
runs-on: ubuntu-latest
needs: [build]
strategy:
fail-fast: false
matrix:
test:
- basic
- crash-recovery
- snapshot-semantics
- resource-exhaustion
- pjdfs
- csi-node
- csi-k3s
- trace-mkfs
- trace-pgbench
- trace-minecraft
steps:
- uses: actions/checkout@v4

- name: Setup Nix
uses: ./.github/actions/setup-nix
with:
enable-kvm: 'true'

- name: Run ${{ matrix.test }} test
run: nix run -L .#test-${{ matrix.test }}
43 changes: 43 additions & 0 deletions .github/workflows/nightly.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
name: Nightly DST

on:
schedule:
# Run at 2 AM UTC every day
- cron: '0 2 * * *'
workflow_dispatch:
inputs:
seed:
description: 'Optional seed for reproducible DST run'
required: false
type: string

env:
CARGO_TERM_COLOR: always

jobs:
dst-nightly:
runs-on: ubuntu-latest
timeout-minutes: 120
steps:
- uses: actions/checkout@v4

- name: Setup Nix
uses: ./.github/actions/setup-nix

- name: Run nightly DST (long-running)
env:
RUSTFLAGS: "--cfg tokio_unstable"
DST_SEED: ${{ inputs.seed }}
run: |
echo "Starting nightly DST run at $(date)"
cargo test -p portalbd-dst simulation -- --ignored --nocapture
echo "Completed nightly DST run at $(date)"

- name: Upload failure artifacts
if: failure()
uses: actions/upload-artifact@v4
with:
name: dst-failure-${{ github.run_id }}
path: target/dst-failures/
if-no-files-found: ignore
retention-days: 30
Loading