Files
chemenu/kb/entities/tools/Act Runner.md
T
torben 18ae28f918
CI / verify (push) Failing after 32s
Release / release (push) Successful in 38s
Chemenu 2.1.0 - deterministischer Wissenskompiler
Chemenu kompiliert Rohnotizen zu einem verlinkten, quellengebundenen Wiki:
raw/ -> types/ + tools/ -> kb/ -> reports/. Was mechanisch ist, macht
tools/wikitool; was Urteil braucht, macht ein Agent unter Contracts, deren
Grenzen in Code durchgesetzt sind statt im Prompt.

Dieser Commit ist der Startpunkt der oeffentlichen Historie. Die vorherige
Entwicklung fand in einer privaten Instanz statt und ist nicht Teil dieses
Repositorys; ihre Erzaehlung steht vollstaendig in CHANGES.md, das mit 44
Eintraegen von 0.1.0 bis 2.1.0 erhalten geblieben ist.

Der mitgelieferte Korpus ist ein Testbett und eine Demo: 170 Seiten ueber den
Stack selbst - Gates, Lint, Versionierung, Suche, das Wiki-Muster. Er
dokumentiert das Werkzeug mit den eigenen Mitteln des Werkzeugs.

Lizenz: AGPL-3.0 fuer den Stack (tools/, types/), CC-BY-4.0 fuer die Inhalte.
Die Grenze zwischen beiden ist der Dateiplan, den dist export berechnet -
siehe NOTICE.
2026-09-01 16:26:14 +02:00

194 lines
7.7 KiB
Markdown

