docs: Add Gitea act_runner setup guide for asgard build server
Architecture clarification: - Gitea + SeaweedFS run on PUBLIC docker stack - Act runner runs on ASGARD (Ryzen 9 build server) - Runner connects remotely to git.corrosionmgmt.com New documentation: - ASGARD-RUNNER.md: Complete setup guide for registering and running act_runner as systemd service on asgard - Includes example workflows for companion agent builds - Troubleshooting and security notes Runner capabilities: - Docker access for containerized builds - Native Go/Rust toolchains (already installed) - 16C/32T, 64GB DDR5 for fast builds Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
284
infra/ASGARD-RUNNER.md
Normal file
284
infra/ASGARD-RUNNER.md
Normal file
@@ -0,0 +1,284 @@
|
|||||||
|
# Gitea Act Runner Setup (Asgard Build Server)
|
||||||
|
|
||||||
|
**Purpose**: Run CI/CD builds on asgard's powerful hardware (Ryzen 9 7945HX, 64GB DDR5) while Gitea runs on the public docker stack.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
```
|
||||||
|
Public Stack: Asgard (Build Server):
|
||||||
|
┌──────────────────┐ ┌──────────────────────┐
|
||||||
|
│ Gitea Container │◄───────────│ Act Runner (daemon) │
|
||||||
|
│ git.corrosion... │ registers │ • Docker socket │
|
||||||
|
│ Port: 8090 │ │ • Go/Rust toolchains │
|
||||||
|
└──────────────────┘ │ • 16C/32T, 64GB RAM │
|
||||||
|
└──────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Prerequisites on Asgard
|
||||||
|
|
||||||
|
1. **Docker installed**
|
||||||
|
```bash
|
||||||
|
docker --version
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Go installed** (already present per Commander)
|
||||||
|
```bash
|
||||||
|
go version
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Rust installed** (already present per Commander)
|
||||||
|
```bash
|
||||||
|
rustc --version
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Installation Steps
|
||||||
|
|
||||||
|
### Step 1: Download act_runner Binary
|
||||||
|
|
||||||
|
On **asgard**, download the latest act_runner:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Create directory for runner
|
||||||
|
mkdir -p ~/gitea-runner
|
||||||
|
cd ~/gitea-runner
|
||||||
|
|
||||||
|
# Download act_runner (check for latest version at gitea.com/gitea/act_runner)
|
||||||
|
wget https://dl.gitea.com/act_runner/0.2.6/act_runner-0.2.6-linux-amd64 -O act_runner
|
||||||
|
chmod +x act_runner
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 2: Generate Registration Token
|
||||||
|
|
||||||
|
On the **public docker stack** (where Gitea runs):
|
||||||
|
|
||||||
|
1. Navigate to `https://git.corrosionmgmt.com`
|
||||||
|
2. Login as admin
|
||||||
|
3. Go to **Site Administration** → **Actions** → **Runners**
|
||||||
|
4. Click **"Create new Runner"**
|
||||||
|
5. Copy the **registration token** (looks like: `A1B2C3D4E5F6G7H8...`)
|
||||||
|
|
||||||
|
### Step 3: Register Runner on Asgard
|
||||||
|
|
||||||
|
Back on **asgard**, register the runner with your Gitea instance:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ~/gitea-runner
|
||||||
|
|
||||||
|
# Register runner (replace TOKEN with the token from Gitea)
|
||||||
|
./act_runner register \
|
||||||
|
--instance https://git.corrosionmgmt.com \
|
||||||
|
--token YOUR_REGISTRATION_TOKEN_HERE \
|
||||||
|
--name asgard-runner \
|
||||||
|
--labels ubuntu-latest:docker://node:20-bullseye,golang:docker://golang:1.22,rust:docker://rust:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
**Important labels:**
|
||||||
|
- `ubuntu-latest` - Generic Linux builds (Node.js)
|
||||||
|
- `golang` - Go companion agent builds
|
||||||
|
- `rust` - Rust backend builds (if needed)
|
||||||
|
|
||||||
|
This creates a `.runner` config file with credentials.
|
||||||
|
|
||||||
|
### Step 4: Start Runner as Daemon
|
||||||
|
|
||||||
|
Create systemd service for persistent runner:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo nano /etc/systemd/system/gitea-runner.service
|
||||||
|
```
|
||||||
|
|
||||||
|
**Service file contents:**
|
||||||
|
```ini
|
||||||
|
[Unit]
|
||||||
|
Description=Gitea Actions Runner (Asgard)
|
||||||
|
After=docker.service
|
||||||
|
Requires=docker.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=YOUR_USERNAME
|
||||||
|
WorkingDirectory=/home/YOUR_USERNAME/gitea-runner
|
||||||
|
ExecStart=/home/YOUR_USERNAME/gitea-runner/act_runner daemon
|
||||||
|
Restart=always
|
||||||
|
RestartSec=10
|
||||||
|
|
||||||
|
# Security hardening
|
||||||
|
NoNewPrivileges=true
|
||||||
|
PrivateTmp=true
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
```
|
||||||
|
|
||||||
|
**Replace `YOUR_USERNAME`** with your actual username on asgard.
|
||||||
|
|
||||||
|
### Step 5: Enable and Start Service
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Reload systemd
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
|
||||||
|
# Enable runner to start on boot
|
||||||
|
sudo systemctl enable gitea-runner
|
||||||
|
|
||||||
|
# Start the runner
|
||||||
|
sudo systemctl start gitea-runner
|
||||||
|
|
||||||
|
# Check status
|
||||||
|
sudo systemctl status gitea-runner
|
||||||
|
```
|
||||||
|
|
||||||
|
**Expected output:**
|
||||||
|
```
|
||||||
|
● gitea-runner.service - Gitea Actions Runner (Asgard)
|
||||||
|
Loaded: loaded (/etc/systemd/system/gitea-runner.service; enabled)
|
||||||
|
Active: active (running) since ...
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 6: Verify Registration
|
||||||
|
|
||||||
|
Back in Gitea web UI:
|
||||||
|
1. Go to **Site Administration** → **Actions** → **Runners**
|
||||||
|
2. You should see **"asgard-runner"** with status: **Online**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Testing the Runner
|
||||||
|
|
||||||
|
### Create Test Workflow
|
||||||
|
|
||||||
|
In any Gitea repo, create `.gitea/workflows/test.yml`:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
name: Test Asgard Runner
|
||||||
|
on: [push]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Check runner
|
||||||
|
run: |
|
||||||
|
echo "Running on: $(hostname)"
|
||||||
|
echo "CPU cores: $(nproc)"
|
||||||
|
echo "Memory: $(free -h | grep Mem | awk '{print $2}')"
|
||||||
|
echo "Go version: $(go version)"
|
||||||
|
echo "Rust version: $(rustc --version)"
|
||||||
|
```
|
||||||
|
|
||||||
|
Push to trigger the workflow. Check logs in Gitea Actions tab.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Companion Agent Build Workflow (Example)
|
||||||
|
|
||||||
|
Create `.gitea/workflows/build-companion.yml` in the companion-agent repo:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
name: Build Companion Agent
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- 'v*'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: golang
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Build Linux AMD64
|
||||||
|
run: |
|
||||||
|
cd companion-agent
|
||||||
|
GOOS=linux GOARCH=amd64 go build -o companion-linux-amd64 ./cmd/agent
|
||||||
|
|
||||||
|
- name: Build Windows AMD64
|
||||||
|
run: |
|
||||||
|
cd companion-agent
|
||||||
|
GOOS=windows GOARCH=amd64 go build -o companion-windows-amd64.exe ./cmd/agent
|
||||||
|
|
||||||
|
- name: Create Release
|
||||||
|
uses: actions/gitea-release-action@v1
|
||||||
|
with:
|
||||||
|
files: |
|
||||||
|
companion-agent/companion-linux-amd64
|
||||||
|
companion-agent/companion-windows-amd64.exe
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Monitoring & Logs
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# View runner logs
|
||||||
|
sudo journalctl -u gitea-runner -f
|
||||||
|
|
||||||
|
# Check runner status
|
||||||
|
sudo systemctl status gitea-runner
|
||||||
|
|
||||||
|
# Restart runner
|
||||||
|
sudo systemctl restart gitea-runner
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Runner shows offline in Gitea
|
||||||
|
|
||||||
|
1. Check service status: `sudo systemctl status gitea-runner`
|
||||||
|
2. Check logs: `sudo journalctl -u gitea-runner -n 50`
|
||||||
|
3. Verify network connectivity: `curl https://git.corrosionmgmt.com`
|
||||||
|
4. Re-register if needed (delete `.runner` file and repeat Step 3)
|
||||||
|
|
||||||
|
### Docker permission errors
|
||||||
|
|
||||||
|
If runner can't access Docker socket:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Add your user to docker group
|
||||||
|
sudo usermod -aG docker YOUR_USERNAME
|
||||||
|
|
||||||
|
# Logout and login again for group changes to take effect
|
||||||
|
```
|
||||||
|
|
||||||
|
### Build fails with "command not found"
|
||||||
|
|
||||||
|
Ensure the label matches available Docker images:
|
||||||
|
- `ubuntu-latest:docker://node:20-bullseye` - Has Node, but not Go/Rust
|
||||||
|
- `golang:docker://golang:1.22` - Has Go
|
||||||
|
- `rust:docker://rust:latest` - Has Rust
|
||||||
|
|
||||||
|
Or install tools on asgard host and use `runs-on: self-hosted`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Security Notes
|
||||||
|
|
||||||
|
- Runner has access to Docker socket (can run privileged containers)
|
||||||
|
- Only trusted repos should trigger builds on this runner
|
||||||
|
- Consider using webhook secrets for production deployments
|
||||||
|
- Runner credentials stored in `~/.runner` - keep secure
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Upgrade Act Runner
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ~/gitea-runner
|
||||||
|
./act_runner --version # Check current version
|
||||||
|
|
||||||
|
# Download new version
|
||||||
|
wget https://dl.gitea.com/act_runner/NEW_VERSION/act_runner-NEW_VERSION-linux-amd64 -O act_runner.new
|
||||||
|
chmod +x act_runner.new
|
||||||
|
mv act_runner.new act_runner
|
||||||
|
|
||||||
|
# Restart service
|
||||||
|
sudo systemctl restart gitea-runner
|
||||||
|
```
|
||||||
@@ -21,7 +21,15 @@
|
|||||||
|
|
||||||
## Deployment
|
## Deployment
|
||||||
|
|
||||||
### First-time setup:
|
### Architecture Note
|
||||||
|
|
||||||
|
**This stack runs on the PUBLIC docker host** (where Nginx Proxy Manager is).
|
||||||
|
|
||||||
|
The **Gitea act_runner** runs separately on **asgard** (the build server) and connects to the public Gitea instance remotely.
|
||||||
|
|
||||||
|
See `ASGARD-RUNNER.md` for act_runner setup instructions.
|
||||||
|
|
||||||
|
### First-time setup (on public docker host):
|
||||||
```bash
|
```bash
|
||||||
cd infra
|
cd infra
|
||||||
docker compose up -d
|
docker compose up -d
|
||||||
|
|||||||
Reference in New Issue
Block a user