Skip to content

Make stacklock2nix work even if no local packages are specified #179

Make stacklock2nix work even if no local packages are specified

Make stacklock2nix work even if no local packages are specified #179

Workflow file for this run

name: CI
# Trigger the workflow on push or pull request, but only for the master branch
on:
pull_request:
push:
branches: [main]
jobs:
# This workflow defines two different jobs that are very similar:
# nix-commit-from-ci and nix-commit-from-flake-lock.
#
# The difference is what version of stacklock2nix is used in the
# my-example-haskell-lib-easy/flake.lock and
# my-example-haskell-lib-advanced/flake.lock files.
#
# nix-commit-from-ci uses the stacklock2nix dependency from the code that is
# running through CI. This is what you'd expect to be tested.
#
# nix-commit-from-flake-lock uses the version of stacklock2nix that is locked
# in the respective flake.lock files.
#
# This is only necessary because Nix's relative-path support for flakes is broken:
#
# - https://github.com/NixOS/nix/issues/3978
# - https://discourse.nixos.org/t/relative-path-support-for-nix-flakes/18795
#
# Because Nix's relative-path support for flakes is broken, the
# my-example-haskell-lib-easy/flake.lock and
# my-example-haskell-lib-advanced/flake.lock files are locked to
# the upstream stacklock2nix repo on GitHub, instead of just the repository top-level
# flake.nix.
#
# It is necessary to test these two Haskell projects against the version of
# stacklock2nix that is locked in the two flake.lock files because end-users
# might try to directly use one of the Haskell projects without updating the
# stacklock2nix to the latest version. The expectation is that they will
# work as-is.
nix-commit-from-ci:
name: nix / ubuntu-latest / using stacklock2nix commit from CI
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: cachix/install-nix-action@v22
- uses: DeterminateSystems/magic-nix-cache-action@v1
- name: Check that easy project and advanced project are locked to same Nixpkgs
run: |
are_same=$(nix eval --impure --expr 'let easy-rev = (builtins.fromJSON (builtins.readFile ./my-example-haskell-lib-easy/flake.lock)).nodes.nixpkgs.locked.rev; advanced-rev = (builtins.fromJSON (builtins.readFile ./my-example-haskell-lib-advanced/flake.lock)).nodes.nixpkgs.locked.rev; in easy-rev == advanced-rev')
if [ "$are_same" != "true" ]; then
echo "ERROR: The ./my-example-haskell-lib-easy/flake.lock and ./my-example-haskell-lib-advanced/flake.lock files are locked to different versions of Nixpkgs"
exit 1
fi
# The ./my-example-haskell-lib-easy/flake.nix is locked to the main
# branch of stacklock2nix, but we want to use the stacklock2nix that is
# currently being tested here in CI.
- name: "Easy Example: Update Flake stacklock2nix Input"
run: |
sed -i -e 's|^ inputs.stacklock2nix.url = .*$| inputs.stacklock2nix.url = "path:'"$(realpath ..)"'";|' ./flake.nix
cat ./flake.nix
nix flake lock --update-input stacklock2nix
cat ./flake.lock
working-directory: "./my-example-haskell-lib-easy/"
- name: "Advanced Example: Update Flake stacklock2nix Input"
run: |
sed -i -e 's|^ inputs.stacklock2nix.url = .*$| inputs.stacklock2nix.url = "path:'"$(realpath ..)"'";|' ./flake.nix
cat ./flake.nix
nix flake lock --update-input stacklock2nix
cat ./flake.lock
working-directory: "./my-example-haskell-lib-advanced/"
- name: "Easy Example: Build with Nix"
run: nix build -L
working-directory: "./my-example-haskell-lib-easy/"
- name: "Easy Example: Build with Cabal"
run: "nix develop -L --command cabal build all"
working-directory: "./my-example-haskell-lib-easy/"
- name: "Easy Example: Test with Cabal"
run: "nix develop -L --command cabal test all"
working-directory: "./my-example-haskell-lib-easy/"
- name: "Advanced Example: Build with Nix"
run: nix build -L
working-directory: "./my-example-haskell-lib-advanced/"
- name: "Advanced Example: Generate my-example-haskell-lib/my-example-haskell-lib.cabal"
run: "nix develop -L --command hpack my-example-haskell-lib"
working-directory: "./my-example-haskell-lib-advanced/"
- name: "Advanced Example: Build with Cabal"
run: "nix develop -L --command cabal build all"
working-directory: "./my-example-haskell-lib-advanced/"
- name: "Advanced Example: Test with Cabal"
run: "nix develop -L --command cabal test all"
working-directory: "./my-example-haskell-lib-advanced/"
- name: "Tests"
run: "nix-build"
working-directory: "./test/"
nix-commit-from-flake-lock:
name: nix / ubuntu-latest / using stacklock2nix commit from flake.lock
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: cachix/install-nix-action@v22
- uses: DeterminateSystems/magic-nix-cache-action@v1
- name: "Easy Example: Build with Nix"
run: nix build -L
working-directory: "./my-example-haskell-lib-easy/"
- name: "Easy Example: Build with Cabal"
run: "nix develop -L --command cabal build all"
working-directory: "./my-example-haskell-lib-easy/"
- name: "Easy Example: Test with Cabal"
run: "nix develop -L --command cabal test all"
working-directory: "./my-example-haskell-lib-easy/"
- name: "Advanced Example: Build with Nix"
run: nix build -L
working-directory: "./my-example-haskell-lib-advanced/"
- name: "Advanced Example: Generate my-example-haskell-lib/my-example-haskell-lib.cabal"
run: "nix develop -L --command hpack my-example-haskell-lib"
working-directory: "./my-example-haskell-lib-advanced/"
- name: "Advanced Example: Build with Cabal"
run: "nix develop -L --command cabal build all"
working-directory: "./my-example-haskell-lib-advanced/"
- name: "Advanced Example: Test with Cabal"
run: "nix develop -L --command cabal test all"
working-directory: "./my-example-haskell-lib-advanced/"