entitybtw revised this gist 1 month ago. Go to revision
1 file changed, 48 insertions, 24 deletions
forgejo-actions-guide-docker.txt
| @@ -10,6 +10,15 @@ REGISTRATION_TOKEN="your-registration-token" # CHANGE THIS | |||
| 10 | 10 | RUNNER_NAME="selfhosted-runner-01" | |
| 11 | 11 | RUNNER_VERSION="latest" # "latest" or specific version | |
| 12 | 12 | RUNNER_MODE="direct" # "direct" or "docker" | |
| 13 | + | ||
| 14 | + | # Direct mode variables | |
| 15 | + | RUNNER_USER="forgejo-runner" | |
| 16 | + | RUNNER_HOME="/opt/forgejo-runner" | |
| 17 | + | ||
| 18 | + | # Docker mode variables | |
| 19 | + | COMPOSE_DIR="$HOME/forgejo-runner" | |
| 20 | + | DIND_IMAGE="docker:dind" | |
| 21 | + | RUNNER_IMAGE="data.forgejo.org/forgejo/runner" | |
| 13 | 22 | # ============================================================================= | |
| 14 | 23 | ||
| 15 | 24 | set -e | |
| @@ -45,21 +54,32 @@ if [ "$RUNNER_MODE" = "direct" ]; then | |||
| 45 | 54 | echo "Installing runner directly on the system" | |
| 46 | 55 | echo "" | |
| 47 | 56 | ||
| 57 | + | # --- Create runner user if not exists --- | |
| 58 | + | echo "Creating runner user..." | |
| 59 | + | if ! id "$RUNNER_USER" &>/dev/null; then | |
| 60 | + | sudo useradd -r -m -d "$RUNNER_HOME" -s /bin/bash "$RUNNER_USER" | |
| 61 | + | echo "User $RUNNER_USER created" | |
| 62 | + | else | |
| 63 | + | echo "User $RUNNER_USER already exists" | |
| 64 | + | fi | |
| 65 | + | ||
| 66 | + | # --- Create directory structure --- | |
| 67 | + | echo "Creating directory structure..." | |
| 68 | + | sudo mkdir -p "$RUNNER_HOME/bin" | |
| 69 | + | sudo chown -R "$RUNNER_USER":"$RUNNER_USER" "$RUNNER_HOME" | |
| 70 | + | ||
| 48 | 71 | # --- Download binary --- | |
| 49 | 72 | echo "Downloading runner binary..." | |
| 50 | - | wget -O forgejo-runner https://code.forgejo.org/forgejo/runner/releases/download/v${RUNNER_VERSION}/forgejo-runner-${RUNNER_VERSION}-linux-${ARCH} | |
| 73 | + | sudo -u "$RUNNER_USER" wget -O "$RUNNER_HOME/bin/forgejo-runner" \ | |
| 74 | + | https://code.forgejo.org/forgejo/runner/releases/download/v${RUNNER_VERSION}/forgejo-runner-${RUNNER_VERSION}-linux-${ARCH} | |
| 51 | 75 | ||
| 52 | 76 | # --- Make executable --- | |
| 53 | 77 | echo "Making executable..." | |
| 54 | - | chmod +x forgejo-runner | |
| 55 | - | ||
| 56 | - | # --- Move to /usr/local/bin --- | |
| 57 | - | echo "Moving to /usr/local/bin..." | |
| 58 | - | sudo mv forgejo-runner /usr/local/bin/ | |
| 78 | + | sudo chmod +x "$RUNNER_HOME/bin/forgejo-runner" | |
| 59 | 79 | ||
| 60 | 80 | # --- Register runner --- | |
| 61 | 81 | echo "Registering runner with Forgejo..." | |
| 62 | - | forgejo-runner register \ | |
| 82 | + | sudo -u "$RUNNER_USER" "$RUNNER_HOME/bin/forgejo-runner" register \ | |
| 63 | 83 | --token "$REGISTRATION_TOKEN" \ | |
| 64 | 84 | --name "$RUNNER_NAME" \ | |
| 65 | 85 | --instance "$FORGEJO_URL" \ | |
| @@ -68,7 +88,7 @@ if [ "$RUNNER_MODE" = "direct" ]; then | |||
| 68 | 88 | ||
| 69 | 89 | # --- Create config.yaml --- | |
| 70 | 90 | echo "Creating configuration..." | |
| 71 | - | cat > config.yaml << EOF | |
| 91 | + | sudo -u "$RUNNER_USER" tee "$RUNNER_HOME/config.yaml" > /dev/null << EOF | |
| 72 | 92 | instance: $FORGEJO_URL | |
| 73 | 93 | token: "$REGISTRATION_TOKEN" | |
| 74 | 94 | ||
| @@ -104,10 +124,10 @@ After=network.target | |||
| 104 | 124 | ||
| 105 | 125 | [Service] | |
| 106 | 126 | Type=simple | |
| 107 | - | User=$USER | |
| 108 | - | Group=$USER | |
| 109 | - | WorkingDirectory=$PWD | |
| 110 | - | ExecStart=/usr/local/bin/forgejo-runner daemon --config $PWD/config.yaml | |
| 127 | + | User=$RUNNER_USER | |
| 128 | + | Group=$RUNNER_USER | |
| 129 | + | WorkingDirectory=$RUNNER_HOME | |
| 130 | + | ExecStart=$RUNNER_HOME/bin/forgejo-runner daemon --config $RUNNER_HOME/config.yaml | |
| 111 | 131 | Restart=always | |
| 112 | 132 | RestartSec=10 | |
| 113 | 133 | StartLimitBurst=3 | |
| @@ -134,8 +154,9 @@ EOF | |||
| 134 | 154 | echo "To view logs:" | |
| 135 | 155 | echo " sudo journalctl -u forgejo-runner -f" | |
| 136 | 156 | echo "" | |
| 137 | - | echo "Runner location: /usr/local/bin/forgejo-runner" | |
| 138 | - | echo "Config location: $PWD/config.yaml" | |
| 157 | + | echo "Runner location: $RUNNER_HOME/bin/forgejo-runner" | |
| 158 | + | echo "Config location: $RUNNER_HOME/config.yaml" | |
| 159 | + | echo "User: $RUNNER_USER" | |
| 139 | 160 | ||
| 140 | 161 | # ============================================================================= | |
| 141 | 162 | # DOCKER MODE | |
| @@ -185,8 +206,8 @@ elif [ "$RUNNER_MODE" = "docker" ]; then | |||
| 185 | 206 | ||
| 186 | 207 | # --- Create working directory --- | |
| 187 | 208 | echo "Creating working directory..." | |
| 188 | - | mkdir -p ~/forgejo-runner/{data,cache} | |
| 189 | - | cd ~/forgejo-runner | |
| 209 | + | mkdir -p "$COMPOSE_DIR"/{data,cache} | |
| 210 | + | cd "$COMPOSE_DIR" | |
| 190 | 211 | ||
| 191 | 212 | # --- Register runner using Docker --- | |
| 192 | 213 | echo "Registering runner with Forgejo..." | |
| @@ -194,7 +215,7 @@ elif [ "$RUNNER_MODE" = "docker" ]; then | |||
| 194 | 215 | -v $(pwd)/data:/data \ | |
| 195 | 216 | -w /data \ | |
| 196 | 217 | --user root \ | |
| 197 | - | data.forgejo.org/forgejo/runner:${RUNNER_VERSION} \ | |
| 218 | + | ${RUNNER_IMAGE}:${RUNNER_VERSION} \ | |
| 198 | 219 | forgejo-runner register \ | |
| 199 | 220 | --no-interactive \ | |
| 200 | 221 | --token "$REGISTRATION_TOKEN" \ | |
| @@ -245,7 +266,7 @@ version: '3.8' | |||
| 245 | 266 | ||
| 246 | 267 | services: | |
| 247 | 268 | docker-in-docker: | |
| 248 | - | image: docker:dind | |
| 269 | + | image: ${DIND_IMAGE} | |
| 249 | 270 | container_name: ${RUNNER_NAME}_dind | |
| 250 | 271 | privileged: true | |
| 251 | 272 | command: ['dockerd', '-H', 'tcp://0.0.0.0:2375', '--tls=false'] | |
| @@ -254,7 +275,7 @@ services: | |||
| 254 | 275 | - dind-storage:/var/lib/docker | |
| 255 | 276 | ||
| 256 | 277 | runner: | |
| 257 | - | image: data.forgejo.org/forgejo/runner:${RUNNER_VERSION} | |
| 278 | + | image: ${RUNNER_IMAGE}:${RUNNER_VERSION} | |
| 258 | 279 | container_name: ${RUNNER_NAME} | |
| 259 | 280 | depends_on: | |
| 260 | 281 | docker-in-docker: | |
| @@ -287,7 +308,7 @@ Requires=docker.service | |||
| 287 | 308 | [Service] | |
| 288 | 309 | Type=oneshot | |
| 289 | 310 | RemainAfterExit=yes | |
| 290 | - | WorkingDirectory=$HOME/forgejo-runner | |
| 311 | + | WorkingDirectory=$COMPOSE_DIR | |
| 291 | 312 | ExecStart=/usr/bin/docker compose up -d | |
| 292 | 313 | ExecStop=/usr/bin/docker compose down | |
| 293 | 314 | ExecReload=/usr/bin/docker compose restart | |
| @@ -312,15 +333,15 @@ EOF | |||
| 312 | 333 | sudo systemctl status forgejo-runner-docker.service --no-pager | |
| 313 | 334 | echo "" | |
| 314 | 335 | echo "To view logs:" | |
| 315 | - | echo " docker compose -f $HOME/forgejo-runner/docker-compose.yml logs -f runner" | |
| 336 | + | echo " docker compose -f $COMPOSE_DIR/docker-compose.yml logs -f runner" | |
| 316 | 337 | echo "" | |
| 317 | 338 | echo "To manage:" | |
| 318 | - | echo " cd ~/forgejo-runner" | |
| 339 | + | echo " cd $COMPOSE_DIR" | |
| 319 | 340 | echo " docker compose up -d # start" | |
| 320 | 341 | echo " docker compose down # stop" | |
| 321 | 342 | echo " docker compose restart # restart" | |
| 322 | 343 | echo "" | |
| 323 | - | echo "Runner location: ~/forgejo-runner" | |
| 344 | + | echo "Runner location: $COMPOSE_DIR" | |
| 324 | 345 | ||
| 325 | 346 | # ============================================================================= | |
| 326 | 347 | # INVALID MODE | |
| @@ -340,7 +361,10 @@ echo "URL: $FORGEJO_URL/admin/actions/runners" | |||
| 340 | 361 | echo "" | |
| 341 | 362 | if [ "$RUNNER_MODE" = "direct" ]; then | |
| 342 | 363 | echo "To check runner logs: sudo journalctl -u forgejo-runner -f" | |
| 364 | + | echo "Runner user: $RUNNER_USER" | |
| 365 | + | echo "Runner home: $RUNNER_HOME" | |
| 343 | 366 | else | |
| 344 | - | echo "To check runner logs: docker compose -f $HOME/forgejo-runner/docker-compose.yml logs -f runner" | |
| 367 | + | echo "To check runner logs: docker compose -f $COMPOSE_DIR/docker-compose.yml logs -f runner" | |
| 368 | + | echo "Runner location: $COMPOSE_DIR" | |
| 345 | 369 | fi | |
| 346 | 370 | echo "============================================================" | |
entitybtw revised this gist 1 month ago. Go to revision
1 file changed, 62 insertions, 112 deletions
forgejo-actions-guide-docker.txt
| @@ -1,23 +1,15 @@ | |||
| 1 | 1 | #!/bin/bash | |
| 2 | 2 | # ============================================================================= | |
| 3 | 3 | # FORGEJO RUNNER - FULL SYSTEM DEPLOYMENT WITH SYSTEMD | |
| 4 | - | # Supports both DIRECT and DOCKER modes - NO EXTERNAL DEPENDENCIES | |
| 4 | + | # Supports both DIRECT and DOCKER modes | |
| 5 | 5 | # ============================================================================= | |
| 6 | 6 | ||
| 7 | 7 | # --- CONFIGURATION VARIABLES --- | |
| 8 | 8 | FORGEJO_URL="http://192.168.2.76:3006" # CHANGE THIS | |
| 9 | 9 | REGISTRATION_TOKEN="your-registration-token" # CHANGE THIS | |
| 10 | 10 | RUNNER_NAME="selfhosted-runner-01" | |
| 11 | - | RUNNER_VERSION="latest" # Can be "latest" or specific like "v12.13.2" | |
| 11 | + | RUNNER_VERSION="latest" # "latest" or specific version | |
| 12 | 12 | RUNNER_MODE="direct" # "direct" or "docker" | |
| 13 | - | ||
| 14 | - | # Direct mode variables - using current user | |
| 15 | - | RUNNER_HOME="/opt/forgejo-runner" | |
| 16 | - | ||
| 17 | - | # Docker mode variables | |
| 18 | - | COMPOSE_DIR="$HOME/forgejo-runner" | |
| 19 | - | DIND_IMAGE="docker:dind" | |
| 20 | - | RUNNER_IMAGE="data.forgejo.org/forgejo/runner" | |
| 21 | 13 | # ============================================================================= | |
| 22 | 14 | ||
| 23 | 15 | set -e | |
| @@ -26,96 +18,57 @@ echo "============================================================" | |||
| 26 | 18 | echo "FORGEJO RUNNER DEPLOYMENT" | |
| 27 | 19 | echo "============================================================" | |
| 28 | 20 | echo "Mode: $RUNNER_MODE" | |
| 29 | - | echo "Version: $RUNNER_VERSION" | |
| 30 | 21 | echo "Instance: $FORGEJO_URL" | |
| 31 | 22 | echo "" | |
| 32 | 23 | ||
| 33 | - | # --- STEP 1: Detect system architecture --- | |
| 34 | - | ARCH=$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/;s/armv7l/armv7/') | |
| 35 | - | echo "Detected architecture: $ARCH" | |
| 24 | + | # --- STEP 1: Detect architecture --- | |
| 25 | + | echo "Detecting architecture..." | |
| 26 | + | export ARCH=$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/;s/armv7l/armv7/') | |
| 27 | + | echo "Architecture: $ARCH" | |
| 36 | 28 | ||
| 37 | - | # --- STEP 2: Get actual version if "latest" (NO DEPENDENCIES) --- | |
| 29 | + | # --- STEP 2: Get latest version --- | |
| 38 | 30 | if [ "$RUNNER_VERSION" = "latest" ]; then | |
| 39 | - | echo "Fetching latest Forgejo Runner version..." | |
| 40 | - | ||
| 41 | - | # Try API with grep (no jq needed) | |
| 42 | - | RUNNER_VERSION=$(curl -s https://code.forgejo.org/api/v1/repos/forgejo/runner/releases/latest | \ | |
| 43 | - | grep -o '"tag_name":"v[0-9]\+\.[0-9]\+\.[0-9]\+"' | \ | |
| 44 | - | head -1 | sed 's/"tag_name":"//' | sed 's/"//') | |
| 45 | - | ||
| 46 | - | # If API fails, try HTML parsing | |
| 47 | - | if [ -z "$RUNNER_VERSION" ]; then | |
| 48 | - | echo "API failed, trying HTML parsing..." | |
| 49 | - | RUNNER_VERSION=$(curl -s https://code.forgejo.org/forgejo/runner/releases | \ | |
| 50 | - | grep -o 'v[0-9]\+\.[0-9]\+\.[0-9]\+' | \ | |
| 51 | - | head -1) | |
| 52 | - | fi | |
| 53 | - | ||
| 54 | - | # If still empty, use fallback | |
| 55 | - | if [ -z "$RUNNER_VERSION" ]; then | |
| 56 | - | echo "Failed to fetch latest version, using fallback v12.13.2" | |
| 57 | - | RUNNER_VERSION="v12.13.2" | |
| 58 | - | fi | |
| 59 | - | ||
| 60 | - | echo "Latest version: $RUNNER_VERSION" | |
| 31 | + | echo "Fetching latest version..." | |
| 32 | + | export RUNNER_VERSION=$(curl -s https://code.forgejo.org/api/v1/repos/forgejo/runner/releases/latest | grep -o '"tag_name":"v[0-9]\+\.[0-9]\+\.[0-9]\+"' | head -1 | sed 's/"tag_name":"//' | sed 's/"//' | sed 's/^v//') | |
| 33 | + | echo "Version: $RUNNER_VERSION" | |
| 34 | + | else | |
| 35 | + | RUNNER_VERSION=${RUNNER_VERSION#v} | |
| 36 | + | echo "Version: $RUNNER_VERSION" | |
| 61 | 37 | fi | |
| 62 | - | ||
| 63 | - | # Remove 'v' prefix for version number | |
| 64 | - | VERSION_NUM=${RUNNER_VERSION#v} | |
| 65 | - | echo "Using version: $RUNNER_VERSION (number: $VERSION_NUM)" | |
| 66 | 38 | echo "" | |
| 67 | 39 | ||
| 68 | 40 | # ============================================================================= | |
| 69 | - | # DIRECT MODE INSTALLATION | |
| 41 | + | # DIRECT MODE | |
| 70 | 42 | # ============================================================================= | |
| 71 | 43 | if [ "$RUNNER_MODE" = "direct" ]; then | |
| 72 | 44 | echo "=== DIRECT MODE INSTALLATION ===" | |
| 73 | - | echo "Installing runner directly on the system (no Docker required)" | |
| 74 | - | echo "Using current user: $USER" | |
| 45 | + | echo "Installing runner directly on the system" | |
| 75 | 46 | echo "" | |
| 76 | 47 | ||
| 77 | - | # --- Create directory --- | |
| 78 | - | echo "Creating runner directory..." | |
| 79 | - | sudo mkdir -p "$RUNNER_HOME/bin" | |
| 80 | - | sudo chown -R "$USER":"$USER" "$RUNNER_HOME" | |
| 81 | - | ||
| 82 | - | # --- Download runner binary --- | |
| 83 | - | echo "Downloading Forgejo runner binary..." | |
| 84 | - | DOWNLOAD_URL="https://code.forgejo.org/forgejo/runner/releases/download/$RUNNER_VERSION/forgejo-runner-${VERSION_NUM}-linux-$ARCH" | |
| 85 | - | ||
| 86 | - | echo "Downloading from: $DOWNLOAD_URL" | |
| 87 | - | ||
| 88 | - | # Download with timeout and retry | |
| 89 | - | if ! curl -L -m 60 --retry 3 "$DOWNLOAD_URL" -o "$RUNNER_HOME/bin/forgejo-runner"; then | |
| 90 | - | echo "ERROR: Failed to download runner binary" | |
| 91 | - | echo "Try manual download:" | |
| 92 | - | echo " wget $DOWNLOAD_URL" | |
| 93 | - | exit 1 | |
| 94 | - | fi | |
| 95 | - | ||
| 96 | - | chmod +x "$RUNNER_HOME/bin/forgejo-runner" | |
| 97 | - | chown -R "$USER":"$USER" "$RUNNER_HOME" | |
| 48 | + | # --- Download binary --- | |
| 49 | + | echo "Downloading runner binary..." | |
| 50 | + | wget -O forgejo-runner https://code.forgejo.org/forgejo/runner/releases/download/v${RUNNER_VERSION}/forgejo-runner-${RUNNER_VERSION}-linux-${ARCH} | |
| 51 | + | ||
| 52 | + | # --- Make executable --- | |
| 53 | + | echo "Making executable..." | |
| 54 | + | chmod +x forgejo-runner | |
| 98 | 55 | ||
| 99 | - | # Verify binary | |
| 100 | - | echo "Verifying binary..." | |
| 101 | - | "$RUNNER_HOME/bin/forgejo-runner" --version 2>/dev/null || echo "Warning: Version check failed" | |
| 56 | + | # --- Move to /usr/local/bin --- | |
| 57 | + | echo "Moving to /usr/local/bin..." | |
| 58 | + | sudo mv forgejo-runner /usr/local/bin/ | |
| 102 | 59 | ||
| 103 | 60 | # --- Register runner --- | |
| 104 | 61 | echo "Registering runner with Forgejo..." | |
| 105 | - | "$RUNNER_HOME/bin/forgejo-runner" register \ | |
| 62 | + | forgejo-runner register \ | |
| 106 | 63 | --token "$REGISTRATION_TOKEN" \ | |
| 107 | 64 | --name "$RUNNER_NAME" \ | |
| 108 | 65 | --instance "$FORGEJO_URL" \ | |
| 109 | 66 | --labels "$RUNNER_NAME:host" \ | |
| 110 | - | --no-interactive 2>/dev/null || { | |
| 111 | - | echo "WARNING: Registration failed, but continuing..." | |
| 112 | - | echo "You may need to register manually:" | |
| 113 | - | echo " $RUNNER_HOME/bin/forgejo-runner register --token $REGISTRATION_TOKEN --name $RUNNER_NAME --instance $FORGEJO_URL --labels $RUNNER_NAME:host --no-interactive" | |
| 114 | - | } | |
| 67 | + | --no-interactive | |
| 115 | 68 | ||
| 116 | 69 | # --- Create config.yaml --- | |
| 117 | 70 | echo "Creating configuration..." | |
| 118 | - | cat > "$RUNNER_HOME/config.yaml" << EOF | |
| 71 | + | cat > config.yaml << EOF | |
| 119 | 72 | instance: $FORGEJO_URL | |
| 120 | 73 | token: "$REGISTRATION_TOKEN" | |
| 121 | 74 | ||
| @@ -153,8 +106,8 @@ After=network.target | |||
| 153 | 106 | Type=simple | |
| 154 | 107 | User=$USER | |
| 155 | 108 | Group=$USER | |
| 156 | - | WorkingDirectory=$RUNNER_HOME | |
| 157 | - | ExecStart=$RUNNER_HOME/bin/forgejo-runner daemon --config $RUNNER_HOME/config.yaml | |
| 109 | + | WorkingDirectory=$PWD | |
| 110 | + | ExecStart=/usr/local/bin/forgejo-runner daemon --config $PWD/config.yaml | |
| 158 | 111 | Restart=always | |
| 159 | 112 | RestartSec=10 | |
| 160 | 113 | StartLimitBurst=3 | |
| @@ -169,29 +122,30 @@ EOF | |||
| 169 | 122 | # --- Enable and start service --- | |
| 170 | 123 | echo "Starting service..." | |
| 171 | 124 | sudo systemctl daemon-reload | |
| 172 | - | sudo systemctl enable forgejo-runner.service 2>/dev/null || echo "Warning: Could not enable service" | |
| 173 | - | sudo systemctl start forgejo-runner.service 2>/dev/null || echo "Warning: Could not start service" | |
| 125 | + | sudo systemctl enable forgejo-runner.service | |
| 126 | + | sudo systemctl start forgejo-runner.service | |
| 174 | 127 | ||
| 175 | 128 | echo "" | |
| 176 | 129 | echo "=== DIRECT MODE DEPLOYMENT COMPLETE ===" | |
| 177 | 130 | echo "" | |
| 178 | 131 | echo "Service status:" | |
| 179 | - | sudo systemctl status forgejo-runner.service --no-pager 2>/dev/null || echo "Service status unavailable" | |
| 132 | + | sudo systemctl status forgejo-runner.service --no-pager | |
| 180 | 133 | echo "" | |
| 181 | 134 | echo "To view logs:" | |
| 182 | 135 | echo " sudo journalctl -u forgejo-runner -f" | |
| 183 | 136 | echo "" | |
| 184 | - | echo "Runner location: $RUNNER_HOME" | |
| 137 | + | echo "Runner location: /usr/local/bin/forgejo-runner" | |
| 138 | + | echo "Config location: $PWD/config.yaml" | |
| 185 | 139 | ||
| 186 | 140 | # ============================================================================= | |
| 187 | - | # DOCKER MODE INSTALLATION | |
| 141 | + | # DOCKER MODE | |
| 188 | 142 | # ============================================================================= | |
| 189 | 143 | elif [ "$RUNNER_MODE" = "docker" ]; then | |
| 190 | 144 | echo "=== DOCKER MODE INSTALLATION ===" | |
| 191 | 145 | echo "Installing runner with Docker Compose" | |
| 192 | 146 | echo "" | |
| 193 | 147 | ||
| 194 | - | # --- Check and install Docker if needed --- | |
| 148 | + | # --- Check Docker --- | |
| 195 | 149 | echo "Checking Docker..." | |
| 196 | 150 | if ! command -v docker &> /dev/null; then | |
| 197 | 151 | echo "Docker not found. Installing Docker..." | |
| @@ -205,24 +159,24 @@ elif [ "$RUNNER_MODE" = "docker" ]; then | |||
| 205 | 159 | echo "Docker is already installed" | |
| 206 | 160 | fi | |
| 207 | 161 | ||
| 208 | - | if ! systemctl is-active --quiet docker 2>/dev/null; then | |
| 162 | + | if ! systemctl is-active --quiet docker; then | |
| 209 | 163 | echo "Starting Docker service..." | |
| 210 | - | sudo systemctl start docker 2>/dev/null || echo "Warning: Could not start Docker" | |
| 164 | + | sudo systemctl start docker | |
| 211 | 165 | fi | |
| 212 | 166 | echo "Docker is running" | |
| 213 | 167 | ||
| 214 | - | # --- Check and install Docker Compose if needed --- | |
| 168 | + | # --- Check Docker Compose --- | |
| 215 | 169 | echo "Checking Docker Compose..." | |
| 216 | 170 | if ! command -v docker compose &> /dev/null; then | |
| 217 | 171 | echo "Docker Compose not found. Installing..." | |
| 218 | - | # Try to install docker-compose-plugin | |
| 219 | 172 | if command -v apt-get &> /dev/null; then | |
| 220 | - | apt-get update && apt-get install -y docker-compose-plugin 2>/dev/null || echo "Warning: Could not install docker-compose-plugin" | |
| 173 | + | sudo apt-get update && sudo apt-get install -y docker-compose-plugin | |
| 221 | 174 | elif command -v yum &> /dev/null; then | |
| 222 | - | yum install -y docker-compose-plugin 2>/dev/null || echo "Warning: Could not install docker-compose-plugin" | |
| 175 | + | sudo yum install -y docker-compose-plugin | |
| 223 | 176 | else | |
| 224 | - | echo "WARNING: Could not install docker-compose-plugin automatically" | |
| 225 | - | echo "Please install it manually" | |
| 177 | + | echo "ERROR: Could not install docker-compose-plugin" | |
| 178 | + | echo "Please install Docker Compose manually" | |
| 179 | + | exit 1 | |
| 226 | 180 | fi | |
| 227 | 181 | else | |
| 228 | 182 | echo "Docker Compose is already installed" | |
| @@ -231,29 +185,25 @@ elif [ "$RUNNER_MODE" = "docker" ]; then | |||
| 231 | 185 | ||
| 232 | 186 | # --- Create working directory --- | |
| 233 | 187 | echo "Creating working directory..." | |
| 234 | - | mkdir -p "$COMPOSE_DIR"/{data,cache} | |
| 235 | - | cd "$COMPOSE_DIR" | |
| 188 | + | mkdir -p ~/forgejo-runner/{data,cache} | |
| 189 | + | cd ~/forgejo-runner | |
| 236 | 190 | ||
| 237 | 191 | # --- Register runner using Docker --- | |
| 238 | 192 | echo "Registering runner with Forgejo..." | |
| 239 | 193 | docker run -it --rm \ | |
| 240 | - | -v "$(pwd)/data:/data" \ | |
| 194 | + | -v $(pwd)/data:/data \ | |
| 241 | 195 | -w /data \ | |
| 242 | 196 | --user root \ | |
| 243 | - | "${RUNNER_IMAGE}:${RUNNER_VERSION#v}" \ | |
| 197 | + | data.forgejo.org/forgejo/runner:${RUNNER_VERSION} \ | |
| 244 | 198 | forgejo-runner register \ | |
| 245 | 199 | --no-interactive \ | |
| 246 | 200 | --token "$REGISTRATION_TOKEN" \ | |
| 247 | 201 | --name "$RUNNER_NAME" \ | |
| 248 | 202 | --instance "$FORGEJO_URL" \ | |
| 249 | - | --labels "$RUNNER_NAME:host" 2>/dev/null || { | |
| 250 | - | echo "WARNING: Registration failed" | |
| 251 | - | echo "You may need to register manually:" | |
| 252 | - | echo " docker run -it --rm -v \$(pwd)/data:/data -w /data --user root ${RUNNER_IMAGE}:${RUNNER_VERSION#v} forgejo-runner register --no-interactive --token $REGISTRATION_TOKEN --name $RUNNER_NAME --instance $FORGEJO_URL --labels $RUNNER_NAME:host" | |
| 253 | - | } | |
| 203 | + | --labels "$RUNNER_NAME:host" | |
| 254 | 204 | ||
| 255 | 205 | # --- Generate config.yaml --- | |
| 256 | - | echo "Generating configuration..." | |
| 206 | + | echo "Creating configuration..." | |
| 257 | 207 | cat > data/config.yaml << EOF | |
| 258 | 208 | instance: $FORGEJO_URL | |
| 259 | 209 | token: "$REGISTRATION_TOKEN" | |
| @@ -295,7 +245,7 @@ version: '3.8' | |||
| 295 | 245 | ||
| 296 | 246 | services: | |
| 297 | 247 | docker-in-docker: | |
| 298 | - | image: $DIND_IMAGE | |
| 248 | + | image: docker:dind | |
| 299 | 249 | container_name: ${RUNNER_NAME}_dind | |
| 300 | 250 | privileged: true | |
| 301 | 251 | command: ['dockerd', '-H', 'tcp://0.0.0.0:2375', '--tls=false'] | |
| @@ -304,7 +254,7 @@ services: | |||
| 304 | 254 | - dind-storage:/var/lib/docker | |
| 305 | 255 | ||
| 306 | 256 | runner: | |
| 307 | - | image: ${RUNNER_IMAGE}:${RUNNER_VERSION#v} | |
| 257 | + | image: data.forgejo.org/forgejo/runner:${RUNNER_VERSION} | |
| 308 | 258 | container_name: ${RUNNER_NAME} | |
| 309 | 259 | depends_on: | |
| 310 | 260 | docker-in-docker: | |
| @@ -326,7 +276,7 @@ volumes: | |||
| 326 | 276 | dind-storage: | |
| 327 | 277 | EOF | |
| 328 | 278 | ||
| 329 | - | # --- Create systemd service for docker-compose --- | |
| 279 | + | # --- Create systemd service --- | |
| 330 | 280 | echo "Creating systemd service..." | |
| 331 | 281 | sudo tee /etc/systemd/system/forgejo-runner-docker.service > /dev/null << EOF | |
| 332 | 282 | [Unit] | |
| @@ -337,7 +287,7 @@ Requires=docker.service | |||
| 337 | 287 | [Service] | |
| 338 | 288 | Type=oneshot | |
| 339 | 289 | RemainAfterExit=yes | |
| 340 | - | WorkingDirectory=$COMPOSE_DIR | |
| 290 | + | WorkingDirectory=$HOME/forgejo-runner | |
| 341 | 291 | ExecStart=/usr/bin/docker compose up -d | |
| 342 | 292 | ExecStop=/usr/bin/docker compose down | |
| 343 | 293 | ExecReload=/usr/bin/docker compose restart | |
| @@ -352,25 +302,25 @@ EOF | |||
| 352 | 302 | # --- Enable and start service --- | |
| 353 | 303 | echo "Starting service..." | |
| 354 | 304 | sudo systemctl daemon-reload | |
| 355 | - | sudo systemctl enable forgejo-runner-docker.service 2>/dev/null || echo "Warning: Could not enable service" | |
| 356 | - | sudo systemctl start forgejo-runner-docker.service 2>/dev/null || echo "Warning: Could not start service" | |
| 305 | + | sudo systemctl enable forgejo-runner-docker.service | |
| 306 | + | sudo systemctl start forgejo-runner-docker.service | |
| 357 | 307 | ||
| 358 | 308 | echo "" | |
| 359 | 309 | echo "=== DOCKER MODE DEPLOYMENT COMPLETE ===" | |
| 360 | 310 | echo "" | |
| 361 | 311 | echo "Service status:" | |
| 362 | - | sudo systemctl status forgejo-runner-docker.service --no-pager 2>/dev/null || echo "Service status unavailable" | |
| 312 | + | sudo systemctl status forgejo-runner-docker.service --no-pager | |
| 363 | 313 | echo "" | |
| 364 | 314 | echo "To view logs:" | |
| 365 | - | echo " docker compose -f $COMPOSE_DIR/docker-compose.yml logs -f runner" | |
| 315 | + | echo " docker compose -f $HOME/forgejo-runner/docker-compose.yml logs -f runner" | |
| 366 | 316 | echo "" | |
| 367 | 317 | echo "To manage:" | |
| 368 | - | echo " cd $COMPOSE_DIR" | |
| 318 | + | echo " cd ~/forgejo-runner" | |
| 369 | 319 | echo " docker compose up -d # start" | |
| 370 | 320 | echo " docker compose down # stop" | |
| 371 | 321 | echo " docker compose restart # restart" | |
| 372 | 322 | echo "" | |
| 373 | - | echo "Runner location: $COMPOSE_DIR" | |
| 323 | + | echo "Runner location: ~/forgejo-runner" | |
| 374 | 324 | ||
| 375 | 325 | # ============================================================================= | |
| 376 | 326 | # INVALID MODE | |
| @@ -391,6 +341,6 @@ echo "" | |||
| 391 | 341 | if [ "$RUNNER_MODE" = "direct" ]; then | |
| 392 | 342 | echo "To check runner logs: sudo journalctl -u forgejo-runner -f" | |
| 393 | 343 | else | |
| 394 | - | echo "To check runner logs: docker compose -f $COMPOSE_DIR/docker-compose.yml logs -f runner" | |
| 344 | + | echo "To check runner logs: docker compose -f $HOME/forgejo-runner/docker-compose.yml logs -f runner" | |
| 395 | 345 | fi | |
| 396 | 346 | echo "============================================================" | |
entitybtw revised this gist 1 month ago. Go to revision
1 file changed, 44 insertions, 29 deletions
forgejo-actions-guide-docker.txt
| @@ -1,7 +1,7 @@ | |||
| 1 | 1 | #!/bin/bash | |
| 2 | 2 | # ============================================================================= | |
| 3 | 3 | # FORGEJO RUNNER - FULL SYSTEM DEPLOYMENT WITH SYSTEMD | |
| 4 | - | # Supports both DIRECT and DOCKER modes | |
| 4 | + | # Supports both DIRECT and DOCKER modes - NO EXTERNAL DEPENDENCIES | |
| 5 | 5 | # ============================================================================= | |
| 6 | 6 | ||
| 7 | 7 | # --- CONFIGURATION VARIABLES --- | |
| @@ -34,29 +34,26 @@ echo "" | |||
| 34 | 34 | ARCH=$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/;s/armv7l/armv7/') | |
| 35 | 35 | echo "Detected architecture: $ARCH" | |
| 36 | 36 | ||
| 37 | - | # --- STEP 2: Get actual version if "latest" --- | |
| 37 | + | # --- STEP 2: Get actual version if "latest" (NO DEPENDENCIES) --- | |
| 38 | 38 | if [ "$RUNNER_VERSION" = "latest" ]; then | |
| 39 | 39 | echo "Fetching latest Forgejo Runner version..." | |
| 40 | 40 | ||
| 41 | - | # Check if jq is installed | |
| 42 | - | if ! command -v jq &> /dev/null; then | |
| 43 | - | echo "jq not found. Installing jq..." | |
| 44 | - | apt-get update && apt-get install -y jq | |
| 45 | - | fi | |
| 46 | - | ||
| 47 | - | # Get version using jq (your method) | |
| 48 | - | RUNNER_VERSION=$(curl -s https://code.forgejo.org/api/v1/repos/forgejo/runner/releases/latest | jq -r .tag_name) | |
| 41 | + | # Try API with grep (no jq needed) | |
| 42 | + | RUNNER_VERSION=$(curl -s https://code.forgejo.org/api/v1/repos/forgejo/runner/releases/latest | \ | |
| 43 | + | grep -o '"tag_name":"v[0-9]\+\.[0-9]\+\.[0-9]\+"' | \ | |
| 44 | + | head -1 | sed 's/"tag_name":"//' | sed 's/"//') | |
| 49 | 45 | ||
| 50 | - | # Verify we got a valid version | |
| 51 | - | if [ -z "$RUNNER_VERSION" ] || [ "$RUNNER_VERSION" = "null" ]; then | |
| 52 | - | echo "Failed to get version from API, trying fallback..." | |
| 46 | + | # If API fails, try HTML parsing | |
| 47 | + | if [ -z "$RUNNER_VERSION" ]; then | |
| 48 | + | echo "API failed, trying HTML parsing..." | |
| 53 | 49 | RUNNER_VERSION=$(curl -s https://code.forgejo.org/forgejo/runner/releases | \ | |
| 54 | - | grep -o 'v[0-9]\+\.[0-9]\+\.[0-9]\+' | head -1) | |
| 50 | + | grep -o 'v[0-9]\+\.[0-9]\+\.[0-9]\+' | \ | |
| 51 | + | head -1) | |
| 55 | 52 | fi | |
| 56 | 53 | ||
| 54 | + | # If still empty, use fallback | |
| 57 | 55 | if [ -z "$RUNNER_VERSION" ]; then | |
| 58 | - | echo "ERROR: Failed to fetch latest version" | |
| 59 | - | echo "Using fallback version v12.13.2" | |
| 56 | + | echo "Failed to fetch latest version, using fallback v12.13.2" | |
| 60 | 57 | RUNNER_VERSION="v12.13.2" | |
| 61 | 58 | fi | |
| 62 | 59 | ||
| @@ -68,7 +65,9 @@ VERSION_NUM=${RUNNER_VERSION#v} | |||
| 68 | 65 | echo "Using version: $RUNNER_VERSION (number: $VERSION_NUM)" | |
| 69 | 66 | echo "" | |
| 70 | 67 | ||
| 71 | - | # --- STEP 3: Download runner binary (direct mode) --- | |
| 68 | + | # ============================================================================= | |
| 69 | + | # DIRECT MODE INSTALLATION | |
| 70 | + | # ============================================================================= | |
| 72 | 71 | if [ "$RUNNER_MODE" = "direct" ]; then | |
| 73 | 72 | echo "=== DIRECT MODE INSTALLATION ===" | |
| 74 | 73 | echo "Installing runner directly on the system (no Docker required)" | |
| @@ -99,7 +98,7 @@ if [ "$RUNNER_MODE" = "direct" ]; then | |||
| 99 | 98 | ||
| 100 | 99 | # Verify binary | |
| 101 | 100 | echo "Verifying binary..." | |
| 102 | - | "$RUNNER_HOME/bin/forgejo-runner" --version || echo "Warning: Version check failed" | |
| 101 | + | "$RUNNER_HOME/bin/forgejo-runner" --version 2>/dev/null || echo "Warning: Version check failed" | |
| 103 | 102 | ||
| 104 | 103 | # --- Register runner --- | |
| 105 | 104 | echo "Registering runner with Forgejo..." | |
| @@ -108,7 +107,11 @@ if [ "$RUNNER_MODE" = "direct" ]; then | |||
| 108 | 107 | --name "$RUNNER_NAME" \ | |
| 109 | 108 | --instance "$FORGEJO_URL" \ | |
| 110 | 109 | --labels "$RUNNER_NAME:host" \ | |
| 111 | - | --no-interactive | |
| 110 | + | --no-interactive 2>/dev/null || { | |
| 111 | + | echo "WARNING: Registration failed, but continuing..." | |
| 112 | + | echo "You may need to register manually:" | |
| 113 | + | echo " $RUNNER_HOME/bin/forgejo-runner register --token $REGISTRATION_TOKEN --name $RUNNER_NAME --instance $FORGEJO_URL --labels $RUNNER_NAME:host --no-interactive" | |
| 114 | + | } | |
| 112 | 115 | ||
| 113 | 116 | # --- Create config.yaml --- | |
| 114 | 117 | echo "Creating configuration..." | |
| @@ -166,14 +169,14 @@ EOF | |||
| 166 | 169 | # --- Enable and start service --- | |
| 167 | 170 | echo "Starting service..." | |
| 168 | 171 | sudo systemctl daemon-reload | |
| 169 | - | sudo systemctl enable forgejo-runner.service | |
| 170 | - | sudo systemctl start forgejo-runner.service | |
| 172 | + | sudo systemctl enable forgejo-runner.service 2>/dev/null || echo "Warning: Could not enable service" | |
| 173 | + | sudo systemctl start forgejo-runner.service 2>/dev/null || echo "Warning: Could not start service" | |
| 171 | 174 | ||
| 172 | 175 | echo "" | |
| 173 | 176 | echo "=== DIRECT MODE DEPLOYMENT COMPLETE ===" | |
| 174 | 177 | echo "" | |
| 175 | 178 | echo "Service status:" | |
| 176 | - | sudo systemctl status forgejo-runner.service --no-pager | |
| 179 | + | sudo systemctl status forgejo-runner.service --no-pager 2>/dev/null || echo "Service status unavailable" | |
| 177 | 180 | echo "" | |
| 178 | 181 | echo "To view logs:" | |
| 179 | 182 | echo " sudo journalctl -u forgejo-runner -f" | |
| @@ -202,9 +205,9 @@ elif [ "$RUNNER_MODE" = "docker" ]; then | |||
| 202 | 205 | echo "Docker is already installed" | |
| 203 | 206 | fi | |
| 204 | 207 | ||
| 205 | - | if ! systemctl is-active --quiet docker; then | |
| 208 | + | if ! systemctl is-active --quiet docker 2>/dev/null; then | |
| 206 | 209 | echo "Starting Docker service..." | |
| 207 | - | sudo systemctl start docker | |
| 210 | + | sudo systemctl start docker 2>/dev/null || echo "Warning: Could not start Docker" | |
| 208 | 211 | fi | |
| 209 | 212 | echo "Docker is running" | |
| 210 | 213 | ||
| @@ -212,7 +215,15 @@ elif [ "$RUNNER_MODE" = "docker" ]; then | |||
| 212 | 215 | echo "Checking Docker Compose..." | |
| 213 | 216 | if ! command -v docker compose &> /dev/null; then | |
| 214 | 217 | echo "Docker Compose not found. Installing..." | |
| 215 | - | apt-get update && apt-get install -y docker-compose-plugin | |
| 218 | + | # Try to install docker-compose-plugin | |
| 219 | + | if command -v apt-get &> /dev/null; then | |
| 220 | + | apt-get update && apt-get install -y docker-compose-plugin 2>/dev/null || echo "Warning: Could not install docker-compose-plugin" | |
| 221 | + | elif command -v yum &> /dev/null; then | |
| 222 | + | yum install -y docker-compose-plugin 2>/dev/null || echo "Warning: Could not install docker-compose-plugin" | |
| 223 | + | else | |
| 224 | + | echo "WARNING: Could not install docker-compose-plugin automatically" | |
| 225 | + | echo "Please install it manually" | |
| 226 | + | fi | |
| 216 | 227 | else | |
| 217 | 228 | echo "Docker Compose is already installed" | |
| 218 | 229 | fi | |
| @@ -235,7 +246,11 @@ elif [ "$RUNNER_MODE" = "docker" ]; then | |||
| 235 | 246 | --token "$REGISTRATION_TOKEN" \ | |
| 236 | 247 | --name "$RUNNER_NAME" \ | |
| 237 | 248 | --instance "$FORGEJO_URL" \ | |
| 238 | - | --labels "$RUNNER_NAME:host" | |
| 249 | + | --labels "$RUNNER_NAME:host" 2>/dev/null || { | |
| 250 | + | echo "WARNING: Registration failed" | |
| 251 | + | echo "You may need to register manually:" | |
| 252 | + | echo " docker run -it --rm -v \$(pwd)/data:/data -w /data --user root ${RUNNER_IMAGE}:${RUNNER_VERSION#v} forgejo-runner register --no-interactive --token $REGISTRATION_TOKEN --name $RUNNER_NAME --instance $FORGEJO_URL --labels $RUNNER_NAME:host" | |
| 253 | + | } | |
| 239 | 254 | ||
| 240 | 255 | # --- Generate config.yaml --- | |
| 241 | 256 | echo "Generating configuration..." | |
| @@ -337,14 +352,14 @@ EOF | |||
| 337 | 352 | # --- Enable and start service --- | |
| 338 | 353 | echo "Starting service..." | |
| 339 | 354 | sudo systemctl daemon-reload | |
| 340 | - | sudo systemctl enable forgejo-runner-docker.service | |
| 341 | - | sudo systemctl start forgejo-runner-docker.service | |
| 355 | + | sudo systemctl enable forgejo-runner-docker.service 2>/dev/null || echo "Warning: Could not enable service" | |
| 356 | + | sudo systemctl start forgejo-runner-docker.service 2>/dev/null || echo "Warning: Could not start service" | |
| 342 | 357 | ||
| 343 | 358 | echo "" | |
| 344 | 359 | echo "=== DOCKER MODE DEPLOYMENT COMPLETE ===" | |
| 345 | 360 | echo "" | |
| 346 | 361 | echo "Service status:" | |
| 347 | - | sudo systemctl status forgejo-runner-docker.service --no-pager | |
| 362 | + | sudo systemctl status forgejo-runner-docker.service --no-pager 2>/dev/null || echo "Service status unavailable" | |
| 348 | 363 | echo "" | |
| 349 | 364 | echo "To view logs:" | |
| 350 | 365 | echo " docker compose -f $COMPOSE_DIR/docker-compose.yml logs -f runner" | |
entitybtw revised this gist 1 month ago. Go to revision
1 file changed, 29 insertions, 59 deletions
forgejo-actions-guide-docker.txt
| @@ -8,7 +8,7 @@ | |||
| 8 | 8 | FORGEJO_URL="http://192.168.2.76:3006" # CHANGE THIS | |
| 9 | 9 | REGISTRATION_TOKEN="your-registration-token" # CHANGE THIS | |
| 10 | 10 | RUNNER_NAME="selfhosted-runner-01" | |
| 11 | - | RUNNER_VERSION="latest" # Can be "latest" or specific like "v3.4.1" | |
| 11 | + | RUNNER_VERSION="latest" # Can be "latest" or specific like "v12.13.2" | |
| 12 | 12 | RUNNER_MODE="direct" # "direct" or "docker" | |
| 13 | 13 | ||
| 14 | 14 | # Direct mode variables - using current user | |
| @@ -31,77 +31,44 @@ echo "Instance: $FORGEJO_URL" | |||
| 31 | 31 | echo "" | |
| 32 | 32 | ||
| 33 | 33 | # --- STEP 1: Detect system architecture --- | |
| 34 | - | ARCH=$(uname -m) | |
| 35 | - | case $ARCH in | |
| 36 | - | x86_64) | |
| 37 | - | ARCH="amd64" | |
| 38 | - | ;; | |
| 39 | - | aarch64|arm64) | |
| 40 | - | ARCH="arm64" | |
| 41 | - | ;; | |
| 42 | - | armv7l|armhf) | |
| 43 | - | ARCH="armv7" | |
| 44 | - | ;; | |
| 45 | - | *) | |
| 46 | - | echo "Unsupported architecture: $ARCH" | |
| 47 | - | exit 1 | |
| 48 | - | ;; | |
| 49 | - | esac | |
| 34 | + | ARCH=$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/;s/armv7l/armv7/') | |
| 50 | 35 | echo "Detected architecture: $ARCH" | |
| 51 | 36 | ||
| 52 | 37 | # --- STEP 2: Get actual version if "latest" --- | |
| 53 | 38 | if [ "$RUNNER_VERSION" = "latest" ]; then | |
| 54 | 39 | echo "Fetching latest Forgejo Runner version..." | |
| 55 | 40 | ||
| 56 | - | # Try multiple sources specifically for Forgejo Runner | |
| 57 | - | LATEST_VERSION="" | |
| 58 | - | ||
| 59 | - | # Try 1: Official Forgejo API | |
| 60 | - | if [ -z "$LATEST_VERSION" ]; then | |
| 61 | - | echo "Trying Forgejo API..." | |
| 62 | - | LATEST_VERSION=$(curl -s -m 10 https://code.forgejo.org/api/v1/repos/forgejo/runner/releases/latest | \ | |
| 63 | - | grep -o '"tag_name":"v[0-9]\+\.[0-9]\+\.[0-9]\+"' | \ | |
| 64 | - | head -1 | sed 's/"tag_name":"//' | sed 's/"//' | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$') | |
| 41 | + | # Check if jq is installed | |
| 42 | + | if ! command -v jq &> /dev/null; then | |
| 43 | + | echo "jq not found. Installing jq..." | |
| 44 | + | apt-get update && apt-get install -y jq | |
| 65 | 45 | fi | |
| 66 | 46 | ||
| 67 | - | # Try 2: GitHub API (mirror) | |
| 68 | - | if [ -z "$LATEST_VERSION" ]; then | |
| 69 | - | echo "Trying GitHub API..." | |
| 70 | - | LATEST_VERSION=$(curl -s -m 10 https://api.github.com/repos/forgejo/runner/releases/latest | \ | |
| 71 | - | grep -o '"tag_name":"v[0-9]\+\.[0-9]\+\.[0-9]\+"' | \ | |
| 72 | - | head -1 | sed 's/"tag_name":"//' | sed 's/"//' | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$') | |
| 73 | - | fi | |
| 74 | - | ||
| 75 | - | # Try 3: Direct HTML parsing with more specific pattern | |
| 76 | - | if [ -z "$LATEST_VERSION" ]; then | |
| 77 | - | echo "Trying HTML parsing..." | |
| 78 | - | LATEST_VERSION=$(curl -s -m 10 https://code.forgejo.org/forgejo/runner/releases | \ | |
| 79 | - | grep -o 'forgejo-runner-[0-9]\+\.[0-9]\+\.[0-9]\+-linux' | \ | |
| 80 | - | head -1 | sed 's/forgejo-runner-//' | sed 's/-linux//' | sed 's/^/v/') | |
| 81 | - | fi | |
| 47 | + | # Get version using jq (your method) | |
| 48 | + | RUNNER_VERSION=$(curl -s https://code.forgejo.org/api/v1/repos/forgejo/runner/releases/latest | jq -r .tag_name) | |
| 82 | 49 | ||
| 83 | - | # Try 4: Direct download page | |
| 84 | - | if [ -z "$LATEST_VERSION" ]; then | |
| 85 | - | echo "Trying releases page..." | |
| 86 | - | LATEST_VERSION=$(curl -s -m 10 https://code.forgejo.org/forgejo/runner/releases/ | \ | |
| 87 | - | grep -E 'href="/forgejo/runner/releases/tag/v[0-9]+\.[0-9]+\.[0-9]+"' | \ | |
| 88 | - | head -1 | sed 's/.*tag\/v/v/' | sed 's/".*//') | |
| 50 | + | # Verify we got a valid version | |
| 51 | + | if [ -z "$RUNNER_VERSION" ] || [ "$RUNNER_VERSION" = "null" ]; then | |
| 52 | + | echo "Failed to get version from API, trying fallback..." | |
| 53 | + | RUNNER_VERSION=$(curl -s https://code.forgejo.org/forgejo/runner/releases | \ | |
| 54 | + | grep -o 'v[0-9]\+\.[0-9]\+\.[0-9]\+' | head -1) | |
| 89 | 55 | fi | |
| 90 | 56 | ||
| 91 | - | # Fallback to hardcoded version | |
| 92 | - | if [ -z "$LATEST_VERSION" ] || [[ ! "$LATEST_VERSION" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then | |
| 93 | - | echo "Failed to fetch valid version, using fallback v3.4.1" | |
| 94 | - | LATEST_VERSION="v3.4.1" | |
| 57 | + | if [ -z "$RUNNER_VERSION" ]; then | |
| 58 | + | echo "ERROR: Failed to fetch latest version" | |
| 59 | + | echo "Using fallback version v12.13.2" | |
| 60 | + | RUNNER_VERSION="v12.13.2" | |
| 95 | 61 | fi | |
| 96 | 62 | ||
| 97 | - | RUNNER_VERSION="$LATEST_VERSION" | |
| 63 | + | echo "Latest version: $RUNNER_VERSION" | |
| 98 | 64 | fi | |
| 99 | - | echo "Using version: $RUNNER_VERSION" | |
| 65 | + | ||
| 66 | + | # Remove 'v' prefix for version number | |
| 67 | + | VERSION_NUM=${RUNNER_VERSION#v} | |
| 68 | + | echo "Using version: $RUNNER_VERSION (number: $VERSION_NUM)" | |
| 100 | 69 | echo "" | |
| 101 | 70 | ||
| 102 | - | # ============================================================================= | |
| 103 | - | # DIRECT MODE INSTALLATION | |
| 104 | - | # ============================================================================= | |
| 71 | + | # --- STEP 3: Download runner binary (direct mode) --- | |
| 105 | 72 | if [ "$RUNNER_MODE" = "direct" ]; then | |
| 106 | 73 | echo "=== DIRECT MODE INSTALLATION ===" | |
| 107 | 74 | echo "Installing runner directly on the system (no Docker required)" | |
| @@ -115,13 +82,12 @@ if [ "$RUNNER_MODE" = "direct" ]; then | |||
| 115 | 82 | ||
| 116 | 83 | # --- Download runner binary --- | |
| 117 | 84 | echo "Downloading Forgejo runner binary..." | |
| 118 | - | VERSION_NUM=${RUNNER_VERSION#v} | |
| 119 | 85 | DOWNLOAD_URL="https://code.forgejo.org/forgejo/runner/releases/download/$RUNNER_VERSION/forgejo-runner-${VERSION_NUM}-linux-$ARCH" | |
| 120 | 86 | ||
| 121 | 87 | echo "Downloading from: $DOWNLOAD_URL" | |
| 122 | 88 | ||
| 123 | 89 | # Download with timeout and retry | |
| 124 | - | if ! curl -L -m 30 --retry 3 "$DOWNLOAD_URL" -o "$RUNNER_HOME/bin/forgejo-runner"; then | |
| 90 | + | if ! curl -L -m 60 --retry 3 "$DOWNLOAD_URL" -o "$RUNNER_HOME/bin/forgejo-runner"; then | |
| 125 | 91 | echo "ERROR: Failed to download runner binary" | |
| 126 | 92 | echo "Try manual download:" | |
| 127 | 93 | echo " wget $DOWNLOAD_URL" | |
| @@ -131,6 +97,10 @@ if [ "$RUNNER_MODE" = "direct" ]; then | |||
| 131 | 97 | chmod +x "$RUNNER_HOME/bin/forgejo-runner" | |
| 132 | 98 | chown -R "$USER":"$USER" "$RUNNER_HOME" | |
| 133 | 99 | ||
| 100 | + | # Verify binary | |
| 101 | + | echo "Verifying binary..." | |
| 102 | + | "$RUNNER_HOME/bin/forgejo-runner" --version || echo "Warning: Version check failed" | |
| 103 | + | ||
| 134 | 104 | # --- Register runner --- | |
| 135 | 105 | echo "Registering runner with Forgejo..." | |
| 136 | 106 | "$RUNNER_HOME/bin/forgejo-runner" register \ | |
| @@ -242,7 +212,7 @@ elif [ "$RUNNER_MODE" = "docker" ]; then | |||
| 242 | 212 | echo "Checking Docker Compose..." | |
| 243 | 213 | if ! command -v docker compose &> /dev/null; then | |
| 244 | 214 | echo "Docker Compose not found. Installing..." | |
| 245 | - | sudo apt update && sudo apt install -y docker-compose-plugin | |
| 215 | + | apt-get update && apt-get install -y docker-compose-plugin | |
| 246 | 216 | else | |
| 247 | 217 | echo "Docker Compose is already installed" | |
| 248 | 218 | fi | |
entitybtw revised this gist 1 month ago. Go to revision
1 file changed, 67 insertions, 27 deletions
forgejo-actions-guide-docker.txt
| @@ -5,14 +5,13 @@ | |||
| 5 | 5 | # ============================================================================= | |
| 6 | 6 | ||
| 7 | 7 | # --- CONFIGURATION VARIABLES --- | |
| 8 | - | FORGEJO_URL="https://your-forgejo-domain.com" # CHANGE THIS | |
| 8 | + | FORGEJO_URL="http://192.168.2.76:3006" # CHANGE THIS | |
| 9 | 9 | REGISTRATION_TOKEN="your-registration-token" # CHANGE THIS | |
| 10 | 10 | RUNNER_NAME="selfhosted-runner-01" | |
| 11 | - | RUNNER_VERSION="latest" # Can be "latest" or specific like "v4.0.0" | |
| 11 | + | RUNNER_VERSION="latest" # Can be "latest" or specific like "v3.4.1" | |
| 12 | 12 | RUNNER_MODE="direct" # "direct" or "docker" | |
| 13 | 13 | ||
| 14 | - | # Direct mode variables | |
| 15 | - | RUNNER_USER="forgejo-runner" | |
| 14 | + | # Direct mode variables - using current user | |
| 16 | 15 | RUNNER_HOME="/opt/forgejo-runner" | |
| 17 | 16 | ||
| 18 | 17 | # Docker mode variables | |
| @@ -52,15 +51,52 @@ echo "Detected architecture: $ARCH" | |||
| 52 | 51 | ||
| 53 | 52 | # --- STEP 2: Get actual version if "latest" --- | |
| 54 | 53 | if [ "$RUNNER_VERSION" = "latest" ]; then | |
| 55 | - | echo "Fetching latest version..." | |
| 56 | - | RUNNER_VERSION=$(curl -s https://code.forgejo.org/forgejo/runner/releases/latest | \ | |
| 57 | - | grep -o 'v[0-9]\+\.[0-9]\+\.[0-9]\+' | head -1) | |
| 58 | - | if [ -z "$RUNNER_VERSION" ]; then | |
| 59 | - | echo "Failed to fetch latest version, using fallback v4.0.0" | |
| 60 | - | RUNNER_VERSION="v4.0.0" | |
| 54 | + | echo "Fetching latest Forgejo Runner version..." | |
| 55 | + | ||
| 56 | + | # Try multiple sources specifically for Forgejo Runner | |
| 57 | + | LATEST_VERSION="" | |
| 58 | + | ||
| 59 | + | # Try 1: Official Forgejo API | |
| 60 | + | if [ -z "$LATEST_VERSION" ]; then | |
| 61 | + | echo "Trying Forgejo API..." | |
| 62 | + | LATEST_VERSION=$(curl -s -m 10 https://code.forgejo.org/api/v1/repos/forgejo/runner/releases/latest | \ | |
| 63 | + | grep -o '"tag_name":"v[0-9]\+\.[0-9]\+\.[0-9]\+"' | \ | |
| 64 | + | head -1 | sed 's/"tag_name":"//' | sed 's/"//' | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$') | |
| 61 | 65 | fi | |
| 62 | - | echo "Latest version: $RUNNER_VERSION" | |
| 66 | + | ||
| 67 | + | # Try 2: GitHub API (mirror) | |
| 68 | + | if [ -z "$LATEST_VERSION" ]; then | |
| 69 | + | echo "Trying GitHub API..." | |
| 70 | + | LATEST_VERSION=$(curl -s -m 10 https://api.github.com/repos/forgejo/runner/releases/latest | \ | |
| 71 | + | grep -o '"tag_name":"v[0-9]\+\.[0-9]\+\.[0-9]\+"' | \ | |
| 72 | + | head -1 | sed 's/"tag_name":"//' | sed 's/"//' | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$') | |
| 73 | + | fi | |
| 74 | + | ||
| 75 | + | # Try 3: Direct HTML parsing with more specific pattern | |
| 76 | + | if [ -z "$LATEST_VERSION" ]; then | |
| 77 | + | echo "Trying HTML parsing..." | |
| 78 | + | LATEST_VERSION=$(curl -s -m 10 https://code.forgejo.org/forgejo/runner/releases | \ | |
| 79 | + | grep -o 'forgejo-runner-[0-9]\+\.[0-9]\+\.[0-9]\+-linux' | \ | |
| 80 | + | head -1 | sed 's/forgejo-runner-//' | sed 's/-linux//' | sed 's/^/v/') | |
| 81 | + | fi | |
| 82 | + | ||
| 83 | + | # Try 4: Direct download page | |
| 84 | + | if [ -z "$LATEST_VERSION" ]; then | |
| 85 | + | echo "Trying releases page..." | |
| 86 | + | LATEST_VERSION=$(curl -s -m 10 https://code.forgejo.org/forgejo/runner/releases/ | \ | |
| 87 | + | grep -E 'href="/forgejo/runner/releases/tag/v[0-9]+\.[0-9]+\.[0-9]+"' | \ | |
| 88 | + | head -1 | sed 's/.*tag\/v/v/' | sed 's/".*//') | |
| 89 | + | fi | |
| 90 | + | ||
| 91 | + | # Fallback to hardcoded version | |
| 92 | + | if [ -z "$LATEST_VERSION" ] || [[ ! "$LATEST_VERSION" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then | |
| 93 | + | echo "Failed to fetch valid version, using fallback v3.4.1" | |
| 94 | + | LATEST_VERSION="v3.4.1" | |
| 95 | + | fi | |
| 96 | + | ||
| 97 | + | RUNNER_VERSION="$LATEST_VERSION" | |
| 63 | 98 | fi | |
| 99 | + | echo "Using version: $RUNNER_VERSION" | |
| 64 | 100 | echo "" | |
| 65 | 101 | ||
| 66 | 102 | # ============================================================================= | |
| @@ -69,31 +105,35 @@ echo "" | |||
| 69 | 105 | if [ "$RUNNER_MODE" = "direct" ]; then | |
| 70 | 106 | echo "=== DIRECT MODE INSTALLATION ===" | |
| 71 | 107 | echo "Installing runner directly on the system (no Docker required)" | |
| 108 | + | echo "Using current user: $USER" | |
| 72 | 109 | echo "" | |
| 73 | 110 | ||
| 74 | - | # --- Create runner user --- | |
| 75 | - | echo "Creating runner user..." | |
| 76 | - | if ! id "$RUNNER_USER" &>/dev/null; then | |
| 77 | - | sudo useradd -r -m -d "$RUNNER_HOME" -s /bin/bash "$RUNNER_USER" | |
| 78 | - | else | |
| 79 | - | echo "User $RUNNER_USER already exists" | |
| 80 | - | fi | |
| 111 | + | # --- Create directory --- | |
| 112 | + | echo "Creating runner directory..." | |
| 113 | + | sudo mkdir -p "$RUNNER_HOME/bin" | |
| 114 | + | sudo chown -R "$USER":"$USER" "$RUNNER_HOME" | |
| 81 | 115 | ||
| 82 | 116 | # --- Download runner binary --- | |
| 83 | 117 | echo "Downloading Forgejo runner binary..." | |
| 84 | - | sudo -u "$RUNNER_USER" mkdir -p "$RUNNER_HOME/bin" | |
| 85 | - | ||
| 86 | 118 | VERSION_NUM=${RUNNER_VERSION#v} | |
| 87 | 119 | DOWNLOAD_URL="https://code.forgejo.org/forgejo/runner/releases/download/$RUNNER_VERSION/forgejo-runner-${VERSION_NUM}-linux-$ARCH" | |
| 88 | 120 | ||
| 89 | 121 | echo "Downloading from: $DOWNLOAD_URL" | |
| 90 | - | sudo -u "$RUNNER_USER" curl -L "$DOWNLOAD_URL" -o "$RUNNER_HOME/bin/forgejo-runner" | |
| 91 | - | sudo chmod +x "$RUNNER_HOME/bin/forgejo-runner" | |
| 92 | - | sudo chown -R "$RUNNER_USER":"$RUNNER_USER" "$RUNNER_HOME" | |
| 122 | + | ||
| 123 | + | # Download with timeout and retry | |
| 124 | + | if ! curl -L -m 30 --retry 3 "$DOWNLOAD_URL" -o "$RUNNER_HOME/bin/forgejo-runner"; then | |
| 125 | + | echo "ERROR: Failed to download runner binary" | |
| 126 | + | echo "Try manual download:" | |
| 127 | + | echo " wget $DOWNLOAD_URL" | |
| 128 | + | exit 1 | |
| 129 | + | fi | |
| 130 | + | ||
| 131 | + | chmod +x "$RUNNER_HOME/bin/forgejo-runner" | |
| 132 | + | chown -R "$USER":"$USER" "$RUNNER_HOME" | |
| 93 | 133 | ||
| 94 | 134 | # --- Register runner --- | |
| 95 | 135 | echo "Registering runner with Forgejo..." | |
| 96 | - | sudo -u "$RUNNER_USER" "$RUNNER_HOME/bin/forgejo-runner" register \ | |
| 136 | + | "$RUNNER_HOME/bin/forgejo-runner" register \ | |
| 97 | 137 | --token "$REGISTRATION_TOKEN" \ | |
| 98 | 138 | --name "$RUNNER_NAME" \ | |
| 99 | 139 | --instance "$FORGEJO_URL" \ | |
| @@ -102,7 +142,7 @@ if [ "$RUNNER_MODE" = "direct" ]; then | |||
| 102 | 142 | ||
| 103 | 143 | # --- Create config.yaml --- | |
| 104 | 144 | echo "Creating configuration..." | |
| 105 | - | sudo -u "$RUNNER_USER" tee "$RUNNER_HOME/config.yaml" > /dev/null << EOF | |
| 145 | + | cat > "$RUNNER_HOME/config.yaml" << EOF | |
| 106 | 146 | instance: $FORGEJO_URL | |
| 107 | 147 | token: "$REGISTRATION_TOKEN" | |
| 108 | 148 | ||
| @@ -138,8 +178,8 @@ After=network.target | |||
| 138 | 178 | ||
| 139 | 179 | [Service] | |
| 140 | 180 | Type=simple | |
| 141 | - | User=$RUNNER_USER | |
| 142 | - | Group=$RUNNER_USER | |
| 181 | + | User=$USER | |
| 182 | + | Group=$USER | |
| 143 | 183 | WorkingDirectory=$RUNNER_HOME | |
| 144 | 184 | ExecStart=$RUNNER_HOME/bin/forgejo-runner daemon --config $RUNNER_HOME/config.yaml | |
| 145 | 185 | Restart=always | |
entitybtw revised this gist 1 month ago. Go to revision
No changes
entitybtw revised this gist 1 month ago. Go to revision
1 file changed, 56 insertions, 51 deletions
forgejo-actions-guide-docker.txt
| @@ -61,20 +61,6 @@ if [ "$RUNNER_VERSION" = "latest" ]; then | |||
| 61 | 61 | fi | |
| 62 | 62 | echo "Latest version: $RUNNER_VERSION" | |
| 63 | 63 | fi | |
| 64 | - | ||
| 65 | - | # --- STEP 3: Check Docker --- | |
| 66 | - | echo "Checking Docker..." | |
| 67 | - | if ! command -v docker &> /dev/null; then | |
| 68 | - | echo "ERROR: Docker is not installed. Please install Docker first." | |
| 69 | - | exit 1 | |
| 70 | - | fi | |
| 71 | - | ||
| 72 | - | if ! systemctl is-active --quiet docker; then | |
| 73 | - | echo "ERROR: Docker service is not running." | |
| 74 | - | echo "Start it with: sudo systemctl start docker" | |
| 75 | - | exit 1 | |
| 76 | - | fi | |
| 77 | - | echo "Docker is running as systemd service" | |
| 78 | 64 | echo "" | |
| 79 | 65 | ||
| 80 | 66 | # ============================================================================= | |
| @@ -82,16 +68,15 @@ echo "" | |||
| 82 | 68 | # ============================================================================= | |
| 83 | 69 | if [ "$RUNNER_MODE" = "direct" ]; then | |
| 84 | 70 | echo "=== DIRECT MODE INSTALLATION ===" | |
| 71 | + | echo "Installing runner directly on the system (no Docker required)" | |
| 85 | 72 | echo "" | |
| 86 | 73 | ||
| 87 | 74 | # --- Create runner user --- | |
| 88 | 75 | echo "Creating runner user..." | |
| 89 | 76 | if ! id "$RUNNER_USER" &>/dev/null; then | |
| 90 | 77 | sudo useradd -r -m -d "$RUNNER_HOME" -s /bin/bash "$RUNNER_USER" | |
| 91 | - | sudo usermod -aG docker "$RUNNER_USER" | |
| 92 | 78 | else | |
| 93 | 79 | echo "User $RUNNER_USER already exists" | |
| 94 | - | sudo usermod -aG docker "$RUNNER_USER" | |
| 95 | 80 | fi | |
| 96 | 81 | ||
| 97 | 82 | # --- Download runner binary --- | |
| @@ -112,39 +97,36 @@ if [ "$RUNNER_MODE" = "direct" ]; then | |||
| 112 | 97 | --token "$REGISTRATION_TOKEN" \ | |
| 113 | 98 | --name "$RUNNER_NAME" \ | |
| 114 | 99 | --instance "$FORGEJO_URL" \ | |
| 115 | - | --labels docker:docker://node:20-bookworm \ | |
| 100 | + | --labels "$RUNNER_NAME:host" \ | |
| 116 | 101 | --no-interactive | |
| 117 | 102 | ||
| 118 | 103 | # --- Create config.yaml --- | |
| 119 | 104 | echo "Creating configuration..." | |
| 120 | - | sudo -u "$RUNNER_USER" tee "$RUNNER_HOME/config.yaml" > /dev/null << 'EOF' | |
| 105 | + | sudo -u "$RUNNER_USER" tee "$RUNNER_HOME/config.yaml" > /dev/null << EOF | |
| 106 | + | instance: $FORGEJO_URL | |
| 107 | + | token: "$REGISTRATION_TOKEN" | |
| 108 | + | ||
| 121 | 109 | log: | |
| 122 | 110 | level: info | |
| 123 | 111 | ||
| 124 | 112 | runner: | |
| 125 | 113 | file: .runner | |
| 126 | - | envs: | |
| 127 | - | DOCKER_HOST: unix:///var/run/docker.sock | |
| 128 | - | cache: | |
| 129 | - | enabled: false | |
| 130 | - | dir: /opt/forgejo-runner/cache | |
| 131 | - | fetch_interval: 30 | |
| 114 | + | capacity: 1 | |
| 115 | + | timeout: 30m | |
| 116 | + | shutdown_timeout: 30m | |
| 117 | + | insecure: true | |
| 132 | 118 | fetch_timeout: 30s | |
| 119 | + | fetch_interval: 60s | |
| 120 | + | report_interval: 10s | |
| 121 | + | labels: | |
| 122 | + | - "$RUNNER_NAME:host" | |
| 133 | 123 | ||
| 134 | - | docker: | |
| 135 | - | host: unix:///var/run/docker.sock | |
| 136 | - | privileged: false | |
| 137 | - | options: >- | |
| 138 | - | -v /var/run/docker.sock:/var/run/docker.sock | |
| 139 | - | --add-host=host.docker.internal:host-gateway | |
| 124 | + | cache: | |
| 125 | + | enabled: true | |
| 126 | + | dir: "" | |
| 140 | 127 | ||
| 141 | - | container: | |
| 142 | - | network: host | |
| 143 | - | options: >- | |
| 144 | - | --add-host=host.docker.internal:host-gateway | |
| 145 | - | volumes: | |
| 146 | - | - /opt/forgejo-runner/cache:/cache | |
| 147 | - | - /var/run/docker.sock:/var/run/docker.sock | |
| 128 | + | host: | |
| 129 | + | workdir_parent: "" | |
| 148 | 130 | EOF | |
| 149 | 131 | ||
| 150 | 132 | # --- Create systemd service --- | |
| @@ -152,8 +134,7 @@ EOF | |||
| 152 | 134 | sudo tee /etc/systemd/system/forgejo-runner.service > /dev/null << EOF | |
| 153 | 135 | [Unit] | |
| 154 | 136 | Description=Forgejo Actions Runner | |
| 155 | - | After=docker.service | |
| 156 | - | Requires=docker.service | |
| 137 | + | After=network.target | |
| 157 | 138 | ||
| 158 | 139 | [Service] | |
| 159 | 140 | Type=simple | |
| @@ -194,6 +175,37 @@ EOF | |||
| 194 | 175 | # ============================================================================= | |
| 195 | 176 | elif [ "$RUNNER_MODE" = "docker" ]; then | |
| 196 | 177 | echo "=== DOCKER MODE INSTALLATION ===" | |
| 178 | + | echo "Installing runner with Docker Compose" | |
| 179 | + | echo "" | |
| 180 | + | ||
| 181 | + | # --- Check and install Docker if needed --- | |
| 182 | + | echo "Checking Docker..." | |
| 183 | + | if ! command -v docker &> /dev/null; then | |
| 184 | + | echo "Docker not found. Installing Docker..." | |
| 185 | + | curl -fsSL https://get.docker.com -o get-docker.sh | |
| 186 | + | sudo sh get-docker.sh | |
| 187 | + | sudo usermod -aG docker $USER | |
| 188 | + | sudo systemctl enable docker --now | |
| 189 | + | rm get-docker.sh | |
| 190 | + | echo "Docker installed successfully" | |
| 191 | + | else | |
| 192 | + | echo "Docker is already installed" | |
| 193 | + | fi | |
| 194 | + | ||
| 195 | + | if ! systemctl is-active --quiet docker; then | |
| 196 | + | echo "Starting Docker service..." | |
| 197 | + | sudo systemctl start docker | |
| 198 | + | fi | |
| 199 | + | echo "Docker is running" | |
| 200 | + | ||
| 201 | + | # --- Check and install Docker Compose if needed --- | |
| 202 | + | echo "Checking Docker Compose..." | |
| 203 | + | if ! command -v docker compose &> /dev/null; then | |
| 204 | + | echo "Docker Compose not found. Installing..." | |
| 205 | + | sudo apt update && sudo apt install -y docker-compose-plugin | |
| 206 | + | else | |
| 207 | + | echo "Docker Compose is already installed" | |
| 208 | + | fi | |
| 197 | 209 | echo "" | |
| 198 | 210 | ||
| 199 | 211 | # --- Create working directory --- | |
| @@ -217,14 +229,6 @@ elif [ "$RUNNER_MODE" = "docker" ]; then | |||
| 217 | 229 | ||
| 218 | 230 | # --- Generate config.yaml --- | |
| 219 | 231 | echo "Generating configuration..." | |
| 220 | - | docker run --rm \ | |
| 221 | - | -v "$(pwd)/data:/data" \ | |
| 222 | - | -w /data \ | |
| 223 | - | "${RUNNER_IMAGE}:${RUNNER_VERSION#v}" \ | |
| 224 | - | forgejo-runner generate-config > data/config.yaml | |
| 225 | - | ||
| 226 | - | # --- Customize config.yaml --- | |
| 227 | - | echo "Customizing configuration..." | |
| 228 | 232 | cat > data/config.yaml << EOF | |
| 229 | 233 | instance: $FORGEJO_URL | |
| 230 | 234 | token: "$REGISTRATION_TOKEN" | |
| @@ -359,8 +363,9 @@ echo "" | |||
| 359 | 363 | echo "Runner should now appear online in Forgejo Admin -> Actions -> Runners" | |
| 360 | 364 | echo "URL: $FORGEJO_URL/admin/actions/runners" | |
| 361 | 365 | echo "" | |
| 362 | - | echo "If runner shows offline, check:" | |
| 363 | - | echo " - Registration token is valid" | |
| 364 | - | echo " - Forgejo URL is accessible" | |
| 365 | - | echo " - Docker is running: sudo systemctl status docker" | |
| 366 | + | if [ "$RUNNER_MODE" = "direct" ]; then | |
| 367 | + | echo "To check runner logs: sudo journalctl -u forgejo-runner -f" | |
| 368 | + | else | |
| 369 | + | echo "To check runner logs: docker compose -f $COMPOSE_DIR/docker-compose.yml logs -f runner" | |
| 370 | + | fi | |
| 366 | 371 | echo "============================================================" | |
entitybtw revised this gist 1 month ago. Go to revision
1 file changed, 321 insertions, 208 deletions
forgejo-actions-guide-docker.txt
| @@ -1,253 +1,366 @@ | |||
| 1 | - | ============================================================ | |
| 2 | - | STEP-BY-STEP GUIDE: REGISTER & CONFIGURE FORGEJO RUNNER | |
| 3 | - | ============================================================ | |
| 4 | - | ||
| 5 | - | This guide walks you through the entire process: obtaining a registration | |
| 6 | - | token, registering the runner, generating a configuration file, and | |
| 7 | - | launching the runner with Docker Compose. All placeholders are clearly | |
| 8 | - | marked so you can replace them with your own values. | |
| 9 | - | ||
| 10 | - | ---------------------------------------------------------------- | |
| 11 | - | STEP 1: OBTAIN A REGISTRATION TOKEN FROM FORGEJO | |
| 12 | - | ---------------------------------------------------------------- | |
| 13 | - | ||
| 14 | - | 1. Open your Forgejo instance in a browser (e.g., http://YOUR_FORGEJO_URL). | |
| 15 | - | 2. Log in as an administrator. | |
| 16 | - | 3. Navigate to: Site Administration → Actions → Runners. | |
| 17 | - | 4. Click the "Create Runner" button. | |
| 18 | - | 5. Copy the generated token. It will look like a long alphanumeric string. | |
| 19 | - | ||
| 20 | - | Example placeholder: YOUR_REGISTRATION_TOKEN | |
| 21 | - | ||
| 22 | - | ---------------------------------------------------------------- | |
| 23 | - | STEP 2: REGISTER THE RUNNER (CREATE .runner FILE) | |
| 24 | - | ---------------------------------------------------------------- | |
| 25 | - | ||
| 26 | - | Create a working directory and register the runner using the Docker image. | |
| 27 | - | ||
| 28 | - | mkdir -p ~/forgejo-runner | |
| 29 | - | cd ~/forgejo-runner | |
| 30 | - | ||
| 31 | - | mkdir -p data cache | |
| 32 | - | ||
| 33 | - | Run the registration command, replacing the placeholders: | |
| 34 | - | ||
| 35 | - | docker run -it --rm \ | |
| 36 | - | -v $(pwd)/data:/data \ | |
| 37 | - | -w /data \ | |
| 38 | - | --user root \ | |
| 39 | - | data.forgejo.org/forgejo/runner:4.0.0 \ | |
| 40 | - | forgejo-runner register \ | |
| 41 | - | --no-interactive \ | |
| 42 | - | --token YOUR_REGISTRATION_TOKEN \ | |
| 43 | - | --name YOUR_RUNNER_NAME \ | |
| 44 | - | --instance http://YOUR_FORGEJO_URL \ | |
| 45 | - | --labels YOUR_LABEL | |
| 46 | - | ||
| 47 | - | Placeholder explanations: | |
| 48 | - | YOUR_REGISTRATION_TOKEN – the token you copied from Forgejo | |
| 49 | - | YOUR_RUNNER_NAME – a name you choose (e.g., "websites") | |
| 50 | - | YOUR_FORGEJO_URL – the URL of your Forgejo instance (e.g., "192.168.2.76:3000") | |
| 51 | - | YOUR_LABEL – one or more labels (e.g., "websites" or "ubuntu-latest,self-hosted") | |
| 52 | - | ||
| 53 | - | After success, a file data/.runner is created. This stores the runner's | |
| 54 | - | permanent credentials. | |
| 55 | - | ||
| 56 | - | Verify: | |
| 57 | - | ls -la data/.runner | |
| 58 | - | ||
| 59 | - | ---------------------------------------------------------------- | |
| 60 | - | STEP 3: GENERATE AND CONFIGURE config.yaml | |
| 61 | - | ---------------------------------------------------------------- | |
| 62 | - | ||
| 63 | - | If you don't already have a config.yaml, generate the default one: | |
| 64 | - | ||
| 65 | - | docker run --rm \ | |
| 66 | - | -v $(pwd)/data:/data \ | |
| 67 | - | -w /data \ | |
| 68 | - | data.forgejo.org/forgejo/runner:4.0.0 \ | |
| 69 | - | forgejo-runner generate-config > data/config.yaml | |
| 70 | - | ||
| 71 | - | Now open data/config.yaml and customize it. Below is a complete example | |
| 72 | - | based on a typical setup. Replace all placeholders (marked with YOUR_*) | |
| 73 | - | with your actual values. | |
| 1 | + | #!/bin/bash | |
| 2 | + | # ============================================================================= | |
| 3 | + | # FORGEJO RUNNER - FULL SYSTEM DEPLOYMENT WITH SYSTEMD | |
| 4 | + | # Supports both DIRECT and DOCKER modes | |
| 5 | + | # ============================================================================= | |
| 6 | + | ||
| 7 | + | # --- CONFIGURATION VARIABLES --- | |
| 8 | + | FORGEJO_URL="https://your-forgejo-domain.com" # CHANGE THIS | |
| 9 | + | REGISTRATION_TOKEN="your-registration-token" # CHANGE THIS | |
| 10 | + | RUNNER_NAME="selfhosted-runner-01" | |
| 11 | + | RUNNER_VERSION="latest" # Can be "latest" or specific like "v4.0.0" | |
| 12 | + | RUNNER_MODE="direct" # "direct" or "docker" | |
| 13 | + | ||
| 14 | + | # Direct mode variables | |
| 15 | + | RUNNER_USER="forgejo-runner" | |
| 16 | + | RUNNER_HOME="/opt/forgejo-runner" | |
| 17 | + | ||
| 18 | + | # Docker mode variables | |
| 19 | + | COMPOSE_DIR="$HOME/forgejo-runner" | |
| 20 | + | DIND_IMAGE="docker:dind" | |
| 21 | + | RUNNER_IMAGE="data.forgejo.org/forgejo/runner" | |
| 22 | + | # ============================================================================= | |
| 23 | + | ||
| 24 | + | set -e | |
| 25 | + | ||
| 26 | + | echo "============================================================" | |
| 27 | + | echo "FORGEJO RUNNER DEPLOYMENT" | |
| 28 | + | echo "============================================================" | |
| 29 | + | echo "Mode: $RUNNER_MODE" | |
| 30 | + | echo "Version: $RUNNER_VERSION" | |
| 31 | + | echo "Instance: $FORGEJO_URL" | |
| 32 | + | echo "" | |
| 33 | + | ||
| 34 | + | # --- STEP 1: Detect system architecture --- | |
| 35 | + | ARCH=$(uname -m) | |
| 36 | + | case $ARCH in | |
| 37 | + | x86_64) | |
| 38 | + | ARCH="amd64" | |
| 39 | + | ;; | |
| 40 | + | aarch64|arm64) | |
| 41 | + | ARCH="arm64" | |
| 42 | + | ;; | |
| 43 | + | armv7l|armhf) | |
| 44 | + | ARCH="armv7" | |
| 45 | + | ;; | |
| 46 | + | *) | |
| 47 | + | echo "Unsupported architecture: $ARCH" | |
| 48 | + | exit 1 | |
| 49 | + | ;; | |
| 50 | + | esac | |
| 51 | + | echo "Detected architecture: $ARCH" | |
| 52 | + | ||
| 53 | + | # --- STEP 2: Get actual version if "latest" --- | |
| 54 | + | if [ "$RUNNER_VERSION" = "latest" ]; then | |
| 55 | + | echo "Fetching latest version..." | |
| 56 | + | RUNNER_VERSION=$(curl -s https://code.forgejo.org/forgejo/runner/releases/latest | \ | |
| 57 | + | grep -o 'v[0-9]\+\.[0-9]\+\.[0-9]\+' | head -1) | |
| 58 | + | if [ -z "$RUNNER_VERSION" ]; then | |
| 59 | + | echo "Failed to fetch latest version, using fallback v4.0.0" | |
| 60 | + | RUNNER_VERSION="v4.0.0" | |
| 61 | + | fi | |
| 62 | + | echo "Latest version: $RUNNER_VERSION" | |
| 63 | + | fi | |
| 64 | + | ||
| 65 | + | # --- STEP 3: Check Docker --- | |
| 66 | + | echo "Checking Docker..." | |
| 67 | + | if ! command -v docker &> /dev/null; then | |
| 68 | + | echo "ERROR: Docker is not installed. Please install Docker first." | |
| 69 | + | exit 1 | |
| 70 | + | fi | |
| 71 | + | ||
| 72 | + | if ! systemctl is-active --quiet docker; then | |
| 73 | + | echo "ERROR: Docker service is not running." | |
| 74 | + | echo "Start it with: sudo systemctl start docker" | |
| 75 | + | exit 1 | |
| 76 | + | fi | |
| 77 | + | echo "Docker is running as systemd service" | |
| 78 | + | echo "" | |
| 79 | + | ||
| 80 | + | # ============================================================================= | |
| 81 | + | # DIRECT MODE INSTALLATION | |
| 82 | + | # ============================================================================= | |
| 83 | + | if [ "$RUNNER_MODE" = "direct" ]; then | |
| 84 | + | echo "=== DIRECT MODE INSTALLATION ===" | |
| 85 | + | echo "" | |
| 86 | + | ||
| 87 | + | # --- Create runner user --- | |
| 88 | + | echo "Creating runner user..." | |
| 89 | + | if ! id "$RUNNER_USER" &>/dev/null; then | |
| 90 | + | sudo useradd -r -m -d "$RUNNER_HOME" -s /bin/bash "$RUNNER_USER" | |
| 91 | + | sudo usermod -aG docker "$RUNNER_USER" | |
| 92 | + | else | |
| 93 | + | echo "User $RUNNER_USER already exists" | |
| 94 | + | sudo usermod -aG docker "$RUNNER_USER" | |
| 95 | + | fi | |
| 96 | + | ||
| 97 | + | # --- Download runner binary --- | |
| 98 | + | echo "Downloading Forgejo runner binary..." | |
| 99 | + | sudo -u "$RUNNER_USER" mkdir -p "$RUNNER_HOME/bin" | |
| 100 | + | ||
| 101 | + | VERSION_NUM=${RUNNER_VERSION#v} | |
| 102 | + | DOWNLOAD_URL="https://code.forgejo.org/forgejo/runner/releases/download/$RUNNER_VERSION/forgejo-runner-${VERSION_NUM}-linux-$ARCH" | |
| 103 | + | ||
| 104 | + | echo "Downloading from: $DOWNLOAD_URL" | |
| 105 | + | sudo -u "$RUNNER_USER" curl -L "$DOWNLOAD_URL" -o "$RUNNER_HOME/bin/forgejo-runner" | |
| 106 | + | sudo chmod +x "$RUNNER_HOME/bin/forgejo-runner" | |
| 107 | + | sudo chown -R "$RUNNER_USER":"$RUNNER_USER" "$RUNNER_HOME" | |
| 108 | + | ||
| 109 | + | # --- Register runner --- | |
| 110 | + | echo "Registering runner with Forgejo..." | |
| 111 | + | sudo -u "$RUNNER_USER" "$RUNNER_HOME/bin/forgejo-runner" register \ | |
| 112 | + | --token "$REGISTRATION_TOKEN" \ | |
| 113 | + | --name "$RUNNER_NAME" \ | |
| 114 | + | --instance "$FORGEJO_URL" \ | |
| 115 | + | --labels docker:docker://node:20-bookworm \ | |
| 116 | + | --no-interactive | |
| 117 | + | ||
| 118 | + | # --- Create config.yaml --- | |
| 119 | + | echo "Creating configuration..." | |
| 120 | + | sudo -u "$RUNNER_USER" tee "$RUNNER_HOME/config.yaml" > /dev/null << 'EOF' | |
| 121 | + | log: | |
| 122 | + | level: info | |
| 74 | 123 | ||
| 75 | - | ---------------------------------------------------------------- | |
| 76 | - | EXAMPLE config.yaml (customizable) | |
| 77 | - | ---------------------------------------------------------------- | |
| 124 | + | runner: | |
| 125 | + | file: .runner | |
| 126 | + | envs: | |
| 127 | + | DOCKER_HOST: unix:///var/run/docker.sock | |
| 128 | + | cache: | |
| 129 | + | enabled: false | |
| 130 | + | dir: /opt/forgejo-runner/cache | |
| 131 | + | fetch_interval: 30 | |
| 132 | + | fetch_timeout: 30s | |
| 78 | 133 | ||
| 79 | - | # --------------------------- REQUIRED --------------------------- | |
| 80 | - | # The URL of your Forgejo instance | |
| 81 | - | instance: http://YOUR_FORGEJO_URL | |
| 134 | + | docker: | |
| 135 | + | host: unix:///var/run/docker.sock | |
| 136 | + | privileged: false | |
| 137 | + | options: >- | |
| 138 | + | -v /var/run/docker.sock:/var/run/docker.sock | |
| 139 | + | --add-host=host.docker.internal:host-gateway | |
| 82 | 140 | ||
| 83 | - | # The runner token (can be the registration token or the token from .runner) | |
| 84 | - | token: "YOUR_RUNNER_TOKEN" | |
| 141 | + | container: | |
| 142 | + | network: host | |
| 143 | + | options: >- | |
| 144 | + | --add-host=host.docker.internal:host-gateway | |
| 145 | + | volumes: | |
| 146 | + | - /opt/forgejo-runner/cache:/cache | |
| 147 | + | - /var/run/docker.sock:/var/run/docker.sock | |
| 148 | + | EOF | |
| 149 | + | ||
| 150 | + | # --- Create systemd service --- | |
| 151 | + | echo "Creating systemd service..." | |
| 152 | + | sudo tee /etc/systemd/system/forgejo-runner.service > /dev/null << EOF | |
| 153 | + | [Unit] | |
| 154 | + | Description=Forgejo Actions Runner | |
| 155 | + | After=docker.service | |
| 156 | + | Requires=docker.service | |
| 157 | + | ||
| 158 | + | [Service] | |
| 159 | + | Type=simple | |
| 160 | + | User=$RUNNER_USER | |
| 161 | + | Group=$RUNNER_USER | |
| 162 | + | WorkingDirectory=$RUNNER_HOME | |
| 163 | + | ExecStart=$RUNNER_HOME/bin/forgejo-runner daemon --config $RUNNER_HOME/config.yaml | |
| 164 | + | Restart=always | |
| 165 | + | RestartSec=10 | |
| 166 | + | StartLimitBurst=3 | |
| 167 | + | StartLimitInterval=60s | |
| 168 | + | LimitNOFILE=65536 | |
| 169 | + | LimitNPROC=65536 | |
| 170 | + | ||
| 171 | + | [Install] | |
| 172 | + | WantedBy=multi-user.target | |
| 173 | + | EOF | |
| 174 | + | ||
| 175 | + | # --- Enable and start service --- | |
| 176 | + | echo "Starting service..." | |
| 177 | + | sudo systemctl daemon-reload | |
| 178 | + | sudo systemctl enable forgejo-runner.service | |
| 179 | + | sudo systemctl start forgejo-runner.service | |
| 180 | + | ||
| 181 | + | echo "" | |
| 182 | + | echo "=== DIRECT MODE DEPLOYMENT COMPLETE ===" | |
| 183 | + | echo "" | |
| 184 | + | echo "Service status:" | |
| 185 | + | sudo systemctl status forgejo-runner.service --no-pager | |
| 186 | + | echo "" | |
| 187 | + | echo "To view logs:" | |
| 188 | + | echo " sudo journalctl -u forgejo-runner -f" | |
| 189 | + | echo "" | |
| 190 | + | echo "Runner location: $RUNNER_HOME" | |
| 191 | + | ||
| 192 | + | # ============================================================================= | |
| 193 | + | # DOCKER MODE INSTALLATION | |
| 194 | + | # ============================================================================= | |
| 195 | + | elif [ "$RUNNER_MODE" = "docker" ]; then | |
| 196 | + | echo "=== DOCKER MODE INSTALLATION ===" | |
| 197 | + | echo "" | |
| 198 | + | ||
| 199 | + | # --- Create working directory --- | |
| 200 | + | echo "Creating working directory..." | |
| 201 | + | mkdir -p "$COMPOSE_DIR"/{data,cache} | |
| 202 | + | cd "$COMPOSE_DIR" | |
| 203 | + | ||
| 204 | + | # --- Register runner using Docker --- | |
| 205 | + | echo "Registering runner with Forgejo..." | |
| 206 | + | docker run -it --rm \ | |
| 207 | + | -v "$(pwd)/data:/data" \ | |
| 208 | + | -w /data \ | |
| 209 | + | --user root \ | |
| 210 | + | "${RUNNER_IMAGE}:${RUNNER_VERSION#v}" \ | |
| 211 | + | forgejo-runner register \ | |
| 212 | + | --no-interactive \ | |
| 213 | + | --token "$REGISTRATION_TOKEN" \ | |
| 214 | + | --name "$RUNNER_NAME" \ | |
| 215 | + | --instance "$FORGEJO_URL" \ | |
| 216 | + | --labels "$RUNNER_NAME:host" | |
| 217 | + | ||
| 218 | + | # --- Generate config.yaml --- | |
| 219 | + | echo "Generating configuration..." | |
| 220 | + | docker run --rm \ | |
| 221 | + | -v "$(pwd)/data:/data" \ | |
| 222 | + | -w /data \ | |
| 223 | + | "${RUNNER_IMAGE}:${RUNNER_VERSION#v}" \ | |
| 224 | + | forgejo-runner generate-config > data/config.yaml | |
| 225 | + | ||
| 226 | + | # --- Customize config.yaml --- | |
| 227 | + | echo "Customizing configuration..." | |
| 228 | + | cat > data/config.yaml << EOF | |
| 229 | + | instance: $FORGEJO_URL | |
| 230 | + | token: "$REGISTRATION_TOKEN" | |
| 85 | 231 | ||
| 86 | - | # --------------------------- LOGGING --------------------------- | |
| 87 | 232 | log: | |
| 88 | - | level: info # options: trace, debug, info, warn, error, fatal | |
| 233 | + | level: info | |
| 89 | 234 | ||
| 90 | - | # --------------------------- RUNNER SETTINGS --------------------------- | |
| 91 | 235 | runner: | |
| 92 | - | file: .runner # path to registration file (relative to /data) | |
| 93 | - | capacity: 1 # number of concurrent tasks | |
| 94 | - | timeout: 30m # max job duration (customize as needed) | |
| 95 | - | shutdown_timeout: 30m # graceful shutdown timeout | |
| 96 | - | insecure: true # set to true if using HTTP (skip TLS verification) | |
| 236 | + | file: .runner | |
| 237 | + | capacity: 1 | |
| 238 | + | timeout: 30m | |
| 239 | + | shutdown_timeout: 30m | |
| 240 | + | insecure: true | |
| 97 | 241 | fetch_timeout: 30s | |
| 98 | 242 | fetch_interval: 60s | |
| 99 | 243 | report_interval: 10s | |
| 100 | - | ||
| 101 | - | # Labels determine which jobs this runner picks up. | |
| 102 | - | # Format: "label:executor". Executor can be "host" (run on host) or "docker://image". | |
| 103 | - | # The label(s) must match the `runs-on` value in your workflows. | |
| 104 | 244 | labels: | |
| 105 | - | - "YOUR_LABEL:host" # e.g., "websites:host" | |
| 245 | + | - "$RUNNER_NAME:host" | |
| 106 | 246 | ||
| 107 | - | # --------------------------- CACHE --------------------------- | |
| 108 | 247 | cache: | |
| 109 | 248 | enabled: true | |
| 110 | - | dir: "" # leave empty to use default $HOME/.cache/actcache | |
| 249 | + | dir: "" | |
| 111 | 250 | ||
| 112 | - | # --------------------------- CONTAINER EXECUTOR OPTIONS ---------------- | |
| 113 | 251 | container: | |
| 114 | - | # Set privileged to true if your workflows need Docker-in-Docker. | |
| 115 | - | # If you use a separate docker-in-docker service, you can keep it false. | |
| 116 | 252 | privileged: false | |
| 117 | - | # Allow mounting any volume (useful for host directories) | |
| 118 | 253 | valid_volumes: | |
| 119 | 254 | - '**' | |
| 120 | - | docker_host: "" # auto-detect; you can override with environment variable DOCKER_HOST | |
| 255 | + | docker_host: "" | |
| 121 | 256 | force_pull: false | |
| 122 | 257 | ||
| 123 | - | # --------------------------- HOST EXECUTOR OPTIONS -------------------- | |
| 124 | 258 | host: | |
| 125 | - | workdir_parent: "" # parent directory for job workspaces (default ~/.cache/act/) | |
| 259 | + | workdir_parent: "" | |
| 260 | + | EOF | |
| 126 | 261 | ||
| 127 | - | --- | |
| 128 | - | ||
| 129 | - | Save the file. The most important fields to adjust are: | |
| 130 | - | - instance | |
| 131 | - | - token (or remove after registration) | |
| 132 | - | - runner.labels (must match your workflow's `runs-on`) | |
| 133 | - | - container.privileged (set to true if you run docker commands inside jobs) | |
| 134 | - | ||
| 135 | - | ---------------------------------------------------------------- | |
| 136 | - | STEP 4: CREATE DOCKER-COMPOSE.YML | |
| 137 | - | ---------------------------------------------------------------- | |
| 138 | - | ||
| 139 | - | Create a docker-compose.yml file in the same directory (~/forgejo-runner) | |
| 140 | - | with the following content. Replace YOUR_LABEL and any host paths. | |
| 141 | - | ||
| 142 | - | --- | |
| 262 | + | # --- Create docker-compose.yml --- | |
| 263 | + | echo "Creating docker-compose.yml..." | |
| 264 | + | cat > docker-compose.yml << EOF | |
| 143 | 265 | version: '3.8' | |
| 144 | 266 | ||
| 145 | 267 | services: | |
| 146 | 268 | docker-in-docker: | |
| 147 | - | image: docker:dind | |
| 148 | - | container_name: docker_dind | |
| 269 | + | image: $DIND_IMAGE | |
| 270 | + | container_name: ${RUNNER_NAME}_dind | |
| 149 | 271 | privileged: true | |
| 150 | 272 | command: ['dockerd', '-H', 'tcp://0.0.0.0:2375', '--tls=false'] | |
| 151 | 273 | restart: unless-stopped | |
| 274 | + | volumes: | |
| 275 | + | - dind-storage:/var/lib/docker | |
| 152 | 276 | ||
| 153 | 277 | runner: | |
| 154 | - | image: data.forgejo.org/forgejo/runner:4.0.0 | |
| 155 | - | container_name: runner | |
| 278 | + | image: ${RUNNER_IMAGE}:${RUNNER_VERSION#v} | |
| 279 | + | container_name: ${RUNNER_NAME} | |
| 156 | 280 | depends_on: | |
| 157 | 281 | docker-in-docker: | |
| 158 | 282 | condition: service_started | |
| 159 | 283 | environment: | |
| 160 | 284 | DOCKER_HOST: tcp://docker-in-docker:2375 | |
| 161 | - | user: 0:0 # run as root to avoid permission issues | |
| 285 | + | user: 0:0 | |
| 162 | 286 | volumes: | |
| 163 | - | - ./data:/data # config and .runner | |
| 164 | - | - ./cache:/cache # optional cache directory | |
| 165 | - | # Mount any host directories your workflows need to access: | |
| 166 | - | # - /host/path:/container/path | |
| 167 | - | # Example mounts (uncomment and adjust): | |
| 168 | - | # - /var/www/YOUR_PROJECT:/var/www/YOUR_PROJECT | |
| 169 | - | # - /home/user/shared:/shared | |
| 287 | + | - ./data:/data | |
| 288 | + | - ./cache:/cache | |
| 170 | 289 | restart: unless-stopped | |
| 171 | 290 | command: /bin/sh -c " | |
| 172 | 291 | apk update && apk add --no-cache nodejs npm && | |
| 173 | 292 | sleep 5 && | |
| 174 | 293 | forgejo-runner daemon --config /data/config.yaml | |
| 175 | 294 | " | |
| 176 | - | --- | |
| 177 | - | ||
| 178 | - | Note: The command installs Node.js and npm – required for actions like | |
| 179 | - | actions/checkout. If you prefer a custom image with Node.js pre-installed, | |
| 180 | - | you can build one, but this method works fine. | |
| 181 | - | ||
| 182 | - | ---------------------------------------------------------------- | |
| 183 | - | STEP 5: START THE RUNNER | |
| 184 | - | ---------------------------------------------------------------- | |
| 185 | - | ||
| 186 | - | Launch all services in detached mode: | |
| 187 | - | ||
| 188 | - | docker compose up -d | |
| 189 | - | ||
| 190 | - | Check the logs to confirm everything is running: | |
| 191 | - | ||
| 192 | - | docker compose logs -f runner | |
| 193 | - | ||
| 194 | - | Expected output: | |
| 195 | - | "runner: YOUR_RUNNER_NAME, with version: v4.0.0, with labels: [YOUR_LABEL], declared successfully" | |
| 196 | - | "[poller 0] launched" | |
| 197 | - | ||
| 198 | - | If you see errors, review the logs and verify your config. | |
| 199 | - | ||
| 200 | - | ---------------------------------------------------------------- | |
| 201 | - | STEP 6: TEST WITH A SAMPLE WORKFLOW | |
| 202 | - | ---------------------------------------------------------------- | |
| 203 | - | ||
| 204 | - | Create a test workflow in any repository on your Forgejo instance. | |
| 205 | - | Place the file at: .forgejo/workflows/test.yml | |
| 206 | - | ||
| 207 | - | --- | |
| 208 | - | on: [push] | |
| 209 | - | jobs: | |
| 210 | - | test: | |
| 211 | - | runs-on: YOUR_LABEL # must match the label you registered | |
| 212 | - | steps: | |
| 213 | - | - name: Hello | |
| 214 | - | run: echo "Runner is alive!" | |
| 215 | - | - name: Check Node.js | |
| 216 | - | run: node --version | |
| 217 | - | - name: Check Docker | |
| 218 | - | run: docker info | |
| 219 | - | --- | |
| 220 | - | ||
| 221 | - | Commit and push the file. The runner should pick up the job automatically. | |
| 222 | - | ||
| 223 | - | Watch the logs to see the job progress: | |
| 224 | - | ||
| 225 | - | docker compose logs -f runner | |
| 226 | - | ||
| 227 | - | ---------------------------------------------------------------- | |
| 228 | - | TROUBLESHOOTING COMMON ISSUES | |
| 229 | - | ---------------------------------------------------------------- | |
| 230 | - | ||
| 231 | - | | Symptom | Solution | | |
| 232 | - | |------------------------------------|--------------------------------------------------------------------------| | |
| 233 | - | | "permission denied" on .runner | Use --user root in registration or set user: 0:0 in docker-compose. | | |
| 234 | - | | "cannot find node" | Ensure Node.js is installed (the command above adds it). | | |
| 235 | - | | Runner stays idle | Check that the label in your workflow exactly matches the runner's label.| | |
| 236 | - | | "invalid token" | Generate a new token in Forgejo admin and re-register. | | |
| 237 | - | | Docker errors in jobs | Verify DOCKER_HOST=tcp://docker-in-docker:2375 is set. | | |
| 238 | - | ||
| 239 | - | ---------------------------------------------------------------- | |
| 240 | - | QUICK REFERENCE – PLACEHOLDERS USED IN THIS GUIDE | |
| 241 | - | ---------------------------------------------------------------- | |
| 242 | - | ||
| 243 | - | | Placeholder | Description | | |
| 244 | - | |----------------------------|---------------------------------------------------------------------------| | |
| 245 | - | | YOUR_FORGEJO_URL | The IP/hostname and port of your Forgejo instance (e.g., 192.168.2.76:3000) | | |
| 246 | - | | YOUR_REGISTRATION_TOKEN | The one-time token from Forgejo admin → Actions → Runners → Create Runner | | |
| 247 | - | | YOUR_RUNNER_NAME | A friendly name for the runner (appears in admin UI) | | |
| 248 | - | | YOUR_LABEL | Label used in workflows (e.g., "websites" or "ubuntu-latest") | | |
| 249 | - | | YOUR_RUNNER_TOKEN | The permanent token (usually the same as registration, or taken from .runner) | | |
| 250 | 295 | ||
| 251 | - | ---------------------------------------------------------------- | |
| 252 | - | END OF GUIDE | |
| 253 | - | ---------------------------------------------------------------- | |
| 296 | + | volumes: | |
| 297 | + | dind-storage: | |
| 298 | + | EOF | |
| 299 | + | ||
| 300 | + | # --- Create systemd service for docker-compose --- | |
| 301 | + | echo "Creating systemd service..." | |
| 302 | + | sudo tee /etc/systemd/system/forgejo-runner-docker.service > /dev/null << EOF | |
| 303 | + | [Unit] | |
| 304 | + | Description=Forgejo Runner (Docker Compose) | |
| 305 | + | After=docker.service | |
| 306 | + | Requires=docker.service | |
| 307 | + | ||
| 308 | + | [Service] | |
| 309 | + | Type=oneshot | |
| 310 | + | RemainAfterExit=yes | |
| 311 | + | WorkingDirectory=$COMPOSE_DIR | |
| 312 | + | ExecStart=/usr/bin/docker compose up -d | |
| 313 | + | ExecStop=/usr/bin/docker compose down | |
| 314 | + | ExecReload=/usr/bin/docker compose restart | |
| 315 | + | StandardOutput=journal | |
| 316 | + | User=$USER | |
| 317 | + | Group=$USER | |
| 318 | + | ||
| 319 | + | [Install] | |
| 320 | + | WantedBy=multi-user.target | |
| 321 | + | EOF | |
| 322 | + | ||
| 323 | + | # --- Enable and start service --- | |
| 324 | + | echo "Starting service..." | |
| 325 | + | sudo systemctl daemon-reload | |
| 326 | + | sudo systemctl enable forgejo-runner-docker.service | |
| 327 | + | sudo systemctl start forgejo-runner-docker.service | |
| 328 | + | ||
| 329 | + | echo "" | |
| 330 | + | echo "=== DOCKER MODE DEPLOYMENT COMPLETE ===" | |
| 331 | + | echo "" | |
| 332 | + | echo "Service status:" | |
| 333 | + | sudo systemctl status forgejo-runner-docker.service --no-pager | |
| 334 | + | echo "" | |
| 335 | + | echo "To view logs:" | |
| 336 | + | echo " docker compose -f $COMPOSE_DIR/docker-compose.yml logs -f runner" | |
| 337 | + | echo "" | |
| 338 | + | echo "To manage:" | |
| 339 | + | echo " cd $COMPOSE_DIR" | |
| 340 | + | echo " docker compose up -d # start" | |
| 341 | + | echo " docker compose down # stop" | |
| 342 | + | echo " docker compose restart # restart" | |
| 343 | + | echo "" | |
| 344 | + | echo "Runner location: $COMPOSE_DIR" | |
| 345 | + | ||
| 346 | + | # ============================================================================= | |
| 347 | + | # INVALID MODE | |
| 348 | + | # ============================================================================= | |
| 349 | + | else | |
| 350 | + | echo "ERROR: Invalid RUNNER_MODE. Use 'direct' or 'docker'" | |
| 351 | + | exit 1 | |
| 352 | + | fi | |
| 353 | + | ||
| 354 | + | echo "" | |
| 355 | + | echo "============================================================" | |
| 356 | + | echo "DEPLOYMENT COMPLETE" | |
| 357 | + | echo "============================================================" | |
| 358 | + | echo "" | |
| 359 | + | echo "Runner should now appear online in Forgejo Admin -> Actions -> Runners" | |
| 360 | + | echo "URL: $FORGEJO_URL/admin/actions/runners" | |
| 361 | + | echo "" | |
| 362 | + | echo "If runner shows offline, check:" | |
| 363 | + | echo " - Registration token is valid" | |
| 364 | + | echo " - Forgejo URL is accessible" | |
| 365 | + | echo " - Docker is running: sudo systemctl status docker" | |
| 366 | + | echo "============================================================" | |
entitybtw revised this gist 1 month ago. Go to revision
1 file changed, 0 insertions, 0 deletions
forgejo-actions-guide.txt renamed to forgejo-actions-guide-docker.txt
File renamed without changes
entitybtw revised this gist 3 months ago. Go to revision
No changes