Configurare il runner CI remoto¶
Guida all'utilizzo dello script che fornisce a una macchina remota l'esecuzione di pipeline CI/CD gitrust tramite SSH + rsync + Dagger.
1. Ruolo della sceneggiatura¶
deployment/setup-remote-ci.sh (disponibile nel repository dei sorgenti gitrust) prepara un server di build remoto utilizzato dal lavoratore CI gitrust. Automatizza 6 passaggi:
- Controlla la connettività SSH al corridore
- Installa Docker (
curl https://get.docker.com | sh) se è assente - Installa Dagger CLI (
curl https://dl.dagger.io/dagger/install.sh | sh) se assente - Crea la directory di lavoro remota (
CI_REMOTE_PATH) - Sincronizza il modulo
deployment/ci-engine/(modalità CI Easy) tramitersync -az --delete - Test del fumo: visualizza "docker --version" e "dagger version".
Lo script è idempotente: riproduce senza danni, salta ciò che già esiste.
2. Quando usarlo¶
| Scénario | Besoin de setup-remote-ci.sh ? |
|---|---|
Dev local, CI sur la même machine que gitrust (CI_REMOTE_HOST=localhost) |
Non — Docker et Dagger déjà installés localement, le ci-engine/ est lu depuis deployment/ci-engine/ directement |
| Prod on-premise, un seul serveur (gitrust + CI colocalisés) | Non — idem, un simple curl get.docker.com \| sh suffit sur le serveur gitrust |
| Prod avec runner CI dédié (machine séparée) | OUI — c'est le cas cible de ce script |
| Prod avec plusieurs instances gitrust partageant un runner | OUI — le runner est provisionné une fois, chaque instance pointe dessus |
| CI dans Kubernetes / Nomad / runner managé cloud | Non — ce script est pensé pour une VM Debian/Ubuntu classique |
3. Architettura di destinazione¶
+---------------------+ SSH + rsync +-----------------------+
| Gitrust (web+SSH) |---------------------------| CI Runner (distant) |
| <your-server-ip> | CI_REMOTE_HOST/USER/KEY | <ci-runner-ip> |
| | | |
| Worker CI Tokio | push .gitrust-ci.yml | /opt/gitrust-ci/ |
| (dans gitrust.bin) | + code source checkout | ├── ci-engine/ |
| | | └── workspaces/ |
| | dagger call ... | |
| | | Docker + Dagger CLI |
+---------------------+ +-----------------------+
Il CI Worker gitrust (attività Tokyo nel file binario principale) non esegue Docker localmente: delega al runner tramite SSH. Ciò rende possibile isolare i carichi di lavoro più avidi di CPU/RAM (build Rust, Node, Docker) dal processo web gitrust.
4. Prerequisiti¶
Sulla macchina di esecuzione (dove lanciamo lo script)¶
| Outil | Rôle |
|---|---|
bash ≥ 4 |
Interpréteur |
ssh, rsync |
Transport et synchro |
ssh-agent chargé ou CI_REMOTE_SSH_KEY défini |
Auth SSH sans mot de passe interactif (BatchMode=yes) |
Fichier .env avec les variables CI_REMOTE_* |
Config (voir section 5) |
Sul corridore lontano¶
| Pré-requis | Pourquoi |
|---|---|
| OS Linux récent (Debian 12+, Ubuntu 22.04+) | Docker install script compatible |
User avec sudo passwordless ou droits docker |
get.docker.com fait sudo en interne |
Clé SSH publique du user local dans ~/.ssh/authorized_keys |
Auth SSH non-interactive |
Réseau sortant autorisé vers get.docker.com et dl.dagger.io |
Installation des binaires |
Au minimum ~5 Go libres dans CI_REMOTE_PATH |
Images Docker + workspaces |
5. Variabili d'ambiente previste (il .env)¶
Lo script genera un file .env il cui percorso viene passato come argomento, o per impostazione predefinita ../.env (relativo allo script, quindi <project_root>/.env).
Tabella delle variabili¶
| Variable | Obligatoire | Défaut | Description |
|---|---|---|---|
CI_REMOTE_HOST |
OUI | — | Hostname ou IP du runner (ex: ci-runner.internal) |
CI_REMOTE_USER |
non | $(whoami) (user courant) |
Compte SSH sur le runner |
CI_REMOTE_SSH_PORT |
non | 22 |
Port SSH du runner |
CI_REMOTE_PATH |
non | /opt/gitrust-ci |
Répertoire de travail distant (créé par le script) |
CI_REMOTE_SSH_KEY |
non | — (ssh-agent) | Chemin d'une clé privée SSH spécifique |
Queste variabili sono le stesse di quelle lette da gitrust in fase di runtime. La centralizzazione in ".env" evita discrepanze tra provisioning e runtime.
Esempio minimo di .env (runner dedicato)¶
# --- CI runner distant ---
CI_REMOTE_HOST=<ci-runner-ip>
CI_REMOTE_USER=ci-runner
CI_REMOTE_SSH_PORT=22
CI_REMOTE_PATH=/opt/gitrust-ci
CI_REMOTE_SSH_KEY=/home/gitrust/.ssh/ci_runner_ed25519
Esempio completo di .env che coesiste con la configurazione gitrust¶
DATABASE_URL=postgres://...
JWT_SECRET=...
# ... (voir .env.example pour le reste)
# --- CI/CD (lu par gitrust ET par setup-remote-ci.sh) ---
CI_ENABLED=true
CI_MAX_CONCURRENT=4
CI_REMOTE_HOST=ci-runner.internal
CI_REMOTE_USER=ci-runner
CI_REMOTE_PATH=/opt/gitrust-ci
CI_REMOTE_SSH_KEY=/opt/gitrust/data/ci_runner_key
Caso "Local runner" (non è necessario lo script)¶
In questo caso, installa Docker e Dagger direttamente sulla macchina gitrust, copia deployment/ci-engine/ in CI_ENGINE_PATH (predefinito /opt/gitrust/ci-engine) e vai avanti. Non eseguire setup-remote-ci.sh con CI_REMOTE_HOST=localhost.
6. Utilizzare¶
Dalla radice del progetto (impostazione predefinita)¶
Con un file .env esplicito¶
./deployment/setup-remote-ci.sh /chemin/vers/mon.env
# Utile si vous avez .env.production, .env.staging, etc.
./deployment/setup-remote-ci.sh .env.production
Risultato previsto¶
==> Configuration :
Serveur : ci-runner@<ci-runner-ip>
Port SSH : 22
Chemin : /opt/gitrust-ci
==> [1/6] Vérification de la connectivité SSH...
SSH OK
OK
==> [2/6] Vérification de Docker...
Docker déjà installé
==> [3/6] Vérification de Dagger CLI...
Installation de Dagger CLI...
Dagger installé
==> [4/6] Création du répertoire distant...
/opt/gitrust-ci créé
==> [5/6] Synchronisation du ci-engine...
sending incremental file list
ci-engine/
ci-engine/profiles/
...
ci-engine synchronisé vers /opt/gitrust-ci/ci-engine/
==> [6/6] Smoke test...
Versions distantes :
Docker version 28.0.1, build abcd123
dagger v0.19.2 (linux/amd64)
==> Setup terminé. Le serveur ci-runner@<ci-runner-ip> est prêt pour l'exécution CI.
Pensez à configurer CI_EXECUTION_MODE=remote dans votre .env
7. Cosa si trova sul corridore¶
Dopo l'esecuzione riuscita:
/opt/gitrust-ci/ <- CI_REMOTE_PATH
└── ci-engine/ <- synchronisé depuis deployment/ci-engine/
├── README.md
└── profiles/ <- templates par stack (Python, Node, Rust, ...)
Plus, installés globalement :
- /usr/bin/docker (o equivalente) + socket /var/run/docker.sock
- /usr/local/bin/pugnale
Gli spazi di lavoro della pipeline (checkout temporanei) vengono creati dal lavoratore CI gitrust in fase di runtime in CI_WORKSPACE_PATH (predefinito /tmp/gitrust-ci) — non da questo script.
8. Controlli successivi alla configurazione¶
Dalla macchina gitrust¶
# Source le .env
set -a; source .env.production; set +a
# 1. SSH direct (doit passer sans prompt)
ssh -p ${CI_REMOTE_SSH_PORT:-22} \
${CI_REMOTE_SSH_KEY:+-i $CI_REMOTE_SSH_KEY} \
$CI_REMOTE_USER@$CI_REMOTE_HOST 'docker info && dagger version'
# 2. Rsync round-trip (lecture/écriture sur CI_REMOTE_PATH)
echo "test" | ssh $CI_REMOTE_USER@$CI_REMOTE_HOST \
"cat > $CI_REMOTE_PATH/.gitrust-test && cat $CI_REMOTE_PATH/.gitrust-test && rm $CI_REMOTE_PATH/.gitrust-test"
# Attendu : "test"
Testare la pipeline tramite gitrust¶
Invio di un repository con un .gitrust-ci.yml minimo:
Quindi nell'interfaccia utente gitrust: scheda "Pipeline" → la pipeline deve passare allo stato "successo".
9. Aggiornamento dopo la modifica di "ci-engine/".¶
Il ci-engine/ sincronizzato non è “live-linked”: riproduci lo script dopo la modifica sul lato sorgente.
# Modifier deployment/ci-engine/profiles/*.py ou similaire
./deployment/setup-remote-ci.sh
# Les étapes 2-3 sont skip (déjà installés), seule l'étape 5 refait le rsync
rsync -az --delete elimina i file lato runner che non esistono più localmente: garantisce la coerenza.
10. Risoluzione dei problemi¶
| Symptôme | Cause probable | Fix |
|---|---|---|
ERREUR: fichier .env introuvable |
.env absent ou chemin incorrect |
cp .env.example .env && $EDITOR .env ou passer le chemin : ./setup-remote-ci.sh /path/to/.env |
ERREUR: CI_REMOTE_HOST non défini |
Variable commentée ou absente | Décommenter CI_REMOTE_HOST=... dans le .env |
ERREUR: impossible de se connecter |
SSH bloqué, mauvais user, clé non autorisée | Tester manuellement : ssh -v -p X user@host ; vérifier ~/.ssh/authorized_keys sur le runner |
Permission denied (publickey) |
BatchMode=yes interdit les prompts, clé non chargée |
ssh-add ~/.ssh/ci_runner_ed25519 ou définir CI_REMOTE_SSH_KEY=/path/to/key |
sudo: a password is required pendant l'install Docker |
User sans NOPASSWD sudo |
Ajouter le user au sudoers : ci-runner ALL=(ALL) NOPASSWD:ALL (runner uniquement) |
curl: (7) Failed to connect to get.docker.com |
Réseau sortant du runner bloqué | Whitelist get.docker.com et dl.dagger.io, ou pré-installer Docker + Dagger manuellement |
ATTENTION: ... ci-engine introuvable |
Lancé hors du repo gitrust | cd dans la racine du projet avant de lancer |
Pipeline reste queued indéfiniment |
Worker CI ne trouve pas le runner | Vérifier CI_EXECUTION_MODE=remote dans .env gitrust + logs : journalctl -u gitrust \| grep -i 'ci\|dagger' |
dagger: command not found au smoke test |
$PATH du user SSH ne contient pas /usr/local/bin |
echo 'export PATH=$PATH:/usr/local/bin' >> ~/.bashrc sur le runner, ou CI_DAGGER_BIN=/usr/local/bin/dagger côté gitrust |
11. Sicurezza¶
- Il runner CI esegue codice arbitrario proveniente da repository ospitati. Mai collocarlo con segreti sensibili (prod PG, chiavi prod).
- Isola rete: blocca l'accesso in uscita dal runner alla LAN privata (è necessario solo l'accesso a Internet per
docker pull). - Limita
sudo NOPASSWDal minimo indispensabile sul runner (idealmente: solo per i comandidockereapt). - Rotazione regolare della chiave SSH
CI_REMOTE_SSH_KEY. Revocarlo in~/.ssh/authorized_keysdal lato runner in caso di sospetto. - Il corridore non deve essere in grado di connettersi tramite SSH alla macchina gitrust (unidirezionale).