diff options
Diffstat (limited to 'pkgs/applications/networking/cluster/k3s/builder.nix')
-rw-r--r-- | pkgs/applications/networking/cluster/k3s/builder.nix | 135 |
1 files changed, 89 insertions, 46 deletions
diff --git a/pkgs/applications/networking/cluster/k3s/builder.nix b/pkgs/applications/networking/cluster/k3s/builder.nix index 52754219efbfd..e0288c21fc997 100644 --- a/pkgs/applications/networking/cluster/k3s/builder.nix +++ b/pkgs/applications/networking/cluster/k3s/builder.nix @@ -12,6 +12,8 @@ lib: # Based on the traefik charts here: https://github.com/k3s-io/k3s/blob/d71ab6317e22dd34673faa307a412a37a16767f6/scripts/download#L29-L32 # see also https://github.com/k3s-io/k3s/blob/d71ab6317e22dd34673faa307a412a37a16767f6/manifests/traefik.yaml#L8 chartVersions, + # Air gap container images that are released as assets with every k3s release + imagesVersions, # taken from ./scripts/version.sh VERSION_CNIPLUGINS https://github.com/k3s-io/k3s/blob/v1.23.3%2Bk3s1/scripts/version.sh#L45 k3sCNIVersion, k3sCNISha256 ? lib.fakeHash, @@ -30,41 +32,42 @@ lib: # It is likely we will have to split out additional builders for additional # versions in the future, or customize this one further. { - lib, - makeWrapper, - socat, - iptables, - iproute2, - ipset, + bash, bridge-utils, btrfs-progs, - conntrack-tools, buildGoModule, - runc, - rsync, - kmod, - libseccomp, - pkg-config, + conntrack-tools, + coreutils, ethtool, - util-linux, fetchFromGitHub, + fetchgit, fetchurl, fetchzip, - fetchgit, - zstd, - yq-go, - sqlite, + findutils, + gnugrep, + gnused, + go, + iproute2, + ipset, + iptables, + kmod, + lib, + libseccomp, + makeWrapper, nixosTests, + pkg-config, pkgsBuildBuild, - go, - runCommand, - bash, procps, - coreutils, - gnugrep, - findutils, - gnused, + rsync, + runc, + runCommand, + socat, + sqlite, + stdenv, systemd, + util-linux, + yq-go, + zstd, }: # k3s is a kinda weird derivation. One of the main points of k3s is the @@ -88,18 +91,12 @@ lib: # make sure they're in the path if desired. let - baseMeta = with lib; { + baseMeta = { description = "Lightweight Kubernetes distribution"; - license = licenses.asl20; + license = lib.licenses.asl20; homepage = "https://k3s.io"; - maintainers = with maintainers; [ - euank - mic92 - superherointj - wrmilling - yajo - ]; - platforms = platforms.linux; + maintainers = lib.teams.k3s.members; + platforms = lib.platforms.linux; # resolves collisions with other installations of kubectl, crictl, ctr # prefer non-k3s versions @@ -128,6 +125,39 @@ let traefikChart = fetchurl chartVersions.traefik; traefik-crdChart = fetchurl chartVersions.traefik-crd; + mutFirstChar = + f: s: + let + firstChar = f (lib.substring 0 1 s); + rest = lib.substring 1 (-1) s; + in + firstChar + rest; + + kebabToCamel = + s: + mutFirstChar lib.toLower (lib.concatMapStrings (mutFirstChar lib.toUpper) (lib.splitString "-" s)); + + # finds the images archive for the desired architecture, aborts in case no suitable archive is found + findImagesArchive = + arch: + let + imagesVersionsNames = builtins.attrNames imagesVersions; + in + lib.findFirst ( + n: lib.hasInfix arch n + ) (abort "k3s: no airgap images for ${arch} available") imagesVersionsNames; + + # a shortcut that provides the images archive for the host platform. Currently only supports + # aarch64 (arm64) and x86_64 (amd64), aborts on other architectures. + airgapImages = fetchurl ( + if stdenv.isAarch64 then + imagesVersions.${findImagesArchive "arm64"} + else if stdenv.isx86_64 then + imagesVersions.${findImagesArchive "amd64"} + else + abort "k3s: airgap images cannot be found automatically for architecture ${stdenv.hostPlatform.linuxArch}, consider using an image archive with an explicit architecture." + ); + # so, k3s is a complicated thing to package # This derivation attempts to avoid including any random binaries from the # internet. k3s-root is _mostly_ binaries built to be bundled in k3s (which @@ -373,6 +403,7 @@ buildGoModule rec { # https://github.com/NixOS/nixpkgs/pull/158089#discussion_r799965694 # So, why do we use buildGoModule at all? For the `vendorHash` / `go mod download` stuff primarily. buildPhase = '' + runHook preBuild patchShebangs ./scripts/package-cli ./scripts/download ./scripts/build-upload # copy needed 'go generate' inputs into place @@ -393,12 +424,14 @@ buildGoModule rec { ./scripts/package-cli mkdir -p $out/bin + runHook postBuild ''; # Otherwise it depends on 'getGoDirs', which is normally set in buildPhase doCheck = false; installPhase = '' + runHook preInstall # wildcard to match the arm64 build too install -m 0755 dist/artifacts/k3s* -D $out/bin/k3s wrapProgram $out/bin/k3s \ @@ -410,26 +443,36 @@ buildGoModule rec { install -m 0755 ${k3sKillallSh} -D $out/bin/k3s-killall.sh wrapProgram $out/bin/k3s-killall.sh \ --prefix PATH : ${lib.makeBinPath (k3sRuntimeDeps ++ k3sKillallDeps)} + runHook postInstall ''; doInstallCheck = true; installCheckPhase = '' + runHook preInstallCheck $out/bin/k3s --version | grep -F "v${k3sVersion}" >/dev/null + runHook postInstallCheck ''; - passthru.updateScript = updateScript; - - passthru.mkTests = - version: - let - k3s_version = "k3s_" + lib.replaceStrings [ "." ] [ "_" ] (lib.versions.majorMinor version); - in + passthru = { - etcd = nixosTests.k3s.etcd.${k3s_version}; - single-node = nixosTests.k3s.single-node.${k3s_version}; - multi-node = nixosTests.k3s.multi-node.${k3s_version}; - }; - passthru.tests = passthru.mkTests k3sVersion; + inherit airgapImages; + k3sCNIPlugins = k3sCNIPlugins; + k3sContainerd = k3sContainerd; + k3sRepo = k3sRepo; + k3sRoot = k3sRoot; + k3sServer = k3sServer; + mkTests = + version: + let + k3s_version = "k3s_" + lib.replaceStrings [ "." ] [ "_" ] (lib.versions.majorMinor version); + in + lib.mapAttrs (name: value: nixosTests.k3s.${name}.${k3s_version}) nixosTests.k3s; + tests = passthru.mkTests k3sVersion; + updateScript = updateScript; + } + // (lib.mapAttrs' ( + name: _: lib.nameValuePair (kebabToCamel name) (fetchurl imagesVersions.${name}) + ) imagesVersions); meta = baseMeta; } |