feat: gitea runners infra, but it is so expancive
runner nix smoke / nix label smoke (push) Has been cancelled
runner ubuntu smoke / ubuntu-latest label smoke (push) Has been cancelled

This commit is contained in:
2026-08-25 14:44:45 +00:00
parent eb16104545
commit 56c033a541
10 changed files with 299 additions and 28 deletions
+194 -2
View File
@@ -5,13 +5,202 @@
exec ${pkgs.nix}/bin/nix run ${opentofuUnstable} -- "$@"
'';
packer = pkgs.stdenvNoCC.mkDerivation {
pname = "packer";
version = "1.16.0";
src = pkgs.fetchurl {
url = "https://releases.hashicorp.com/packer/1.16.0/packer_1.16.0_linux_amd64.zip";
hash = "sha256-XtzRSrWbU1BAxRLb7Nbsnvl2oACwc8Gdk+TEMclIWB4=";
};
nativeBuildInputs = [ pkgs.unzip ];
dontUnpack = true;
dontConfigure = true;
dontBuild = true;
installPhase = ''
install -d $out/bin
unzip -p $src packer > $out/bin/packer
chmod 755 $out/bin/packer
'';
};
buildMicroosSnapshots = pkgs.writeShellScriptBin "gitea-runners-build-microos-snapshots" ''
set -eu
: "''${HCLOUD_TOKEN:?HCLOUD_TOKEN is not set}"
architecture="''${1:-both}"
x86_location="''${GITEA_RUNNERS_X86_LOCATION:-nbg1}"
x86_server_type="''${GITEA_RUNNERS_X86_SERVER_TYPE:-cx23}"
case "$architecture" in
x86|arm|both) ;;
*)
printf 'usage: gitea-runners-build-microos-snapshots [x86|arm|both]\n' >&2
exit 2
;;
esac
workdir="$(mktemp -d)"
trap 'rm -rf "$workdir"' EXIT HUP INT TERM
ssh_private_key_file="$workdir/packer-ssh-key"
ssh-keygen -q -t ed25519 -N "" -f "$ssh_private_key_file"
image_public_key_file="''${GITEA_RUNNERS_IMAGE_SSH_PUBLIC_KEY_FILE:-$HOME/.ssh/id_ed25519.pub}"
test -r "$image_public_key_file"
packer_public_key_b64="$(base64 -w0 "$ssh_private_key_file.pub")"
image_public_key_b64="$(base64 -w0 "$image_public_key_file")"
curl -fsSL \
https://raw.githubusercontent.com/kube-hetzner/terraform-hcloud-kube-hetzner/master/scripts/create.sh \
-o "$workdir/create.sh"
chmod +x "$workdir/create.sh"
(
cd "$workdir"
folder_name="runner-images" \
folder_path="$workdir" \
create_snapshots=none \
HCLOUD_TOKEN="$HCLOUD_TOKEN" \
"$workdir/create.sh"
)
packer_dir="$workdir/runner-images/packer"
"$packer_dir/scripts/install-verified-packer-plugin-hcloud.sh"
# Packer may try to remove its remote script after the image-writing reboot,
# while SSH is already unavailable. Keep that cleanup from aborting builds.
sed -i \
'/inline[[:space:]]*=[[:space:]]*\[local\.write_x86_image\]/a\ skip_clean = true' \
"$packer_dir/hcloud-microos-snapshots.pkr.hcl"
sed -i \
'/inline[[:space:]]*=[[:space:]]*\[local\.write_arm_image\]/a\ skip_clean = true' \
"$packer_dir/hcloud-microos-snapshots.pkr.hcl"
sed -i \
'/inline[[:space:]]*=[[:space:]]*\[local\.install_packages\]/a\ start_retry_timeout = "15m"' \
"$packer_dir/hcloud-microos-snapshots.pkr.hcl"
sed -i \
'/ssh_username[[:space:]]*=[[:space:]]*"root"/a\ temporary_key_pair_type = "ed25519"' \
"$packer_dir/hcloud-microos-snapshots.pkr.hcl"
awk \
-v ssh_private_key_file="$ssh_private_key_file" \
'/token[[:space:]]*=[[:space:]]*var[.]hcloud_token/ {
print
print " ssh_private_key_file = \"" ssh_private_key_file "\""
next
}
{ print }' \
"$packer_dir/hcloud-microos-snapshots.pkr.hcl" \
> "$packer_dir/hcloud-microos-snapshots.pkr.hcl.tmp"
mv "$packer_dir/hcloud-microos-snapshots.pkr.hcl.tmp" \
"$packer_dir/hcloud-microos-snapshots.pkr.hcl"
cat > "$workdir/image-key-injection.txt" <<'EOF'
partprobe /dev/sda || true
udevadm settle
root_device=""
for candidate in /dev/sda[0-9]*; do
if [ "$(blkid -s TYPE -o value "$candidate" 2>/dev/null || true)" = btrfs ]; then
root_device="$candidate"
break
fi
done
test -n "$root_device"
mount -o subvol=@ "$root_device" /mnt
install -d -m 0700 /mnt/root/.ssh
printf '%s' '__IMAGE_PUBLIC_KEY_B64__' | base64 -d > /mnt/root/.ssh/authorized_keys
printf '\n%s' '__PACKER_PUBLIC_KEY_B64__' | base64 -d >> /mnt/root/.ssh/authorized_keys
chmod 0600 /mnt/root/.ssh/authorized_keys
sync
umount /mnt
EOF
sed -i "s|__PACKER_PUBLIC_KEY_B64__|$packer_public_key_b64|" \
"$workdir/image-key-injection.txt"
sed -i "s|__IMAGE_PUBLIC_KEY_B64__|$image_public_key_b64|" \
"$workdir/image-key-injection.txt"
awk -v inject_file="$workdir/image-key-injection.txt" \
'/done[.] Rebooting/ {
while ((getline line < inject_file) > 0) print line
close(inject_file)
}
{ print }' \
"$packer_dir/hcloud-microos-snapshots.pkr.hcl" \
> "$packer_dir/hcloud-microos-snapshots.pkr.hcl.tmp"
mv "$packer_dir/hcloud-microos-snapshots.pkr.hcl.tmp" \
"$packer_dir/hcloud-microos-snapshots.pkr.hcl"
cat > "$workdir/cloud-init-cleanup.txt" <<'EOF'
cloud-init clean --logs --machine-id --seed --configs all || true
rm -rf /run/cloud-init/* /var/lib/cloud/*
EOF
awk -v cleanup_file="$workdir/cloud-init-cleanup.txt" \
'/# Cleanup some logs/ {
while ((getline line < cleanup_file) > 0) print "- [sh, -c, \"" line "\"]"
close(cleanup_file)
}
{ print }' \
"$packer_dir/hcloud-microos-snapshots.pkr.hcl" \
> "$packer_dir/hcloud-microos-snapshots.pkr.hcl.tmp"
mv "$packer_dir/hcloud-microos-snapshots.pkr.hcl.tmp" \
"$packer_dir/hcloud-microos-snapshots.pkr.hcl"
x86_base='https://download.opensuse.org/tumbleweed/appliances'
x86_file='openSUSE-MicroOS.x86_64-ContainerHost-OpenStack-Cloud.qcow2'
x86_url="$x86_base/$x86_file"
arm_base='https://download.opensuse.org/ports/aarch64/tumbleweed/appliances'
arm_file='openSUSE-MicroOS.aarch64-ContainerHost-OpenStack-Cloud.qcow2'
arm_url="$arm_base/$arm_file"
x86_sha="$(curl -fsSL "$x86_url.sha256" | awk '{print $1; exit}')"
arm_sha="$(curl -fsSL "$arm_url.sha256" | awk '{print $1; exit}')"
test -n "$x86_sha"
test -n "$arm_sha"
printf 'x86 digest: %s\n' "$x86_sha"
printf 'arm digest: %s\n' "$arm_sha"
(
cd "$packer_dir"
packer init hcloud-microos-snapshots.pkr.hcl
case "$architecture" in
x86)
packer build \
-only=hcloud.microos-x86-snapshot \
-var 'selinux_package_to_install=k3s' \
-var "x86_location=$x86_location" \
-var "x86_server_type=$x86_server_type" \
-var "opensuse_microos_x86_expected_sha256=$x86_sha" \
-var "opensuse_microos_arm_expected_sha256=$arm_sha" \
hcloud-microos-snapshots.pkr.hcl
;;
arm)
packer build \
-only=hcloud.microos-arm-snapshot \
-var 'selinux_package_to_install=k3s' \
-var "opensuse_microos_x86_expected_sha256=$x86_sha" \
-var "opensuse_microos_arm_expected_sha256=$arm_sha" \
hcloud-microos-snapshots.pkr.hcl
;;
both)
packer build \
-var 'selinux_package_to_install=k3s' \
-var "x86_location=$x86_location" \
-var "x86_server_type=$x86_server_type" \
-var "opensuse_microos_x86_expected_sha256=$x86_sha" \
-var "opensuse_microos_arm_expected_sha256=$arm_sha" \
hcloud-microos-snapshots.pkr.hcl
;;
esac
)
'';
giteaRunnersSetup = pkgs.writeShellScriptBin "gitea-runners-setup" /* sh */ ''
cat <<'EOF'
Gitea runners setup checklist
Tools available in this shell:
tofu, kubectl, kustomize, kubeconform, sops, age, awscli2, hcloud, tea,
docker, skopeo, go-containerregistry, jq, yq-go, curl, git, openssh, nix
tofu, packer, gitea-runners-build-microos-snapshots [x86|arm|both], kubectl, kustomize,
kubeconform, sops, age, awscli2, hcloud,
tea, docker, skopeo, go-containerregistry, jq, yq-go, curl, git, openssh, nix
Environment expected before real deploy/apply:
TF_VAR_hcloud_token
@@ -77,6 +266,8 @@ in pkgs.mkShell {
buildInputs = [
tofu
packer
buildMicroosSnapshots
giteaRunnersSetup
pkgs.nix
pkgs.kubectl
@@ -95,6 +286,7 @@ in pkgs.mkShell {
pkgs.curl
pkgs.git
pkgs.openssh
pkgs.unzip
];
shellHook = ''