#!/usr/bin/env bash set -euo pipefail # ========================================================== # Deploy Forgejo act_runner + KEDA autoscaling to Kubernetes # ========================================================== NAMESPACE="forgejo-runners" SCRIPT_DIR="$(dirname "$0")" echo "=== Deploying Forgejo Runner with KEDA Autoscaling ===" RUNNER_TOKEN="RPAjk4Jdc42By5vSxnULPPPrjU0goPLQIiKgwOIo" # Forgejo API token — create at https://git.juntekim.com/user/settings/applications # Needs: read:repository scope (to list repos and query action tasks) if [[ -z "${FORGEJO_API_TOKEN:-}" ]]; then read -rsp "Forgejo API token (for metrics exporter): " FORGEJO_API_TOKEN echo fi # Install KEDA if not already installed if ! kubectl get crd scaledobjects.keda.sh &>/dev/null; then echo "=== Installing KEDA ===" helm repo add kedacore https://kedacore.github.io/charts helm repo update kedacore helm install keda kedacore/keda --namespace keda --create-namespace echo "✅ KEDA installed" else echo "✅ KEDA already installed" fi kubectl create namespace "$NAMESPACE" --dry-run=client -o yaml | kubectl apply -f - # Runner registration token (used by act_runner to register with Forgejo) kubectl create secret generic forgejo-runner-secret \ --namespace "$NAMESPACE" \ --from-literal=token="$RUNNER_TOKEN" \ --dry-run=client -o yaml | kubectl apply -f - # Forgejo API token (used by metrics exporter to query job queue) kubectl create secret generic forgejo-api-secret \ --namespace "$NAMESPACE" \ --from-literal=token="$FORGEJO_API_TOKEN" \ --dry-run=client -o yaml | kubectl apply -f - kubectl apply -f "$SCRIPT_DIR/deployment.yaml" kubectl apply -f "$SCRIPT_DIR/metrics-exporter.yaml" kubectl apply -f "$SCRIPT_DIR/keda-scaledobject.yaml" echo echo "✅ Forgejo runner deployed with KEDA autoscaling" echo echo "Next steps:" echo " kubectl get pods -n $NAMESPACE" echo " kubectl get scaledobject -n $NAMESPACE" echo " kubectl logs -n $NAMESPACE deploy/forgejo-metrics-exporter" echo " Check runners at: https://git.juntekim.com/-/admin/runners"