alexandria/content/Hacks/nixos-ci.md
Youwen Wu c40ae72f80
Some checks are pending
Deploy Quartz site to GitHub Pages using Nix / build (push) Waiting to run
Deploy Quartz site to GitHub Pages using Nix / deploy (push) Blocked by required conditions
chore: some metadata updates and fixes
2025-01-02 03:27:09 -08:00

1.6 KiB

id aliases tags title
nixos-ci
nixos
nixpkgs
Continuous integration in Nix projects

This is where I'm keeping all of my research and notes on continuous integration in the Nix ecosystem.

One of the very powerful parts of using Nix to manage your project builds and dependencies is being able to have one single source of truth, for development, deployment, and CI. You write your Nix expressions once and get the same environment everywhere. No need to specify dependencies again and again for every single environment. Mitchell Hashimoto has written about this extensively on his blog.

Basic GitHub action

A habit I've gotten into is setting up CI for every single project I work on and really putting those GitHub actions free minutes to use. It's so trivial when using Nix, since you literally don't have to do anything extra the majority of the time. Just copy paste in a GitHub action that installs Nix and runs nix build. That's it.

name: "Check and build flake"
on:
  pull_request:
  push:
    branches: [main]

jobs:
  lints:
    name: Build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Check flake inputs
        uses: DeterminateSystems/flake-checker-action@v4
      - name: Install Nix
        uses: DeterminateSystems/nix-installer-action@main
      - uses: DeterminateSystems/magic-nix-cache-action@main
      - run: nix flake check --all-systems
      - run: nix build .

This action can basically be dropped in as-is to a Nix project and start providing basic CI.