Carl Sagan once said, “If you wish to make an apple pie from scratch, you must first invent the universe.” In the world of software, creating a reproducible build environment is the universe you need to invent. This post will walk you through using Nix in tandem with Gitea Actions to make that universe a reality for your projects.
I am an enthusiastic user of Nix and am a maintainer of several packages. I appreciate the reproducibility of the binaries it offers across different systems and its rapid update cycle.
Gitea Actions is a CI/CD solution that can run your build and deployment tasks. Using Nix within Gitea Actions is as straightforward as adding a few lines to your workflow file. Here’s how:
name: nix on: push: jobs: lint-backend: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Install dependencies for Nix setup action run: | apt update -y apt install sudo -y - uses: cachix/install-nix-action@v22 with: nix_path: nixpkgs=channel:nixos-unstable - name: Test running command with Nix run: nix-shell -p hello --run "hello"
This workflow will install Nix and then execute the
hello command. Note that we need to install
sudo, as it is a prerequisite for the
cachix/install-nix-action and is not present in the default Gitea Actions runner image. If you’re using a custom runner that already has sudo installed, feel free to skip that step.
Regarding the Nix package channel, I prefer to live on the bleeding edge with
nixpkgs=channel:nixos-unstable. However, you’re free to pin to a more stable channel if you wish. The
cachix/install-nix-action Action does not have a channel configured by default, so you must specify one.
If you haven’t explored Nix yet, I highly recommend you do so. It’s a powerful tool for creating consistent and reproducible build environments.