From 91e493d81fd4021bf9649bc8bc6a84fcb523b271 Mon Sep 17 00:00:00 2001 From: xtcnet Date: Tue, 17 Mar 2026 23:05:15 +0700 Subject: [PATCH] feat(install): add Forgejo Runner install/uninstall to Forgejo submenu - Add FORGEJO_RUNNER_DIR, FORGEJO_RUNNER_CONTAINER, FORGEJO_RUNNER_IMAGE constants - do_forgejo_runner_install: prompts for Forgejo URL and token, registers runner with ubuntu-latest/ubuntu-22.04 Docker labels, starts daemon - do_forgejo_runner_uninstall: stops/removes container and data directory - Extend Forgejo submenu to 6 options (added Install/Uninstall Runner) Co-Authored-By: Claude Sonnet 4.6 --- install.sh | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 97 insertions(+), 3 deletions(-) diff --git a/install.sh b/install.sh index 9263633..539b3af 100644 --- a/install.sh +++ b/install.sh @@ -18,6 +18,10 @@ FORGEJO_CONTAINER_NAME="forgejo" FORGEJO_IMAGE="codeberg.org/forgejo/forgejo:9" DOCKER_NETWORK="d3v-net" +FORGEJO_RUNNER_DIR="/opt/forgejo-runner" +FORGEJO_RUNNER_CONTAINER="forgejo-runner" +FORGEJO_RUNNER_IMAGE="code.forgejo.org/forgejo/runner:latest" + RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' @@ -740,6 +744,92 @@ do_forgejo_update() { log_ok "Done." } +do_forgejo_runner_install() { + require_root + + if docker ps -a --format '{{.Names}}' | grep -q "^${FORGEJO_RUNNER_CONTAINER}$"; then + log_warn "Forgejo Runner is already installed." + return + fi + + separator + echo -e "${BOLD} Forgejo Runner Installation${NC}" + separator + echo "" + + read -rp "$(echo -e "${CYAN}[?]${NC} Forgejo URL [https://src.d3v.ac]: ")" forgejo_url + forgejo_url="${forgejo_url:-https://src.d3v.ac}" + + echo "" + echo -e " Get token from: ${BOLD}${forgejo_url}/-/admin/runners${NC}" + echo -e " Or: repo ${BOLD}Settings → Actions → Runners → Create new Runner${NC}" + echo "" + read -rsp "$(echo -e "${CYAN}[?]${NC} Runner registration token: ")" runner_token + echo "" + if [ -z "$runner_token" ]; then + log_err "Token cannot be empty. Cancelled." + return + fi + + mkdir -p "$FORGEJO_RUNNER_DIR" + + log_step "Registering runner with Forgejo..." + docker run --rm \ + -v "${FORGEJO_RUNNER_DIR}:/data" \ + "${FORGEJO_RUNNER_IMAGE}" \ + forgejo-runner register \ + --no-interactive \ + --url "${forgejo_url}" \ + --token "${runner_token}" \ + --name "$(hostname)-runner" \ + --labels "ubuntu-latest:docker://node:20-bullseye,ubuntu-22.04:docker://node:20-bullseye" + + if [ $? -ne 0 ]; then + log_err "Runner registration failed. Check the token and Forgejo URL." + return + fi + log_ok "Runner registered." + + log_step "Starting Forgejo Runner..." + docker run -d \ + --name "${FORGEJO_RUNNER_CONTAINER}" \ + --restart unless-stopped \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v "${FORGEJO_RUNNER_DIR}:/data" \ + "${FORGEJO_RUNNER_IMAGE}" \ + forgejo-runner daemon + + log_ok "Forgejo Runner started." + echo "" + separator + echo -e "${GREEN}${BOLD} FORGEJO RUNNER INSTALLED!${NC}" + separator + echo -e " Runner connected to: ${BOLD}${forgejo_url}${NC}" + echo -e " Push a commit to trigger your first workflow." + separator +} + +do_forgejo_runner_uninstall() { + require_root + + if ! docker ps -a --format '{{.Names}}' | grep -q "^${FORGEJO_RUNNER_CONTAINER}$"; then + log_warn "Forgejo Runner is not installed." + return + fi + + log_warn "This will stop and remove the Forgejo Runner." + read -rp "$(echo -e "${RED}Are you sure? (y/N): ${NC}")" confirm + if [[ ! "$confirm" =~ ^[yY]$ ]]; then + echo "Cancelled." + return + fi + + docker stop "${FORGEJO_RUNNER_CONTAINER}" 2>/dev/null || true + docker rm "${FORGEJO_RUNNER_CONTAINER}" 2>/dev/null || true + rm -rf "$FORGEJO_RUNNER_DIR" + log_ok "Forgejo Runner uninstalled." +} + show_forgejo_menu() { while true; do echo "" @@ -749,15 +839,19 @@ show_forgejo_menu() { echo " 1) Install Forgejo" echo " 2) Uninstall Forgejo" echo " 3) Update Forgejo" - echo " 4) Back" + echo " 4) Install Runner" + echo " 5) Uninstall Runner" + echo " 6) Back" separator - read -rp " Select [1-4]: " choice + read -rp " Select [1-6]: " choice echo "" case "$choice" in 1) do_forgejo_install ;; 2) do_forgejo_uninstall ;; 3) do_forgejo_update ;; - 4) return ;; + 4) do_forgejo_runner_install ;; + 5) do_forgejo_runner_uninstall ;; + 6) return ;; *) log_err "Invalid option." ;; esac done