Files
sow-tools/flake.nix
T
archvillainette 978e2913f6
ci / ci (pull_request) Successful in 3m28s
fix(nwsync): pin emitter version, ship the shim, harden manifest reads
Review follow-ups on the same work:

- emitter_version is its own sidecar field, not the build revision. Keying
  the merge check on created_with invalidated every published index on every
  unrelated crucible commit, forcing a re-emit of the whole corpus.
- flake.nix builds cmd/crucible-nwsync, so Nix consumers get the binary the
  docs promise.
- readManifest uses io.ReadFull: bytes.Reader.Read can return a short count
  with no error, so a truncated manifest parsed into zero-padded garbage.
- emit refuses a .mod outright and names why, rather than failing on an
  unknown extension.
- SOURCE_DATE_EPOCH pins the sidecar timestamp; the manifest was already
  deterministic.
- Entry.identity replaces the resref/restype key struct duplicated in emit
  and assemble.

Refs #53.
2026-07-29 12:17:08 +02:00

91 lines
3.0 KiB
Nix

{
description = "sow-tools / Crucible — NWN build/conversion/sync toolchain (self-contained Go devshell)";
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
outputs = { self, nixpkgs }:
let
systems = [ "x86_64-linux" "aarch64-linux" ];
forAllSystems = f: nixpkgs.lib.genAttrs systems (system: f nixpkgs.legacyPackages.${system});
in
{
# Self-contained (D8): a host with ONLY nix can enter this shell and run
# `make check`.
# Daemonless image build (D8): `nix build .#image` produces an OCI tarball
# with no docker/podman daemon. CI loads/pushes it with skopeo. This is the
# Nix-native replacement for `docker build` on the host-mode runner, which
# has no container runtime.
packages = forAllSystems (pkgs:
let
version = self.shortRev or self.dirtyShortRev or "unknown";
crucible = pkgs.buildGoModule {
pname = "crucible";
inherit version;
src = ./.;
vendorHash = "sha256-0I8j7On9YGD2GK9xbj/KkgBrlkMJ6Y6XQv+KCLTgBBU=";
subPackages = [
"cmd/crucible"
"cmd/crucible-depot"
"cmd/crucible-hak"
"cmd/crucible-module"
"cmd/crucible-nwsync"
"cmd/crucible-topdata"
"cmd/crucible-wiki"
];
env.CGO_ENABLED = 0;
ldflags = [
"-s"
"-w"
"-X git.westgate.pw/ShadowsOverWestgate/sow-tools/internal/buildinfo.Version=${version}"
];
# Unit tests run in the `test` workflow / `make check`, not here.
doCheck = false;
};
in
{
inherit crucible;
default = crucible;
image = pkgs.dockerTools.buildLayeredImage {
name = "registry.westgate.pw/deployment/crucible";
tag = version;
contents = [ crucible pkgs.cacert pkgs.fakeNss ];
config = {
Entrypoint = [ "/bin/crucible" ];
Cmd = [ "help" ];
User = "65532:65532";
Env = [
"PATH=/bin"
"SSL_CERT_FILE=/etc/ssl/certs/ca-bundle.crt"
];
};
};
});
devShells = forAllSystems (pkgs: {
default = pkgs.mkShell {
name = "sow-tools";
packages = with pkgs; [
go
gopls
gotools
git
tea
gnumake
bashInteractive
shellcheck
yamllint
jq
];
shellHook = ''
export GOCACHE="$PWD/.cache/go-build"
echo "sow-tools / Crucible devshell (self-contained). $(go version 2>/dev/null)"
echo " make check go vet + go test + shellcheck + yamllint"
echo " make build build every cmd/* into ./bin"
echo " make smoke build + run the binary smoke test"
'';
};
});
};
}