Last active 1 month ago

forgejo runner install script

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

Newer Older