k3s: simplify airgap images passthru

This reduces the filtering and renaming of airgap images archives to
make the update script and builder more resilient to upstream changes.
Additionally, it reduces the code of the k3s builder.

+87 -78
+7
doc/release-notes/rl-2511.section.md
··· 59 60 - `ansible-later` has been removed because it was discontinued by the author. 61 62 - `stalwart-mail` since `0.13.0` "introduces a significant redesign of the MTA’s delivery and queueing subsystem". See [the upgrading announcement for the `0.13.0` release](https://github.com/stalwartlabs/stalwart/blob/89b561b5ca1c5a11f2a768b4a2cfef0f473b7a01/UPGRADING.md#upgrading-from-v012x-and-v011x-to-v013x). 63 64 - Greetd and its original greeters (`tuigreet`, `gtkgreet`, `qtgreet`, `regreet`, `wlgreet`) were moved from `greetd` namespace to top level (`greetd.tuigreet` -> `tuigreet`, `greetd.greetd` -> `greetd`, etc). The original attrs are available for compatibility as passthrus of `greetd`, but will emit a warning. They will be removed in future releases.
··· 59 60 - `ansible-later` has been removed because it was discontinued by the author. 61 62 + - `k3s` airgap images passthru attributes have changed: 63 + - `imagesList` was removed 64 + - `airgapImages` was renamed to `airgap-images` 65 + - `airgapImagesAmd64` was renamed to `airgap-images-amd64-tar-zst` 66 + - `airgapImagesArm64` was renamed to `airgap-images-arm64-tar-zst` 67 + - `airgapImagesArm` was renamed to `airgap-images-arm-tar-zst` 68 + 69 - `stalwart-mail` since `0.13.0` "introduces a significant redesign of the MTA’s delivery and queueing subsystem". See [the upgrading announcement for the `0.13.0` release](https://github.com/stalwartlabs/stalwart/blob/89b561b5ca1c5a11f2a768b4a2cfef0f473b7a01/UPGRADING.md#upgrading-from-v012x-and-v011x-to-v013x). 70 71 - Greetd and its original greeters (`tuigreet`, `gtkgreet`, `qtgreet`, `regreet`, `wlgreet`) were moved from `greetd` namespace to top level (`greetd.tuigreet` -> `tuigreet`, `greetd.greetd` -> `greetd`, etc). The original attrs are available for compatibility as passthrus of `greetd`, but will emit a warning. They will be removed in future releases.
+1 -9
nixos/tests/k3s/airgap-images.nix
··· 22 "--disable servicelb" 23 "--disable traefik" 24 ]; 25 - images = [ k3s.airgapImages ]; 26 }; 27 }; 28 29 testScript = '' 30 - import json 31 - 32 - start_all() 33 machine.wait_for_unit("k3s") 34 machine.wait_until_succeeds("journalctl -r --no-pager -u k3s | grep \"Imported images from /var/lib/rancher/k3s/agent/images/\"") 35 - images = json.loads(machine.succeed("crictl img -o json")) 36 - image_names = [i["repoTags"][0] for i in images["images"]] 37 - with open("${k3s.imagesList}") as expected_images: 38 - for line in expected_images: 39 - assert line.rstrip() in image_names, f"The image {line.rstrip()} is not present in the airgap images archive" 40 ''; 41 } 42 )
··· 22 "--disable servicelb" 23 "--disable traefik" 24 ]; 25 + images = [ k3s.airgap-images ]; 26 }; 27 }; 28 29 testScript = '' 30 machine.wait_for_unit("k3s") 31 machine.wait_until_succeeds("journalctl -r --no-pager -u k3s | grep \"Imported images from /var/lib/rancher/k3s/agent/images/\"") 32 ''; 33 } 34 )
+15 -7
pkgs/applications/networking/cluster/k3s/1_30/images-versions.json
··· 1 { 2 - "airgap-images-amd64": { 3 "url": "https://github.com/k3s-io/k3s/releases/download/v1.30.14%2Bk3s2/k3s-airgap-images-amd64.tar.zst", 4 "sha256": "9bda99cde833c4e13fb4d35fa46fd57d4b1a2eefc33e00fa352ce686c871c842" 5 }, 6 - "airgap-images-arm": { 7 "url": "https://github.com/k3s-io/k3s/releases/download/v1.30.14%2Bk3s2/k3s-airgap-images-arm.tar.zst", 8 "sha256": "d40a78ff14b40547bca6d05db3d7e767b272bb9257628ebd3905d1659bc49bd5" 9 }, 10 - "airgap-images-arm64": { 11 "url": "https://github.com/k3s-io/k3s/releases/download/v1.30.14%2Bk3s2/k3s-airgap-images-arm64.tar.zst", 12 "sha256": "6561f91f14c8419c9d1c20fb9af7948757d87bd91855b376058d9f2e16010452" 13 - }, 14 - "images-list": { 15 - "url": "https://github.com/k3s-io/k3s/releases/download/v1.30.14%2Bk3s2/k3s-images.txt", 16 - "sha256": "1f87ad26acac5e553279a64942c0e3eeef5c026cc2f82661d358990848672584" 17 } 18 }
··· 1 { 2 + "airgap-images-amd64-tar-gz": { 3 + "url": "https://github.com/k3s-io/k3s/releases/download/v1.30.14%2Bk3s2/k3s-airgap-images-amd64.tar.gz", 4 + "sha256": "f98a57f7b25a4537096fbe9755f96cfd05bfe6fc6315f111c0f44e1abf4aad6d" 5 + }, 6 + "airgap-images-amd64-tar-zst": { 7 "url": "https://github.com/k3s-io/k3s/releases/download/v1.30.14%2Bk3s2/k3s-airgap-images-amd64.tar.zst", 8 "sha256": "9bda99cde833c4e13fb4d35fa46fd57d4b1a2eefc33e00fa352ce686c871c842" 9 }, 10 + "airgap-images-arm-tar-gz": { 11 + "url": "https://github.com/k3s-io/k3s/releases/download/v1.30.14%2Bk3s2/k3s-airgap-images-arm.tar.gz", 12 + "sha256": "33df3a2b155118198c48e66426a04292a348aa53fef126a3cb8e4fe7aea83ccc" 13 + }, 14 + "airgap-images-arm-tar-zst": { 15 "url": "https://github.com/k3s-io/k3s/releases/download/v1.30.14%2Bk3s2/k3s-airgap-images-arm.tar.zst", 16 "sha256": "d40a78ff14b40547bca6d05db3d7e767b272bb9257628ebd3905d1659bc49bd5" 17 }, 18 + "airgap-images-arm64-tar-gz": { 19 + "url": "https://github.com/k3s-io/k3s/releases/download/v1.30.14%2Bk3s2/k3s-airgap-images-arm64.tar.gz", 20 + "sha256": "bba9c2e417ece797a5ae8bf9346bb35dc8ab163828c801a2cb512d6097610b52" 21 + }, 22 + "airgap-images-arm64-tar-zst": { 23 "url": "https://github.com/k3s-io/k3s/releases/download/v1.30.14%2Bk3s2/k3s-airgap-images-arm64.tar.zst", 24 "sha256": "6561f91f14c8419c9d1c20fb9af7948757d87bd91855b376058d9f2e16010452" 25 } 26 }
+15 -7
pkgs/applications/networking/cluster/k3s/1_31/images-versions.json
··· 1 { 2 - "airgap-images-amd64": { 3 "url": "https://github.com/k3s-io/k3s/releases/download/v1.31.11%2Bk3s1/k3s-airgap-images-amd64.tar.zst", 4 "sha256": "c98ad7590af33ef7e148920eb809dfd0f8145a623fdd8d32c6efeecab6088412" 5 }, 6 - "airgap-images-arm": { 7 "url": "https://github.com/k3s-io/k3s/releases/download/v1.31.11%2Bk3s1/k3s-airgap-images-arm.tar.zst", 8 "sha256": "c1bd7557836538592dbd59f798e7a4b91d7aef74c8f9f71631060c96a5288dd6" 9 }, 10 - "airgap-images-arm64": { 11 "url": "https://github.com/k3s-io/k3s/releases/download/v1.31.11%2Bk3s1/k3s-airgap-images-arm64.tar.zst", 12 "sha256": "97f0db38f57a2dc63167795620ba34a89348d874ecc91fbf3d8d962dc1392e47" 13 - }, 14 - "images-list": { 15 - "url": "https://github.com/k3s-io/k3s/releases/download/v1.31.11%2Bk3s1/k3s-images.txt", 16 - "sha256": "1f87ad26acac5e553279a64942c0e3eeef5c026cc2f82661d358990848672584" 17 } 18 }
··· 1 { 2 + "airgap-images-amd64-tar-gz": { 3 + "url": "https://github.com/k3s-io/k3s/releases/download/v1.31.11%2Bk3s1/k3s-airgap-images-amd64.tar.gz", 4 + "sha256": "fa4f87e7e82c0e613f854eedf8f64d2cdabbd127f3ae84707ed1ca59e2137855" 5 + }, 6 + "airgap-images-amd64-tar-zst": { 7 "url": "https://github.com/k3s-io/k3s/releases/download/v1.31.11%2Bk3s1/k3s-airgap-images-amd64.tar.zst", 8 "sha256": "c98ad7590af33ef7e148920eb809dfd0f8145a623fdd8d32c6efeecab6088412" 9 }, 10 + "airgap-images-arm-tar-gz": { 11 + "url": "https://github.com/k3s-io/k3s/releases/download/v1.31.11%2Bk3s1/k3s-airgap-images-arm.tar.gz", 12 + "sha256": "0b6009407069fdd684d9627c5fa4bdb31ea4644172f1f429a2cce15d2c18631d" 13 + }, 14 + "airgap-images-arm-tar-zst": { 15 "url": "https://github.com/k3s-io/k3s/releases/download/v1.31.11%2Bk3s1/k3s-airgap-images-arm.tar.zst", 16 "sha256": "c1bd7557836538592dbd59f798e7a4b91d7aef74c8f9f71631060c96a5288dd6" 17 }, 18 + "airgap-images-arm64-tar-gz": { 19 + "url": "https://github.com/k3s-io/k3s/releases/download/v1.31.11%2Bk3s1/k3s-airgap-images-arm64.tar.gz", 20 + "sha256": "6fa41db4ee001c1db8a404dd38f17f2426f27f688f9f7a2a76f4ef336f51c886" 21 + }, 22 + "airgap-images-arm64-tar-zst": { 23 "url": "https://github.com/k3s-io/k3s/releases/download/v1.31.11%2Bk3s1/k3s-airgap-images-arm64.tar.zst", 24 "sha256": "97f0db38f57a2dc63167795620ba34a89348d874ecc91fbf3d8d962dc1392e47" 25 } 26 }
+15 -7
pkgs/applications/networking/cluster/k3s/1_32/images-versions.json
··· 1 { 2 - "airgap-images-amd64": { 3 "url": "https://github.com/k3s-io/k3s/releases/download/v1.32.7%2Bk3s1/k3s-airgap-images-amd64.tar.zst", 4 "sha256": "965f5767c08cffc96bf0967813e7c3fec4c41309e9952a480f0a50865bebd039" 5 }, 6 - "airgap-images-arm": { 7 "url": "https://github.com/k3s-io/k3s/releases/download/v1.32.7%2Bk3s1/k3s-airgap-images-arm.tar.zst", 8 "sha256": "57ab9c306cc96f8dd925bc788c80e49c2d13ee7a222a12235fb525529ad25ac0" 9 }, 10 - "airgap-images-arm64": { 11 "url": "https://github.com/k3s-io/k3s/releases/download/v1.32.7%2Bk3s1/k3s-airgap-images-arm64.tar.zst", 12 "sha256": "1aa05a55492ba0872fa8a0ff518d6e947869bea32dc2b8e5223bdcf53450c7f9" 13 - }, 14 - "images-list": { 15 - "url": "https://github.com/k3s-io/k3s/releases/download/v1.32.7%2Bk3s1/k3s-images.txt", 16 - "sha256": "e786e9a6f0331a92a2257a12995028761bfee1b5bfaac866025b64162e69bfe0" 17 } 18 }
··· 1 { 2 + "airgap-images-amd64-tar-gz": { 3 + "url": "https://github.com/k3s-io/k3s/releases/download/v1.32.7%2Bk3s1/k3s-airgap-images-amd64.tar.gz", 4 + "sha256": "f6a8720aa9bb03d0c8a97a93e994557292f1efba1fa6648cd8a07830622ce748" 5 + }, 6 + "airgap-images-amd64-tar-zst": { 7 "url": "https://github.com/k3s-io/k3s/releases/download/v1.32.7%2Bk3s1/k3s-airgap-images-amd64.tar.zst", 8 "sha256": "965f5767c08cffc96bf0967813e7c3fec4c41309e9952a480f0a50865bebd039" 9 }, 10 + "airgap-images-arm-tar-gz": { 11 + "url": "https://github.com/k3s-io/k3s/releases/download/v1.32.7%2Bk3s1/k3s-airgap-images-arm.tar.gz", 12 + "sha256": "9aa6f9f33e58e04fb9d8f9cd5c51dd01c6092d7b5434f84341b2f74bc8de783e" 13 + }, 14 + "airgap-images-arm-tar-zst": { 15 "url": "https://github.com/k3s-io/k3s/releases/download/v1.32.7%2Bk3s1/k3s-airgap-images-arm.tar.zst", 16 "sha256": "57ab9c306cc96f8dd925bc788c80e49c2d13ee7a222a12235fb525529ad25ac0" 17 }, 18 + "airgap-images-arm64-tar-gz": { 19 + "url": "https://github.com/k3s-io/k3s/releases/download/v1.32.7%2Bk3s1/k3s-airgap-images-arm64.tar.gz", 20 + "sha256": "9633b71655ed0f4af556c148f9bf7753221b3c9b42a8d902391187789302adca" 21 + }, 22 + "airgap-images-arm64-tar-zst": { 23 "url": "https://github.com/k3s-io/k3s/releases/download/v1.32.7%2Bk3s1/k3s-airgap-images-arm64.tar.zst", 24 "sha256": "1aa05a55492ba0872fa8a0ff518d6e947869bea32dc2b8e5223bdcf53450c7f9" 25 } 26 }
+15 -7
pkgs/applications/networking/cluster/k3s/1_33/images-versions.json
··· 1 { 2 - "airgap-images-amd64": { 3 "url": "https://github.com/k3s-io/k3s/releases/download/v1.33.3%2Bk3s1/k3s-airgap-images-amd64.tar.zst", 4 "sha256": "51b6ddeafa465e542f0707272736100916886dd49abcb1420ee52878dd3638a9" 5 }, 6 - "airgap-images-arm": { 7 "url": "https://github.com/k3s-io/k3s/releases/download/v1.33.3%2Bk3s1/k3s-airgap-images-arm.tar.zst", 8 "sha256": "339dd2b33b40f03bf95ee2e5dcb8e543ab6852e156cb8aaebe3885717a2966b5" 9 }, 10 - "airgap-images-arm64": { 11 "url": "https://github.com/k3s-io/k3s/releases/download/v1.33.3%2Bk3s1/k3s-airgap-images-arm64.tar.zst", 12 "sha256": "c12ec7b122f34eb1f89310b05e66b500a2f49522d7cd4ceb3475a675cab6ebc6" 13 - }, 14 - "images-list": { 15 - "url": "https://github.com/k3s-io/k3s/releases/download/v1.33.3%2Bk3s1/k3s-images.txt", 16 - "sha256": "e786e9a6f0331a92a2257a12995028761bfee1b5bfaac866025b64162e69bfe0" 17 } 18 }
··· 1 { 2 + "airgap-images-amd64-tar-gz": { 3 + "url": "https://github.com/k3s-io/k3s/releases/download/v1.33.3%2Bk3s1/k3s-airgap-images-amd64.tar.gz", 4 + "sha256": "64690dc963f6cbff8adb175a1bc41e6bf207734a9a214362544a36361a2d8350" 5 + }, 6 + "airgap-images-amd64-tar-zst": { 7 "url": "https://github.com/k3s-io/k3s/releases/download/v1.33.3%2Bk3s1/k3s-airgap-images-amd64.tar.zst", 8 "sha256": "51b6ddeafa465e542f0707272736100916886dd49abcb1420ee52878dd3638a9" 9 }, 10 + "airgap-images-arm-tar-gz": { 11 + "url": "https://github.com/k3s-io/k3s/releases/download/v1.33.3%2Bk3s1/k3s-airgap-images-arm.tar.gz", 12 + "sha256": "878d17722dd98e7d88de93a83606e0c9b0d7587c7e4a043559b5236a353fb224" 13 + }, 14 + "airgap-images-arm-tar-zst": { 15 "url": "https://github.com/k3s-io/k3s/releases/download/v1.33.3%2Bk3s1/k3s-airgap-images-arm.tar.zst", 16 "sha256": "339dd2b33b40f03bf95ee2e5dcb8e543ab6852e156cb8aaebe3885717a2966b5" 17 }, 18 + "airgap-images-arm64-tar-gz": { 19 + "url": "https://github.com/k3s-io/k3s/releases/download/v1.33.3%2Bk3s1/k3s-airgap-images-arm64.tar.gz", 20 + "sha256": "e4ab063deb50241e60218a3a30ce090a5817daa0f38dacd10651e27b2be28b9e" 21 + }, 22 + "airgap-images-arm64-tar-zst": { 23 "url": "https://github.com/k3s-io/k3s/releases/download/v1.33.3%2Bk3s1/k3s-airgap-images-arm64.tar.zst", 24 "sha256": "c12ec7b122f34eb1f89310b05e66b500a2f49522d7cd4ceb3475a675cab6ebc6" 25 } 26 }
+14 -34
pkgs/applications/networking/cluster/k3s/builder.nix
··· 130 traefikChart = fetchurl chartVersions.traefik; 131 traefik-crdChart = fetchurl chartVersions.traefik-crd; 132 133 - mutFirstChar = 134 - f: s: 135 - let 136 - firstChar = f (lib.substring 0 1 s); 137 - rest = lib.substring 1 (-1) s; 138 - in 139 - firstChar + rest; 140 - 141 - kebabToCamel = 142 - s: 143 - mutFirstChar lib.toLower (lib.concatMapStrings (mutFirstChar lib.toUpper) (lib.splitString "-" s)); 144 - 145 - # finds the images archive for the desired architecture, throws in case no suitable archive is found 146 - findImagesArchive = 147 - arch: 148 - let 149 - imagesVersionsNames = builtins.attrNames imagesVersions; 150 - in 151 - lib.findFirst ( 152 - n: lib.hasInfix arch n 153 - ) (throw "k3s: no airgap images for ${arch} available") imagesVersionsNames; 154 - 155 # a shortcut that provides the images archive for the host platform. Currently only supports 156 # aarch64 (arm64) and x86_64 (amd64), throws on other architectures. 157 - airgapImages = fetchurl ( 158 - if stdenv.hostPlatform.isAarch64 then 159 - imagesVersions.${findImagesArchive "arm64"} 160 - else if stdenv.hostPlatform.isx86_64 then 161 - imagesVersions.${findImagesArchive "amd64"} 162 - else 163 - throw "k3s: airgap images cannot be found automatically for architecture ${stdenv.hostPlatform.linuxArch}, consider using an image archive with an explicit architecture." 164 - ); 165 166 # so, k3s is a complicated thing to package 167 # This derivation attempts to avoid including any random binaries from the ··· 467 ''; 468 469 passthru = { 470 - inherit airgapImages; 471 k3sCNIPlugins = k3sCNIPlugins; 472 k3sContainerd = k3sContainerd; 473 k3sRepo = k3sRepo; ··· 481 lib.mapAttrs (name: value: nixosTests.k3s.${name}.${k3s_version}) nixosTests.k3s; 482 tests = passthru.mkTests k3sVersion; 483 updateScript = updateScript; 484 } 485 - // (lib.mapAttrs' ( 486 - name: _: lib.nameValuePair (kebabToCamel name) (fetchurl imagesVersions.${name}) 487 - ) imagesVersions); 488 489 meta = baseMeta; 490 }
··· 130 traefikChart = fetchurl chartVersions.traefik; 131 traefik-crdChart = fetchurl chartVersions.traefik-crd; 132 133 # a shortcut that provides the images archive for the host platform. Currently only supports 134 # aarch64 (arm64) and x86_64 (amd64), throws on other architectures. 135 + airgap-images = 136 + { 137 + x86_64-linux = fetchurl imagesVersions.airgap-images-amd64-tar-zst; 138 + aarch64-linux = fetchurl imagesVersions.airgap-images-arm64-tar-zst; 139 + } 140 + .${stdenv.hostPlatform.system} 141 + or (throw "k3s: no airgap images available for system ${stdenv.hostPlatform.system}, consider using an image archive with an explicit architecture."); 142 143 # so, k3s is a complicated thing to package 144 # This derivation attempts to avoid including any random binaries from the ··· 444 ''; 445 446 passthru = { 447 + inherit airgap-images; 448 k3sCNIPlugins = k3sCNIPlugins; 449 k3sContainerd = k3sContainerd; 450 k3sRepo = k3sRepo; ··· 458 lib.mapAttrs (name: value: nixosTests.k3s.${name}.${k3s_version}) nixosTests.k3s; 459 tests = passthru.mkTests k3sVersion; 460 updateScript = updateScript; 461 + imagesList = throw "k3s.imagesList was removed"; 462 + airgapImages = throw "k3s.airgapImages was renamed to k3s.airgap-images"; 463 + airgapImagesAmd64 = throw "k3s.airgapImagesAmd64 was renamed to k3s.airgap-images-amd64-tar-zst"; 464 + airgapImagesArm64 = throw "k3s.airgapImagesArm64 was renamed to k3s.airgap-images-arm64-tar-zst"; 465 + airgapImagesArm = throw "k3s.airgapImagesArm was renamed to k3s.airgap-images-arm-tar-zst"; 466 } 467 + // (lib.mapAttrs (_: value: fetchurl value) imagesVersions); 468 469 meta = baseMeta; 470 }
+5 -7
pkgs/applications/networking/cluster/k3s/update-script.sh
··· 83 SHA256_HASHES="\ 84 $($CURL "https://github.com/k3s-io/k3s/releases/download/v${K3S_VERSION}/sha256sum-amd64.txt") 85 $($CURL "https://github.com/k3s-io/k3s/releases/download/v${K3S_VERSION}/sha256sum-arm64.txt") 86 - $($CURL "https://github.com/k3s-io/k3s/releases/download/v${K3S_VERSION}/sha256sum-arm.txt") 87 - $($CURL "https://github.com/k3s-io/k3s/releases/download/v${K3S_VERSION}/k3s-images.txt" | sha256sum | cut -d' ' -f1) k3s-images.txt" 88 89 # Get all airgap images files associated with this release 90 IMAGES_ARCHIVES=$($CURL "https://api.github.com/repos/k3s-io/k3s/releases/tags/v${K3S_VERSION}" | \ 91 - # Filter the assets so that only zstd archives and text files that have "images" in their name remain 92 - jq -r '.assets[] | select(.name | (contains("images") and (endswith(".tar.zst") or endswith("k3s-images.txt")))) | 93 - "\(.name) \(.browser_download_url)"') 94 95 # Create a JSON object for each airgap images file and prefetch all download URLs in the process 96 # Combine all JSON objects and write the result to images-versions.json 97 while read -r name url; do 98 # Pick the right hash based on the name 99 sha256=$(grep "$name" <<< "$SHA256_HASHES" | cut -d ' ' -f 1) 100 - # Remove the k3s- prefix and file endings 101 - clean_name=$(sed -e 's/^k3s-//' -e 's/\.tar\.zst//' -e 's/\.txt/-list/' <<< "$name") 102 jq --null-input --arg name "$clean_name" \ 103 --arg url "$url" \ 104 --arg sha256 "$sha256" \
··· 83 SHA256_HASHES="\ 84 $($CURL "https://github.com/k3s-io/k3s/releases/download/v${K3S_VERSION}/sha256sum-amd64.txt") 85 $($CURL "https://github.com/k3s-io/k3s/releases/download/v${K3S_VERSION}/sha256sum-arm64.txt") 86 + $($CURL "https://github.com/k3s-io/k3s/releases/download/v${K3S_VERSION}/sha256sum-arm.txt")" 87 88 # Get all airgap images files associated with this release 89 IMAGES_ARCHIVES=$($CURL "https://api.github.com/repos/k3s-io/k3s/releases/tags/v${K3S_VERSION}" | \ 90 + # Filter the assets for airgap images archives 91 + jq -r '.assets[] | select(.name | test("^k3s-airgap-images-.*\\.tar\\.")) | "\(.name) \(.browser_download_url)"') 92 93 # Create a JSON object for each airgap images file and prefetch all download URLs in the process 94 # Combine all JSON objects and write the result to images-versions.json 95 while read -r name url; do 96 # Pick the right hash based on the name 97 sha256=$(grep "$name" <<< "$SHA256_HASHES" | cut -d ' ' -f 1) 98 + # Remove the k3s prefix and replace all dots with hyphens 99 + clean_name=$(sed -e "s/^k3s-//" -e "s/\./-/g" <<< "$name") 100 jq --null-input --arg name "$clean_name" \ 101 --arg url "$url" \ 102 --arg sha256 "$sha256" \