Pipeline CI/CD¶
KanjiIQ utilise Forgejo Actions pour l'intégration et le déploiement continus. Forgejo Actions est compatible avec la syntaxe YAML de GitHub Actions, s'exécutant sur des runners auto-hébergés.
Structure des workflows¶
.forgejo/workflows/
├── deploy-frontend.yml # Build & deploy Flutter Web
├── deploy-backend.yml # Build & deploy Dart Frog API
└── deploy-docs.yml # Build & deploy documentation site
Chaque workflow suit le même schéma :
graph TD
A[Push to main] --> B{Path filter<br/>matches?}
B -->|Yes| C[Checkout code]
B -->|No| X[Skip]
C --> D[Login to Forgejo<br/>Container Registry]
D --> E[Docker build<br/>--no-cache]
E --> F[Push :latest +<br/>:COMMIT_SHA]
F --> G[kubectl set image]
G --> H[Wait for rollout<br/>timeout: 5m]
H --> I[Cleanup: logout]
Workflow du frontend¶
name: Deploy Frontend to k3s
on:
push:
branches: [main]
paths:
- 'frontend/**'
- 'Dockerfile.frontend'
- 'nginx.frontend.conf'
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Login to registry
run: echo "$FORGEJO_TOKEN" | docker login $REGISTRY_URL -u $REGISTRY_USER --password-stdin
- name: Build image
run: |
docker build --no-cache --pull \
--build-arg CACHEBUST=$(date +%s) \
-f Dockerfile.frontend \
-t <registry>/jlpt-kanji-frontend:latest \
-t <registry>/jlpt-kanji-frontend:$(git rev-parse --short HEAD) .
- name: Push & deploy
run: |
docker push <registry>/jlpt-kanji-frontend:latest
docker push <registry>/jlpt-kanji-frontend:$(git rev-parse --short HEAD)
kubectl set image deployment/jlpt-kanji \
frontend=<registry>/jlpt-kanji-frontend:$(git rev-parse --short HEAD) \
-n jlpt-kanji
kubectl rollout status deployment/jlpt-kanji -n jlpt-kanji --timeout=5m
Secrets¶
Les workflows utilisent un seul secret :
| Secret | Fonction |
|---|---|
FORGEJO_TOKEN |
Authentification pour le push vers le registre de conteneurs et l'accès Kubernetes |
Le token est configuré dans Forgejo dans Repository Settings > Secrets.
Registre d'images¶
Toutes les images sont stockées dans le Forgejo Container Registry :
<registry>/jlpt-kanji-frontend:latest
<registry>/jlpt-kanji-frontend:<commit-sha>
<registry>/jlpt-kanji-backend:latest
<registry>/jlpt-kanji-backend:<commit-sha>
<registry>/jlpt-kanji-docs:latest
<registry>/jlpt-kanji-docs:<commit-sha>
Vérification du déploiement¶
Après kubectl set image, le workflow attend la fin du déploiement :
Cela bloque jusqu'à ce que :
- Tous les nouveaux pods passent les sondes de readiness, ou
- Le délai expire (le workflow échoue, alertant le développeur)
Si un déploiement échoue, Kubernetes arrête automatiquement le déploiement et la version précédente continue de servir le trafic.
Rollback manuel¶
Pour revenir à une version précédente :