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.
7.7 KiB
type, entity_type, tags, created, modified, related, sources, confidence, confidence_base, provenance, summary
| type | entity_type | tags | created | modified | related | sources | confidence | confidence_base | provenance | summary | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| types/entity.md | tool |
|
2026-07-25 | 2026-09-01 |
|
|
0.95 | 0.95 | sourced | 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
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:
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-dockercontainer-builderk3s-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_URLgesetzt - Wichtig:
network_mode: hostund einnetworks:-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 derconfig.yamlstellt 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-
EnvironmentFileeingespielt (/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: writeim Workflow - Reicht auch für Releases, Tags und Asset-Uploads; ein Actions-Secret mit
write:repositoryist dafür nicht nötig. Belegt dadurch, dass ein Release-Workflow beim Versionssprung von selbst feuerte und Tarball samt.sha256ablegte1
Betrieb
Neustartverhalten
- Nach Netzwerkänderungen ist ein vollständiges
docker compose down && docker compose up -dnötig - Ein einfaches
docker restartübernimmt Änderungen annetwork_modenicht 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
Schritt1 :
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
Checkout1 :
- 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 herzuleiten1 :
actions/checkout@v7undactions/upload-artifact@v3(v4 ist auf dieser Instanz eingeschränkt)debian:trixie-slimals Job-Image; es trägt python3 3.13- Die Labels
linux-dockerundcontainer-buildernehmen 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 node1 .
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
Repository1 . 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:
- Arch-Paketbau - Builder-Benutzer ohne Root-Rechte,
actions/upload-artifact@v3 - Container-Builds - Debian-basierte Images, entferntes BuildKit
- K3s-Deployments - Kubeconfig aus 1Password, kubectl-Operationen
Historie
- [2026-07-12] - Network Mode auf
hostumgestellt, 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
nodeim gepinnten Job-Image, nicht ein falsches Runner-Label.nodejsvor dem Checkout undactions/checkout@v7als Abhilfe festgehalten1
Siehe auch
- Host-System
- Gitea - Git-Dienst
- Gitea Actions - CI/CD-Plattform
- Docker - Container-Plattform
- Secrets-Verwaltung
- Behebung des Actions-Cache-Server-Problems