GARM est installé et son service tourne. Cette étape connecte GARM à votre instance Gitea : vous allez créer un PAT (Personal Access Token), déclarer un endpoint Gitea dans GARM, configurer un pool LXD, et déclencher votre premier job Actions sur un runner éphémère.
Prérequis : GARM v0.2.0 installé et l’API accessible. Voir Installer GARM.
Étape 1 — Mettre à jour les URLs du contrôleur
Section intitulée « Étape 1 — Mettre à jour les URLs du contrôleur »Après l’installation, les URLs du contrôleur pointent vers localhost. Gitea (et vos runners)
doivent pouvoir les joindre. Mettez à jour avec l’IP réelle de la VM.
garm-cli controller update \ --metadata-url "http://192.168.122.52:9997/api/v1/metadata" \ --callback-url "http://192.168.122.52:9997/api/v1/callbacks" \ --webhook-url "http://192.168.122.52:9997/webhooks" \ --agent-url "http://192.168.122.52:9997/agent"
# Vérifiergarm-cli controller showÉtape 2 — Créer un PAT Gitea pour GARM
Section intitulée « Étape 2 — Créer un PAT Gitea pour GARM »GARM a besoin d’un token Gitea pour interroger les repos, gérer les runners et répondre aux webhooks. Créez un PAT (Personal Access Token) via l’API Gitea.
# Créer le PAT via l'API Gitea# (adapter l'utilisateur et le mot de passe à votre installation)curl -X POST \ -u 'giteaadmin:Admin1234!' \ -H 'Content-Type: application/json' \ -d '{ "name": "garm-token", "scopes": ["write:repository", "write:organization", "read:user"] }' \ 'http://localhost:3000/api/v1/users/giteaadmin/tokens'La réponse contient le token (champ sha1) — notez-le, il ne sera affiché qu’une fois :
{ "id": 1, "name": "garm-token", "sha1": "d86697b5ee780c927a4c25dcee8dd327760a111c", ...}Étape 3 — Déclarer l’endpoint Gitea dans GARM
Section intitulée « Étape 3 — Déclarer l’endpoint Gitea dans GARM »Un endpoint dans GARM représente une instance Gitea (ou GitHub). Il contient l’URL de base et l’URL de l’API.
garm-cli gitea endpoint create \ --name "local-gitea" \ --description "Gitea local lab" \ --base-url "http://192.168.122.52:3000" \ --api-base-url "http://192.168.122.52:3000"
# Vérifiergarm-cli gitea endpoint listÉtape 4 — Ajouter les credentials
Section intitulée « Étape 4 — Ajouter les credentials »Les credentials associent un endpoint à un token d’authentification. Utilisez le PAT créé à l’étape 2.
garm-cli gitea credentials add \ --endpoint "local-gitea" \ --auth-type "pat" \ --pat-oauth-token "d86697b5ee780c927a4c25dcee8dd327760a111c" \ --name "gitea-creds" \ --description "PAT garm-token"
# Vérifiergarm-cli gitea credentials listÉtape 5 — Créer un repo de test dans Gitea
Section intitulée « Étape 5 — Créer un repo de test dans Gitea »Pour tester GARM, vous avez besoin d’un repo Gitea avec Gitea Actions activé.
# Créer le repocurl -X POST \ -u 'giteaadmin:Admin1234!' \ -H 'Content-Type: application/json' \ -d '{ "name": "garm-test", "description": "Repo de test pour GARM runners", "private": false, "auto_init": true, "default_branch": "main" }' \ 'http://localhost:3000/api/v1/user/repos'Étape 6 — Ajouter le repo dans GARM
Section intitulée « Étape 6 — Ajouter le repo dans GARM »garm-cli repository add \ --credentials "gitea-creds" \ --owner "giteaadmin" \ --name "garm-test" \ --webhook-secret "garm-webhook-secret-lab2026"Attendez quelques secondes que le pool manager démarre, puis vérifiez :
garm-cli repository list# → POOL MGR RUNNING doit être "true"Étape 7 — Créer le pool LXD
Section intitulée « Étape 7 — Créer le pool LXD »Un pool définit comment les runners seront créés. Il associe un repo, un provider LXD, une image Ubuntu et des limites (max de runners simultanés).
# Récupérer l'ID du repoREPO_ID=$(garm-cli repository list --format json | \ python3 -c "import sys,json; repos=json.load(sys.stdin); \ print([r['id'] for r in repos if r['name']=='garm-test'][0])")
echo "Repo ID: ${REPO_ID}"
# Créer le pool LXDgarm-cli pool add \ --repo "${REPO_ID}" \ --provider-name "lxd_local" \ --image "ubuntu:24.04" \ --flavor "default" \ --os-type "linux" \ --os-arch "amd64" \ --max-runners 3 \ --min-idle-runners 0 \ --tags "ubuntu,lxd" \ --runner-prefix "garm" \ --enabled
# Vérifiergarm-cli pool list --repo "${REPO_ID}"Étape 8 — Configurer le webhook Gitea
Section intitulée « Étape 8 — Configurer le webhook Gitea »Gitea doit notifier GARM quand un job Actions est mis en file d’attente. Cette notification
s’appelle un webhook workflow_job. L’URL cible est fournie par GARM (Controller Webhook URL).
-
Récupérer l’URL du webhook contrôleur :
9997/webhooks/f3737450-c29c-4180-a18b-e2298f8d327f garm-cli controller show | grep "Controller Webhook URL" -
Créer le webhook sur le repo :
Fenêtre de terminal curl -X POST \-u 'giteaadmin:Admin1234!' \-H 'Content-Type: application/json' \-d '{"type": "gitea","config": {"url": "http://192.168.122.52:9997/webhooks/f3737450-c29c-4180-a18b-e2298f8d327f","content_type": "json","secret": "garm-webhook-secret-lab2026"},"events": ["workflow_job"],"active": true}' \'http://localhost:3000/api/v1/repos/giteaadmin/garm-test/hooks' -
Vérifier le webhook :
Fenêtre de terminal curl -s \-u 'giteaadmin:Admin1234!' \'http://localhost:3000/api/v1/repos/giteaadmin/garm-test/hooks' | \python3 -c "import sys,json; [print(h['id'], h['active'], h['events']) for h in json.load(sys.stdin)]"# → 1 True ['workflow_job']
Étape 9 — Tester avec un workflow Actions
Section intitulée « Étape 9 — Tester avec un workflow Actions »Créez un workflow qui demande un runner avec le label lxd (celui assigné au pool) :
name: Test GARM Runneron: [push]
jobs: test: runs-on: ["self-hosted", "lxd"] steps: - name: Infos runner run: | echo "Hostname: $(hostname)" echo "Kernel: $(uname -r)" echo "Distro: $(cat /etc/os-release | grep PRETTY_NAME)" echo "User: $(whoami)" - name: Test réseau run: curl -sf https://gitea.com/api/swagger | head -5Poussez ce fichier dans votre repo et observez dans une autre fenêtre :
# Surveiller les runners créés par GARMwatch garm-cli runner list --pool "$(garm-cli pool list --repo ${REPO_ID} --format json | \ python3 -c 'import sys,json; pools=json.load(sys.stdin); print(pools[0]["id"])')"
# Suivre les logs GARMsudo journalctl -u garm -f --no-pagerVérification complète
Section intitulée « Vérification complète »# État du contrôleurgarm-cli controller show
# Providersgarm-cli provider list
# Endpoints Giteagarm-cli gitea endpoint list
# Credentialsgarm-cli gitea credentials list
# Repos gérésgarm-cli repository list
# Poolsgarm-cli pool list --all
# Runners actifsgarm-cli runner list --allDépannage
Section intitulée « Dépannage »| Symptôme | Cause probable | Action |
|---|---|---|
Pool manager false après ajout repo | PAT incorrect ou endpoint mal configuré | journalctl -u garm -n 30 |
| Webhook not received | Mauvaise URL ou secret incorrect | Vérifier l’URL du Controller Webhook dans garm-cli controller show |
| Runner créé mais job ne s’assigne pas | Labels du pool ne correspondent pas à runs-on | Pool avec tag lxd, workflow avec runs-on: ["self-hosted", "lxd"] |
| Container LXD timeout | Image ubuntu:24.04 non en cache | Premier lancement long : attendre 2-3 min, augmenter runner-bootstrap-timeout |
garm-cli: permission denied sur config | Config créée par root | sudo chown $USER ~/.local/share/garm-cli/config.toml |
| Token JWT expiré | Session expirée | garm-cli profile login -u garmadmin -p "mot-de-passe" |
À retenir
Section intitulée « À retenir »- GARM v0.2.0 gère les credentials Gitea via
garm-cli gitea credentials add. - Le webhook
workflow_jobest l’événement déclencheur — sans lui, GARM ne crée aucun runner. - Le secret webhook doit correspondre entre le hook Gitea et
garm-cli repository add. - Chaque runner est éphémère et associé à un seul job.
- Les labels du pool (
--tags) doivent correspondre auxruns-ondu workflow.