Forgejo Actions (et son équivalent Gitea Actions) est l’un des arguments massifs en faveur de la migration depuis GitHub : un système CI/CD intégré, compatible à 90 % avec les workflows GitHub Actions, qui tourne sur vos propres runners. Pas de minutes facturées, pas de limites artificielles, vos secrets restent chez vous. Voici le tutoriel complet 2026.
Voir notre guide Forgejo.
Compatibilité avec GitHub Actions
Forgejo Actions a été conçu pour exécuter directement les workflows YAML de GitHub Actions, avec quelques différences :
- Syntaxe YAML : 100 % identique
- Actions GitHub Marketplace : la plupart fonctionnent (clone via URL Git)
actions/checkout@v4,actions/setup-node@v4, etc. fonctionnent natifvement- Différences : pas de
GITHUB_*maisGITEA_*en plus, certaines actions très spécifiques GitHub ne marchent pas
Étape 1 — Activer Actions dans Forgejo
Dans app.ini :
[actions]
ENABLED = true
DEFAULT_ACTIONS_URL = github
L’option DEFAULT_ACTIONS_URL = github permet d’utiliser uses: actions/checkout@v4 qui sera résolu vers github.com/actions/checkout.
Activer Actions au niveau repo : Repo → Settings → Advanced → Enable Actions.
Étape 2 — Installer un runner
Forgejo Actions nécessite des « runners » pour exécuter les jobs. Le runner officiel est act_runner :
# Sur un VPS dédié runner (recommandé) ou même VPS Forgejo
wget -O act_runner https://code.forgejo.org/forgejo/runner/releases/download/v3.x.x/forgejo-runner-3.x.x-linux-amd64
chmod +x act_runner
sudo mv act_runner /usr/local/bin/
# Générer config
forgejo-runner generate-config > config.yaml
# Récupérer un token d'inscription depuis Forgejo :
# Site Administration → Actions → Runners → New Runner Token
forgejo-runner register \
--instance https://git.exemple.sn \
--token TOKEN_xxx \
--name runner-prod-01 \
--labels ubuntu-latest:docker://node:20-bookworm,ubuntu-22.04:docker://node:20-bookworm
# Démarrer
forgejo-runner daemon
Étape 3 — Service systemd pour le runner
# /etc/systemd/system/forgejo-runner.service
[Unit]
Description=Forgejo Actions Runner
After=network.target docker.service
[Service]
Type=simple
User=runner
Group=runner
WorkingDirectory=/home/runner
ExecStart=/usr/local/bin/forgejo-runner daemon
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
sudo systemctl enable --now forgejo-runner
sudo systemctl status forgejo-runner
Étape 4 — Premier workflow
# .forgejo/workflows/test.yml (ou .gitea/workflows/test.yml)
name: Test
on:
push:
branches: [main]
pull_request:
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npm ci
- run: npm test
- run: npm run build
Push, et dans l’onglet Actions du repo vous voyez le job s’exécuter en direct.
Étape 5 — Secrets
- Repo → Settings → Secrets → Add Secret
- Référencer dans workflow :
{{ secrets.MY_SECRET }}
Les secrets sont chiffrés au repos et exposés uniquement aux jobs autorisés.
Étape 6 — Déploiement automatique
name: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build
run: |
npm ci
npm run build
- name: Deploy via SSH
env:
SSH_KEY: ${{ secrets.DEPLOY_SSH_KEY }}
run: |
mkdir -p ~/.ssh
echo "$SSH_KEY" > ~/.ssh/id_ed25519
chmod 600 ~/.ssh/id_ed25519
ssh-keyscan -H web-prod-01 >> ~/.ssh/known_hosts
rsync -avz dist/ deploy@web-prod-01:/var/www/site/
ssh deploy@web-prod-01 'systemctl --user reload caddy'
Étape 7 — Cache de dépendances
- uses: actions/cache@v4
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
Adaptation Afrique de l’Ouest
Forgejo Actions économise ce qui peut devenir une ligne de coût significative chez GitHub : 0,008 USD/min au-delà des 2000 min gratuites. Pour une équipe avec 10 builds/jour de 5 min, c’est ~12 USD/mois, soit ~150 USD/an sur GitHub. En self-host, vous payez juste le VPS runner (4 €/mois Hetzner CX23 supplémentaire).
Erreurs fréquentes
| Erreur | Cause | Solution |
|---|---|---|
| « no runner available » | Aucun runner inscrit | Inscrire au moins un runner |
| « docker not found » | Runner pas dans groupe docker | usermod -aG docker runner |
| Workflow échoue avec timeout | Runner sous-dimensionné | VPS runner 4 Go RAM minimum |
| actions/checkout fail | DEFAULT_ACTIONS_URL non configuré | Ajouter dans app.ini |
Sur le même thème
- Guide Forgejo complet
- Installer Forgejo sur Coolify
- Migrer GitHub vers Forgejo
- Documentation Forgejo Actions : forgejo.org/docs
Pourquoi Forgejo Actions plutot que GitHub Actions en 2026
Forgejo est le fork communautaire de Gitea ne en 2022 apres la captation commerciale de Gitea Ltd. En 2026, Forgejo s impose comme l alternative serieuse a GitHub pour les equipes qui veulent : auto-heberger sur un VPS modeste, eviter le vendor lock-in Microsoft, et garder leurs CI/CD chez eux. Forgejo Actions, lancees en 2023 et stabilisees en 2024, sont compatibles avec la syntaxe GitHub Actions. Vos workflows existants .github/workflows/ tournent sans modification dans .forgejo/workflows/.
Pour une agence dev a Dakar ou Abidjan, le calcul est simple : un VPS Hetzner CX22 a 4,90 EUR / mois (~3 215 FCFA) heberge Forgejo + un runner Actions, ce qui couvre 5-10 projets clients sans payer le moindre cent a GitHub. En bonus : aucune limite de minutes CI gratuite, aucun risque de coupure si le compte GitHub est suspendu pour fausse alerte automatique.
Etape 1 : Installer Forgejo via Docker
Forgejo se distribue en binaire Go ou en image Docker officielle. Pour un demarrage rapide, Docker est le plus simple : la version 8.x est la stable au moment de la redaction (avril 2026).
mkdir -p /opt/forgejo/data
cd /opt/forgejo
cat > docker-compose.yml <<'EOF'
services:
forgejo:
image: codeberg.org/forgejo/forgejo:8
ports:
- "3000:3000"
- "2222:22"
volumes:
- ./data:/data
restart: always
EOF
docker compose up -d
Sortie attendue : Container forgejo-forgejo-1 Started. Visitez http://VOTRE_IP:3000, l ecran d installation s affiche. Choisissez SQLite (suffit jusqu a 50 utilisateurs) ou Postgres pour la prod, creez le compte admin, validez. Forgejo redemarre et la page de login apparait.
Etape 2 : Configurer un reverse proxy HTTPS
Exposer Forgejo en HTTP brut sur le web est inacceptable : le formulaire de login passerait les credentials en clair. Caddy fait le travail en deux lignes de Caddyfile.
git.example.com {
reverse_proxy 127.0.0.1:3000
}
Rechargez Caddy avec sudo systemctl reload caddy. Le certificat TLS est negocie automatiquement avec Let s Encrypt en moins de 30 secondes. Modifiez ensuite /opt/forgejo/data/conf/app.ini pour mettre a jour ROOT_URL = https://git.example.com/, puis docker compose restart. Verifiez : la page de login s ouvre en HTTPS.
Etape 3 : Activer Forgejo Actions cote serveur
Forgejo Actions est desactive par defaut. Ajoutez la section [actions] dans app.ini et redemarrez le conteneur.
[actions]
ENABLED = true
DEFAULT_ACTIONS_URL = https://code.forgejo.org
Sortie attendue : apres redemarrage, l onglet « Actions » apparait sur chaque depot. Le DEFAULT_ACTIONS_URL indique ou aller chercher les actions reutilisables (equivalent uses: actions/checkout@v4). Forgejo maintient un mirror de actions/checkout, actions/setup-node, actions/cache compatible.
Etape 4 : Installer un runner Forgejo Actions
Le runner est un binaire Go separe (forgejo-runner) qui execute les jobs CI. Il peut tourner sur la meme machine que Forgejo ou sur un serveur dedie. Pour un projet dev, on le met sur le meme VPS.
wget https://code.forgejo.org/forgejo/runner/releases/download/v6.2.2/forgejo-runner-6.2.2-linux-amd64
chmod +x forgejo-runner-6.2.2-linux-amd64
mv forgejo-runner-6.2.2-linux-amd64 /usr/local/bin/forgejo-runner
forgejo-runner generate-config > /etc/forgejo-runner.yaml
La sortie genere un fichier YAML de config par defaut. Editez /etc/forgejo-runner.yaml et ajustez le label par defaut labels: [docker] si vous comptez utiliser des conteneurs comme environnement d execution.
Etape 5 : Enregistrer le runner aupres de Forgejo
Direction l admin Forgejo : Site Administration > Actions > Runners > Create new Runner. Forgejo affiche un token unique a copier. Lancez l enregistrement cote runner.
forgejo-runner register --no-interactive \
--instance https://git.example.com \
--token VOTRE_TOKEN \
--name runner-prod-1 \
--labels docker
Sortie attendue : Registered successfully. Verifiez dans l admin Forgejo : le runner apparait avec le statut « Idle ». Lancez ensuite forgejo-runner daemon en service systemd pour qu il tourne en arriere-plan en permanence.
Etape 6 : Ecrire un premier workflow Node.js
Creez un depot, poussez votre code Node.js. Ajoutez le fichier .forgejo/workflows/ci.yml avec un workflow basique de tests.
name: CI
on: [push, pull_request]
jobs:
test:
runs-on: docker
container:
image: node:22-alpine
steps:
- uses: actions/checkout@v4
- run: npm ci
- run: npm test
Apres push, ouvrez l onglet Actions du depot. Le workflow doit apparaitre en cours d execution. Cliquez dessus pour voir les logs en streaming. La sortie attendue : un cercle vert apres ~2 min selon la taille du projet. Si echec, les logs identifient la commande exacte qui a casse.
Etape 7 : Build et push d une image Docker vers le registry Forgejo
Forgejo embarque un container registry compatible Docker. Vos images sont stockees a cote du code. Le workflow CI/CD type build, scan Trivy, et push.
name: Docker
on:
push:
branches: [main]
jobs:
build:
runs-on: docker
steps:
- uses: actions/checkout@v4
- name: Login to Forgejo registry
run: echo "${{ secrets.PACKAGE_TOKEN }}" | docker login git.example.com -u ci --password-stdin
- name: Build image
run: docker build -t git.example.com/monorg/myapp:latest .
- name: Scan with Trivy
run: docker run --rm -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy:latest image --severity CRITICAL,HIGH --exit-code 1 git.example.com/monorg/myapp:latest
- name: Push image
run: docker push git.example.com/monorg/myapp:latest
Le secret PACKAGE_TOKEN se cree depuis Settings > Applications > Generate New Token avec scope write:package. Apres run, l image apparait dans Packages du depot, pullable depuis n importe quel serveur avec les credentials.
Etape 8 : Deployer en production via SSH
L etape finale du CD : pousser la nouvelle image sur le serveur de prod et redemarrer le service. Pour rester simple et eviter Kubernetes, on utilise SSH + docker compose.
- name: Deploy to prod
env:
SSH_KEY: ${{ secrets.SSH_PROD_KEY }}
run: |
mkdir -p ~/.ssh
echo "$SSH_KEY" > ~/.ssh/id_ed25519
chmod 600 ~/.ssh/id_ed25519
ssh -o StrictHostKeyChecking=no deploy@prod.example.com "cd /opt/myapp && docker compose pull && docker compose up -d"
La cle SSH doit etre une cle deploy dediee, sans passphrase, autorisee uniquement pour le user deploy sur le serveur prod. Verifiez le succes avec docker logs myapp-app-1 qui doit montrer le tag de la nouvelle version. Pour approfondir, consultez Docker / Podman avance 2026 et PocketBase OAuth Google.
Annexe : sauvegarde Forgejo et restoration
La commande forgejo dump packetise repos, attachments, base et config en un seul tar.gz. Lancez-la depuis le conteneur via cron.
0 2 * * * docker exec forgejo-forgejo-1 forgejo dump -c /data/gitea/conf/app.ini -f /data/dumps/forgejo_$(date +\%Y\%m\%d).zip
Pour restaurer sur un nouveau VPS : decompressez le zip, copiez les sous-dossiers repos/, data/, custom/ dans la nouvelle instance, importez le dump SQL, redemarrez. Toutes les actions, releases et packages sont preservees.
Annexe : retours d experience Dakar 2025-2026
Migration GitHub vers Forgejo realisee sur 4 projets clients en 2025. Gains constates : economie de 16 USD / mois en moyenne (les comptes Team a 4 USD/user x 4 devs), reduction du temps de build CI de 30% (le runner local n a pas la latence transcontinentale vers les datacenters GitHub), et zero coupure depuis 9 mois. Pieges rencontres : les actions tres specifiques GitHub (github/codeql-action) ne sont pas portables — il faut les remplacer par leurs equivalents open-source (Semgrep CLI). Les workflows reutilisables avec uses: org/repo/.github/workflows/x.yml@v1 fonctionnent en pointant vers le depot Forgejo equivalent.
Annexe : runners pour environnements multiples
Un seul runner suffit pour des projets simples, mais des qu on multiplie les stacks (Node, Python, Rust, Go), on gagne a installer plusieurs runners avec labels differents. Ajoutez runs-on: rust dans le workflow et enregistrez un runner avec --labels rust. Forgejo route automatiquement le job vers le bon runner.
Pour de la matrice multi-OS, lancez un runner sur un VPS Ubuntu 24.04 avec label linux, et un autre sur un Mac mini M2 avec label macos. Le workflow declare strategy: matrix: os: [linux, macos] et execute les jobs en parallele. Pratique pour les apps cross-platform comme un binaire CLI Rust.
Annexe : monitoring et metriques du runner
Forgejo runner expose un endpoint Prometheus sur :8088/metrics si on lance avec --enable-pprof. Branchez Grafana pour visualiser le nombre de jobs en file, la duree moyenne d execution, et le taux d echec. Alerte typique : si la file depasse 10 jobs en attente plus de 5 minutes, ajoutez un runner.
Pour la consommation disque, surveillez /var/lib/docker : les images CI s accumulent vite. Mettez en place un cron de nettoyage hebdomadaire docker system prune -af --filter "until=168h" qui libere les images de plus d une semaine. Verifiez l espace libere dans la sortie de la commande.
FAQ Forgejo Actions
Forgejo Actions est-il vraiment compatible avec GitHub Actions ? Oui a 95%. La syntaxe YAML, les variables (${{ github.* }} remplace par ${{ gitea.* }}), et les actions reutilisables courantes (checkout, setup-node, cache) fonctionnent identiquement. Les 5% restants sont les actions GitHub-only (CodeQL, Pages).
Combien de runners par VPS ? Un runner consomme 200-300 Mo RAM au repos. Sur un CX22 (4 Go RAM), comptez 3-4 runners simultanes max si on garde des marges pour les jobs eux-memes.
Peut-on heberger le runner chez le client ? Oui, c est meme l usage type pour les missions avec donnees sensibles (secteur bancaire Dakar, sante). Le code ne quitte jamais l infra du client, seul le statut du job remonte vers Forgejo central.
Forgejo gere-t-il les workflows planifies ? Oui, le declencheur on: schedule: cron fonctionne et permet de lancer des jobs recurrents (rebuild nocturne d image, scan securite quotidien, sauvegarde automatique des bases applicatives client) sans dependance externe.