#!/usr/bin/env bash # Re-points the existing LAN dev self-hosted runner from GitHub Actions to # Forgejo Actions. Run on the SAME machine that already runs the GitHub # runner (see DEPLOY-DEV.md) — this replaces that runner, it doesn't add a # second one. Sudo-free, systemd --user, same pattern as the app service. # # This is THE runner (docs/runbooks/implementation-handoff.md Track B step 5 # — canonical placement is the desktop, not a Swarm-hosted container), so it # registers with BOTH labels the workflows need, where one runner used to be # two: general CI/build/deploy.yml jobs (`docker`, containerized via this # machine's own already-installed Docker — no Docker-in-Docker sidecar needed, # unlike the Swarm-hosted design this replaces, since a real host with a real # Docker install needs no such indirection) and the LAN-deploy job # (`thermograph-lan`, bare/host-native — it writes to ~/thermograph-dev and # restarts a systemd --user service, which only works running directly on the # host, not inside a container). # # bash deploy/forgejo/register-lan-runner.sh # # Get from the Forgejo web UI: # repo -> Settings -> Actions -> Runners -> Create new Runner # (or an org/instance-level runner page, if you want it to serve more than # this one repo — same as the GitHub runner did). set -euo pipefail FORGEJO_URL="${1:?usage: $0 }" TOKEN="${2:?}" RUNNER_DIR="${RUNNER_DIR:-$HOME/forgejo-runner}" LABELS="${LABELS:-docker:docker://node:20-bookworm,thermograph-lan}" echo "==> Stopping and disabling the old GitHub Actions runner service, if present" systemctl --user stop github-actions-runner 2>/dev/null || true systemctl --user disable github-actions-runner 2>/dev/null || true if ! id -nG "$USER" 2>/dev/null | grep -qw docker; then echo "WARNING: $USER is not in the 'docker' group — the 'docker:docker://...'" echo "labeled jobs (general CI) will fail to start a container until this is" echo "fixed: sudo usermod -aG docker $USER && (log out and back in)." fi echo "==> Installing forgejo-runner into $RUNNER_DIR" mkdir -p "$RUNNER_DIR" cd "$RUNNER_DIR" if [ ! -x ./forgejo-runner ]; then ARCH="$(uname -m)" case "$ARCH" in x86_64) BIN_ARCH=amd64 ;; aarch64) BIN_ARCH=arm64 ;; *) echo "Unsupported arch: $ARCH — download the right binary by hand from" \ "https://code.forgejo.org/forgejo/runner/releases" >&2; exit 1 ;; esac VER="${FORGEJO_RUNNER_VERSION:-6.3.1}" curl -fsSL -o forgejo-runner \ "https://code.forgejo.org/forgejo/runner/releases/download/v${VER}/forgejo-runner-${VER}-linux-${BIN_ARCH}" chmod +x forgejo-runner fi echo "==> Registering with $FORGEJO_URL (label: $LABELS)" ./forgejo-runner register --no-interactive \ --instance "$FORGEJO_URL" \ --token "$TOKEN" \ --name "thermograph-lan-$(hostname -s)" \ --labels "$LABELS" echo "==> Runner config (docker.sock automount, so docker:-labeled jobs like" echo " build-push.yml can actually run 'docker build/push' -- generated" echo " config only overridden on the one setting that matters here)" ./forgejo-runner generate-config \ | sed 's/docker_host: "-"/docker_host: "automount"/' \ > "${RUNNER_DIR}/config.yaml" echo "==> systemd --user unit" mkdir -p "$HOME/.config/systemd/user" cat > "$HOME/.config/systemd/user/forgejo-runner.service" </dev/null || true cat <