---
type: types/entity.md
entity_type: tool
tags: [ci-cd, gitea, docker, runner]
created: 2026-07-25
modified: 2026-09-01
related: [Gitea, Gitea Actions, Docker]
sources: [Source - Conversation - Versioning CI-CD and Content Migration Session 2026-08-30]
confidence: 0.95
confidence_base: 0.95
provenance: sourced
summary: Offizieller Gitea-Actions-Runner, der CI/CD-Workflows in Docker-Containern auf einer dedizierten Runner-VM ausführt; JavaScript-Actions brauchen node im Job-Container
---
# Act Runner
**Typ:** Tool (Gitea Actions Runner)
## Beschreibung
`act_runner` ist die offizielle Runner-Implementierung für Gitea Actions. Sie führt CI/CD-Workflows auf der VM `ci-runner.example.net` aus und läuft als Docker-Container im Host-Network-Modus, damit die Verbindung zu den Job-Containern und zum Actions Cache Server funktioniert.
## Kerndaten
- **Zweck:** Ausführen von Gitea-Actions-Workflows
- **Status:** Aktiv (Stand 2026-07-12)
- **Container-Image:** `gitea/act_runner:latest`
- **Containername:** `act_runner`
- **Restart Policy:** `unless-stopped`
- **Network Mode:** `host` (entscheidend für die Cache-Anbindung)
## Architektur
### Container-Konfiguration
```yaml
services:
act_runner:
image: gitea/act_runner:latest
container_name: act_runner
restart: unless-stopped
network_mode: host
environment:
- CONFIG_FILE=/config.yaml
- GITEA_INSTANCE_URL=http://192.0.2.10:3000
- GITEA_RUNNER_REGISTRATION_TOKEN=${GITEA_RUNNER_REGISTRATION_TOKEN}
- GITEA_RUNNER_NAME=ci-vm-runner
volumes:
- ./data:/data
- ./config.yaml:/config.yaml:ro
- /var/run/docker.sock:/var/run/docker.sock
```
### Wesentliche Konfigurationseinstellungen
**config.yaml:**
```yaml
cache:
enabled: true
host: "192.0.2.10" # static IP of ci-runner.example.net
port: 8088
container:
network: "" # empty = each job gets isolated bridge network
```
### Routing-Labels
Eigene semantische Labels anstelle der Standard-Ubuntu-Labels:
- `linux-docker`
- `container-builder`
- `k3s-deploy`
Damit lassen sich Workflows gezielt an Runner mit bestimmten Capabilities leiten.
## Beziehungen
- **Teil von:** Ökosystem [[Gitea Actions]]
- **Verbindet sich mit:** [[Gitea]]-Instanz unter `docker-host.example.net`
- **Verwendet:** [[Docker]] für die Container-Ausführung
- **Verwaltet:** Job-Container mit isolierten Bridge-Netzen
## Netzwerk
### Host-Network-Modus
Die entscheidende Einstellung, die das Problem mit dem Actions Cache Server gelöst hat:
- Der Runner-Container nutzt `network_mode: host`
- Dadurch erreichen Job-Container den Cache-Server unter der konfigurierten statischen IP
- Die Cache-URL wird automatisch als Umgebungsvariable `ACTIONS_CACHE_URL` gesetzt
- **Wichtig:** `network_mode: host` und ein `networks:`-Block schließen sich in Docker Compose gegenseitig aus
### Isolation der Job-Container
Obwohl der Runner im Host-Netz läuft:
- Jeder CI-Job läuft in einem eigenen, temporären Bridge-Netz
- `container.network: ""` in der `config.yaml` stellt das sicher
- Die Job-Isolation bleibt erhalten
- Nur der Runner-Prozess selbst hat Zugriff auf das Host-Netz
## Verwaltung von Secrets
### 1Password-Anbindung
- Das Service-Account-Token wird über eine systemd-`EnvironmentFile` eingespielt (`/etc/act_runner/secrets.env`)
- Es ist das einzige Secret, das als Umgebungsvariable vorliegt
- In Gitea heißt das ein "Actions Secret"
- Workflows holen weitere Secrets zur Laufzeit über `1password/load-secrets-action@v2`
### Gitea-Token
- Workflows können `${{ gitea.token }}` zur Authentifizierung verwenden
- Genutzt für Image-Pushes in die Gitea Container Registry
- Erfordert `permissions: packages: write` im Workflow
- Reicht auch für **Releases, Tags und Asset-Uploads**; ein Actions-Secret mit
`write:repository` ist dafür nicht nötig. Belegt dadurch, dass ein Release-Workflow beim
Versionssprung von selbst feuerte und Tarball samt `.sha256` ablegte[^s-conversation-versioning-ci-cd-and-content-migration-session-2026-08-30]
## Betrieb
### Neustartverhalten
- Nach Netzwerkänderungen ist ein vollständiges `docker compose down && docker compose up -d` nötig
- Ein einfaches `docker restart` übernimmt Änderungen an `network_mode` **nicht** zuverlässig
### Persistenz
- Workflow-Daten liegen im Volume `./data`
- Konfiguration in `./config.yaml` (nur lesend eingebunden)
- Docker-Socket eingebunden für den Zugriff auf BuildKit
## JavaScript-Actions brauchen `node` im Job-Container
Nennt ein Job sein eigenes `container:`-Image, führt act_runner JavaScript-Actions - darunter
`actions/checkout` - mit `node` **innerhalb dieses Job-Containers** aus. Ein schlankes Image
bringt keins mit, und der Lauf endet vor dem ersten eigenen
Schritt[^s-conversation-versioning-ci-cd-and-content-migration-session-2026-08-30]:
```
OCI runtime exec failed: exec: "node": executable file not found in $PATH
❌ Failure - Main actions/checkout@v4
exitcode '127': command not found
```
Der erste Schritt eines solchen Jobs muss deshalb `nodejs` nachinstallieren, **vor** dem
Checkout[^s-conversation-versioning-ci-cd-and-content-migration-session-2026-08-30]:
```yaml
- name: Install CI Dependencies
run: apt-get install -y --no-install-recommends git nodejs curl unzip ca-certificates build-essential
- name: Checkout Code
uses: actions/checkout@v7
```
Bekannt funktionierende Kombination auf dieser Installation, nicht neu
herzuleiten[^s-conversation-versioning-ci-cd-and-content-migration-session-2026-08-30]:
- `actions/checkout@v7` und `actions/upload-artifact@v3` (v4 ist auf dieser Instanz eingeschränkt)
- `debian:trixie-slim` als Job-Image; es trägt python3 3.13
- Die Labels `linux-docker` und `container-builder` nehmen beide einen Job an, der sein eigenes
Image benennt
Ein gepinntes Image war ursprünglich als Vorsichtsmaßnahme gegen die undokumentierte Zuordnung
von `linux-docker` zu einem Image gewählt worden. Die Vorsichtsmaßnahme verursachte den
Fehlschlag: Das Label routete von Anfang an korrekt und startete den Container, nur fehlte im
gewählten Image `node`[^s-conversation-versioning-ci-cd-and-content-migration-session-2026-08-30].
## Läufe sind von außen nicht beobachtbar
Bei einem privaten Repository antwortet [[Gitea]] einem anonymen Aufrufer mit einem identischen
`404` für ein unsichtbares und für ein nicht existierendes
Repository[^s-conversation-versioning-ci-cd-and-content-migration-session-2026-08-30]. Aus einem
`curl` gegen die API lässt sich damit kein Rückschluss auf den Lauf-Zustand ziehen. Läufe und
ihre Logs werden über den [[Gitea MCP Server]] gelesen.
## Erprobte CI/CD-Szenarien
Der Runner deckt drei Szenarien nachweislich ab:
1. **Arch-Paketbau** - Builder-Benutzer ohne Root-Rechte, `actions/upload-artifact@v3`
2. **Container-Builds** - Debian-basierte Images, entferntes BuildKit
3. **K3s-Deployments** - Kubeconfig aus 1Password, kubectl-Operationen
## Historie
- [2026-07-12] - Network Mode auf `host` umgestellt, um die Anbindung an den Actions Cache Server zu reparieren (ETIMEDOUT auf 172.18.0.2:39329)
- [2026-07-25] - Entity-Seite aus dem Quellen-Ingest erstellt
- [2026-08-30] - Ursache der bis dahin unerklärten Workflow-Fehlschläge geklärt: fehlendes
`node` im gepinnten Job-Image, nicht ein falsches Runner-Label. `nodejs` vor dem Checkout und
`actions/checkout@v7` als Abhilfe festgehalten[^s-conversation-versioning-ci-cd-and-content-migration-session-2026-08-30]
## Siehe auch
- Host-System
- [[Gitea]] - Git-Dienst
- [[Gitea Actions]] - CI/CD-Plattform
- [[Docker]] - Container-Plattform
- Secrets-Verwaltung
- Behebung des Actions-Cache-Server-Problems
## Fußnoten
[^s-conversation-versioning-ci-cd-and-content-migration-session-2026-08-30]: [[Source - Conversation - Versioning CI-CD and Content Migration Session 2026-08-30]]