Files
nix-config/outputs

Flake Outputs

Is such a complex and fine-grained structure necessary?

There is no need to do this when you have a small number of machines.

But when you have a large number of machines, it is necessary to manage them in a fine-grained way, otherwise, it will be difficult to manage and maintain them.

Tests

We have two types of tests: eval tests and nixos tests.

Related projects & docs:

1. Eval Tests

Eval Tests evaluate the expressions and compare the results with the expected results. It runs fast, but it doesn't build a real machine. We use eval tests to ensure that some attributes are correctly set for each NixOS host(not Darwin).

How to run all the eval tests:

nix eval .#evalTests --show-trace --print-build-logs --verbose

2. NixOS Tests

WIP: not working yet

NixOS Tests builds and starts virtual machines using our NixOS configuration and run tests on them. Comparing to eval tests, it runs slow, but it builds a real machine, and we can test the whole system actually works as expected.

Problems:

  • We need a private cache server, so that our NixOS tests do not need to build some custom packages every time we run the tests.
  • Cannot test the whole host, because my host relies on its unique ssh host key to decrypt its agenix secrets.
    • Maybe it's better to test every service separately, not the whole host?

How to run NixOS tests for every host:

# Format: nix build .#<name>-nixos-tests

nix build .#ruby-nixos-tests

Overview

All the outputs of this flake are defined here.

 tree
.
├── default.nix       # The entry point, all the outputs are composed here.
├── README.md
├── aarch64-darwin    # All outputs for macOS Apple Silicon
│   ├── default.nix
│   └── src           # every host has its own file in this directory
│       └── fern.nix
├── aarch64-linux     # All outputs for Linux ARM64
│   ├── default.nix
│   └── src           # every host has its own file in this directory
│   │   ├── 12kingdoms-rakushun.nix
│   │   └── 12kingdoms-suzu.nix
│   └── tests         # eval tests
│       └── hostname
│           ├── expected.nix
│           └── expr.nix
├── riscv64-linux     # All outputs for Linux RISCV64
│   ├── default.nix
│   └── src           # every host has its own file in this directory
│   │   ├── rolling-girls-nozomi.nix
│   │   └── rolling-girls-yukina.nix
│   └── tests         # eval tests
│       └── hostname
│           ├── expected.nix
│           └── expr.nix
├── x86_64-darwin     # All outputs for macOS Intel
│   ├── default.nix
│   └── src
│       └── harnomica.nix
└── x86_64-linux      # All outputs for Linux x86_64
    ├── default.nix
    ├── nixos-tests
│   └── src           # every host has its own file in this directory
    │   ├── 12kingdoms-shoukei.nix
    │   ├── homelab-tailscale-gw.nix
    │   ├── idols-ai.nix
    │   ├── idols-aquamarine.nix
    │   ├── idols-kana.nix
    │   ├── idols-ruby.nix
    │   ├── k3s-prod-1-master-1.nix
    │   ├── k3s-prod-1-master-2.nix
    │   ├── k3s-prod-1-master-3.nix
    │   ├── k3s-prod-1-worker-1.nix
    │   ├── k3s-prod-1-worker-2.nix
    │   ├── k3s-prod-1-worker-3.nix
    │   ├── kubevirt-shoryu.nix
    │   ├── kubevirt-shushou.nix
    │   └── kubevirt-youko.nix
    └── tests         # eval tests
        ├── home-manager
        │   ├── expected.nix
        │   └── expr.nix
        └── hostname
            ├── expected.nix
            └── expr.nix