Last active 1 month ago

forgejo runner install script

Revision a1cbea56f72e796ecacc9623fa85d8e938218a03

forgejo-actions-guide-docker.txt Raw
1#!/bin/bash
2# =============================================================================
3# FORGEJO RUNNER - FULL SYSTEM DEPLOYMENT WITH SYSTEMD
4# Supports both DIRECT and DOCKER modes
5# =============================================================================
6
7# --- CONFIGURATION VARIABLES ---
8FORGEJO_URL="http://192.168.2.76:3006" # CHANGE THIS
9REGISTRATION_TOKEN="your-registration-token" # CHANGE THIS
10RUNNER_NAME="selfhosted-runner-01"
11RUNNER_VERSION="latest" # "latest" or specific version
12RUNNER_MODE="direct" # "direct" or "docker"
13# =============================================================================
14
15set -e
16
17echo "============================================================"
18echo "FORGEJO RUNNER DEPLOYMENT"
19echo "============================================================"
20echo "Mode: $RUNNER_MODE"
21echo "Instance: $FORGEJO_URL"
22echo ""
23
24# --- STEP 1: Detect architecture ---
25echo "Detecting architecture..."
26export ARCH=$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/;s/armv7l/armv7/')
27echo "Architecture: $ARCH"
28
29# --- STEP 2: Get latest version ---
30if [ "$RUNNER_VERSION" = "latest" ]; then
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"
34else
35 RUNNER_VERSION=${RUNNER_VERSION#v}
36 echo "Version: $RUNNER_VERSION"
37fi
38echo ""
39
40# =============================================================================
41# DIRECT MODE
42# =============================================================================
43if [ "$RUNNER_MODE" = "direct" ]; then
44 echo "=== DIRECT MODE INSTALLATION ==="
45 echo "Installing runner directly on the system"
46 echo ""
47
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
55
56 # --- Move to /usr/local/bin ---
57 echo "Moving to /usr/local/bin..."
58 sudo mv forgejo-runner /usr/local/bin/
59
60 # --- Register runner ---
61 echo "Registering runner with Forgejo..."
62 forgejo-runner register \
63 --token "$REGISTRATION_TOKEN" \
64 --name "$RUNNER_NAME" \
65 --instance "$FORGEJO_URL" \
66 --labels "$RUNNER_NAME:host" \
67 --no-interactive
68
69 # --- Create config.yaml ---
70 echo "Creating configuration..."
71 cat > config.yaml << EOF
72instance: $FORGEJO_URL
73token: "$REGISTRATION_TOKEN"
74
75log:
76 level: info
77
78runner:
79 file: .runner
80 capacity: 1
81 timeout: 30m
82 shutdown_timeout: 30m
83 insecure: true
84 fetch_timeout: 30s
85 fetch_interval: 60s
86 report_interval: 10s
87 labels:
88 - "$RUNNER_NAME:host"
89
90cache:
91 enabled: true
92 dir: ""
93
94host:
95 workdir_parent: ""
96EOF
97
98 # --- Create systemd service ---
99 echo "Creating systemd service..."
100 sudo tee /etc/systemd/system/forgejo-runner.service > /dev/null << EOF
101[Unit]
102Description=Forgejo Actions Runner
103After=network.target
104
105[Service]
106Type=simple
107User=$USER
108Group=$USER
109WorkingDirectory=$PWD
110ExecStart=/usr/local/bin/forgejo-runner daemon --config $PWD/config.yaml
111Restart=always
112RestartSec=10
113StartLimitBurst=3
114StartLimitInterval=60s
115LimitNOFILE=65536
116LimitNPROC=65536
117
118[Install]
119WantedBy=multi-user.target
120EOF
121
122 # --- Enable and start service ---
123 echo "Starting service..."
124 sudo systemctl daemon-reload
125 sudo systemctl enable forgejo-runner.service
126 sudo systemctl start forgejo-runner.service
127
128 echo ""
129 echo "=== DIRECT MODE DEPLOYMENT COMPLETE ==="
130 echo ""
131 echo "Service status:"
132 sudo systemctl status forgejo-runner.service --no-pager
133 echo ""
134 echo "To view logs:"
135 echo " sudo journalctl -u forgejo-runner -f"
136 echo ""
137 echo "Runner location: /usr/local/bin/forgejo-runner"
138 echo "Config location: $PWD/config.yaml"
139
140# =============================================================================
141# DOCKER MODE
142# =============================================================================
143elif [ "$RUNNER_MODE" = "docker" ]; then
144 echo "=== DOCKER MODE INSTALLATION ==="
145 echo "Installing runner with Docker Compose"
146 echo ""
147
148 # --- Check Docker ---
149 echo "Checking Docker..."
150 if ! command -v docker &> /dev/null; then
151 echo "Docker not found. Installing Docker..."
152 curl -fsSL https://get.docker.com -o get-docker.sh
153 sudo sh get-docker.sh
154 sudo usermod -aG docker $USER
155 sudo systemctl enable docker --now
156 rm get-docker.sh
157 echo "Docker installed successfully"
158 else
159 echo "Docker is already installed"
160 fi
161
162 if ! systemctl is-active --quiet docker; then
163 echo "Starting Docker service..."
164 sudo systemctl start docker
165 fi
166 echo "Docker is running"
167
168 # --- Check Docker Compose ---
169 echo "Checking Docker Compose..."
170 if ! command -v docker compose &> /dev/null; then
171 echo "Docker Compose not found. Installing..."
172 if command -v apt-get &> /dev/null; then
173 sudo apt-get update && sudo apt-get install -y docker-compose-plugin
174 elif command -v yum &> /dev/null; then
175 sudo yum install -y docker-compose-plugin
176 else
177 echo "ERROR: Could not install docker-compose-plugin"
178 echo "Please install Docker Compose manually"
179 exit 1
180 fi
181 else
182 echo "Docker Compose is already installed"
183 fi
184 echo ""
185
186 # --- Create working directory ---
187 echo "Creating working directory..."
188 mkdir -p ~/forgejo-runner/{data,cache}
189 cd ~/forgejo-runner
190
191 # --- Register runner using Docker ---
192 echo "Registering runner with Forgejo..."
193 docker run -it --rm \
194 -v $(pwd)/data:/data \
195 -w /data \
196 --user root \
197 data.forgejo.org/forgejo/runner:${RUNNER_VERSION} \
198 forgejo-runner register \
199 --no-interactive \
200 --token "$REGISTRATION_TOKEN" \
201 --name "$RUNNER_NAME" \
202 --instance "$FORGEJO_URL" \
203 --labels "$RUNNER_NAME:host"
204
205 # --- Generate config.yaml ---
206 echo "Creating configuration..."
207 cat > data/config.yaml << EOF
208instance: $FORGEJO_URL
209token: "$REGISTRATION_TOKEN"
210
211log:
212 level: info
213
214runner:
215 file: .runner
216 capacity: 1
217 timeout: 30m
218 shutdown_timeout: 30m
219 insecure: true
220 fetch_timeout: 30s
221 fetch_interval: 60s
222 report_interval: 10s
223 labels:
224 - "$RUNNER_NAME:host"
225
226cache:
227 enabled: true
228 dir: ""
229
230container:
231 privileged: false
232 valid_volumes:
233 - '**'
234 docker_host: ""
235 force_pull: false
236
237host:
238 workdir_parent: ""
239EOF
240
241 # --- Create docker-compose.yml ---
242 echo "Creating docker-compose.yml..."
243 cat > docker-compose.yml << EOF
244version: '3.8'
245
246services:
247 docker-in-docker:
248 image: docker:dind
249 container_name: ${RUNNER_NAME}_dind
250 privileged: true
251 command: ['dockerd', '-H', 'tcp://0.0.0.0:2375', '--tls=false']
252 restart: unless-stopped
253 volumes:
254 - dind-storage:/var/lib/docker
255
256 runner:
257 image: data.forgejo.org/forgejo/runner:${RUNNER_VERSION}
258 container_name: ${RUNNER_NAME}
259 depends_on:
260 docker-in-docker:
261 condition: service_started
262 environment:
263 DOCKER_HOST: tcp://docker-in-docker:2375
264 user: 0:0
265 volumes:
266 - ./data:/data
267 - ./cache:/cache
268 restart: unless-stopped
269 command: /bin/sh -c "
270 apk update && apk add --no-cache nodejs npm &&
271 sleep 5 &&
272 forgejo-runner daemon --config /data/config.yaml
273 "
274
275volumes:
276 dind-storage:
277EOF
278
279 # --- Create systemd service ---
280 echo "Creating systemd service..."
281 sudo tee /etc/systemd/system/forgejo-runner-docker.service > /dev/null << EOF
282[Unit]
283Description=Forgejo Runner (Docker Compose)
284After=docker.service
285Requires=docker.service
286
287[Service]
288Type=oneshot
289RemainAfterExit=yes
290WorkingDirectory=$HOME/forgejo-runner
291ExecStart=/usr/bin/docker compose up -d
292ExecStop=/usr/bin/docker compose down
293ExecReload=/usr/bin/docker compose restart
294StandardOutput=journal
295User=$USER
296Group=$USER
297
298[Install]
299WantedBy=multi-user.target
300EOF
301
302 # --- Enable and start service ---
303 echo "Starting service..."
304 sudo systemctl daemon-reload
305 sudo systemctl enable forgejo-runner-docker.service
306 sudo systemctl start forgejo-runner-docker.service
307
308 echo ""
309 echo "=== DOCKER MODE DEPLOYMENT COMPLETE ==="
310 echo ""
311 echo "Service status:"
312 sudo systemctl status forgejo-runner-docker.service --no-pager
313 echo ""
314 echo "To view logs:"
315 echo " docker compose -f $HOME/forgejo-runner/docker-compose.yml logs -f runner"
316 echo ""
317 echo "To manage:"
318 echo " cd ~/forgejo-runner"
319 echo " docker compose up -d # start"
320 echo " docker compose down # stop"
321 echo " docker compose restart # restart"
322 echo ""
323 echo "Runner location: ~/forgejo-runner"
324
325# =============================================================================
326# INVALID MODE
327# =============================================================================
328else
329 echo "ERROR: Invalid RUNNER_MODE. Use 'direct' or 'docker'"
330 exit 1
331fi
332
333echo ""
334echo "============================================================"
335echo "DEPLOYMENT COMPLETE"
336echo "============================================================"
337echo ""
338echo "Runner should now appear online in Forgejo Admin -> Actions -> Runners"
339echo "URL: $FORGEJO_URL/admin/actions/runners"
340echo ""
341if [ "$RUNNER_MODE" = "direct" ]; then
342 echo "To check runner logs: sudo journalctl -u forgejo-runner -f"
343else
344 echo "To check runner logs: docker compose -f $HOME/forgejo-runner/docker-compose.yml logs -f runner"
345fi
346echo "============================================================"