Files
2026-09-29 18:31:08 +02:00

99 lines
4.6 KiB
YAML

# CI/CD Gitea Actions : à chaque push sur `main`, build des images
# (registre de conteneurs intégré à Gitea) puis déploiement SSH sur le VPS.
#
# Nécessite un runner Gitea Actions (act_runner, exécuteur "docker") attaché
# au dépôt ou à l'organisation.
#
# Secrets à définir (Paramètres du dépôt → Actions → Secrets) :
# REGISTRY_TOKEN jeton d'accès (scope "write:package") pour pousser sur
# le registre de conteneurs de cette instance Gitea
# SSH_KEY clé privée SSH (format OpenSSH) pour se connecter au VPS
#
# Variables à définir (Paramètres du dépôt → Actions → Variables) :
# REGISTRY_HOST hôte du registre (ex. gitea.mon-domaine.fr)
# REGISTRY_NAMESPACE espace du registre (ex. <organisation>/<depot>)
# REGISTRY_USER utilisateur associé à REGISTRY_TOKEN
# SSH_HOST hôte du VPS
# SSH_USER utilisateur SSH
# DEPLOY_PATH dossier du projet sur le VPS (ex. /opt/benevoles)
# VITE_EDITION_ID UUID de l'édition de production, à renseigner APRÈS
# la toute première mise en service (voir deploy/README.md)
# VITE_HCAPTCHA_SITE_KEY clé de site hCaptcha (publique) — figée au build
# du frontend, voir app/api/forms.py et deploy/README.md.
# Vide ⇒ formulaire public sans vérification anti-robot.
name: ci-cd
on:
push:
branches: [main]
concurrency:
group: ci-cd-${{ gitea.ref }}
cancel-in-progress: false
jobs:
build-backend:
runs-on: ubuntu-latest
container: docker:27
steps:
- name: Installer git et node
run: apk add --no-cache git nodejs
- uses: actions/checkout@v4
- name: Connexion au registre
run: echo "${{ secrets.REGISTRY_TOKEN }}" | docker login "${{ vars.REGISTRY_HOST }}" -u "${{ vars.REGISTRY_USER }}" --password-stdin
- name: Build & push
run: |
IMAGE="${{ vars.REGISTRY_HOST }}/${{ vars.REGISTRY_NAMESPACE }}/backend"
docker build -t "$IMAGE:${{ gitea.sha }}" -t "$IMAGE:latest" backend
docker push "$IMAGE:${{ gitea.sha }}"
docker push "$IMAGE:latest"
build-frontend:
needs: build-backend # séquentiel pour ne pas saturer le CPU
runs-on: ubuntu-latest
container: docker:27
steps:
- name: Installer git et node
run: apk add --no-cache git nodejs
- uses: actions/checkout@v4
- name: Connexion au registre
run: echo "${{ secrets.REGISTRY_TOKEN }}" | docker login "${{ vars.REGISTRY_HOST }}" -u "${{ vars.REGISTRY_USER }}" --password-stdin
- name: Build & push
run: |
IMAGE="${{ vars.REGISTRY_HOST }}/${{ vars.REGISTRY_NAMESPACE }}/frontend"
docker build \
--build-arg VITE_API_MODE=http \
--build-arg VITE_EDITION_ID="${{ vars.VITE_EDITION_ID }}" \
--build-arg VITE_HCAPTCHA_SITE_KEY="${{ vars.VITE_HCAPTCHA_SITE_KEY }}" \
-f frontend/Dockerfile.prod \
-t "$IMAGE:${{ gitea.sha }}" -t "$IMAGE:latest" frontend
docker push "$IMAGE:${{ gitea.sha }}"
docker push "$IMAGE:latest"
deploy:
needs: [build-backend, build-frontend]
runs-on: ubuntu-latest
container: alpine:3.20
steps:
- name: Installer les outils
run: apk add --no-cache git nodejs openssh-client rsync
- uses: actions/checkout@v4
- name: Déployer par SSH
run: |
mkdir -p ~/.ssh && chmod 700 ~/.ssh
echo "${{ secrets.SSH_KEY }}" | tr -d '\r' > ~/.ssh/id_ed25519
chmod 600 ~/.ssh/id_ed25519
ssh-keyscan -H "${{ vars.SSH_HOST }}" >> ~/.ssh/known_hosts
rsync -az -e "ssh -i ~/.ssh/id_ed25519" deploy/docker-compose.prod.yml "${{ vars.SSH_USER }}@${{ vars.SSH_HOST }}:${{ vars.DEPLOY_PATH }}/docker-compose.prod.yml"
ssh -i ~/.ssh/id_ed25519 "${{ vars.SSH_USER }}@${{ vars.SSH_HOST }}" sh -s <<EOF
set -e
cd "${{ vars.DEPLOY_PATH }}"
echo "${{ secrets.REGISTRY_TOKEN }}" | docker login "${{ vars.REGISTRY_HOST }}" -u "${{ vars.REGISTRY_USER }}" --password-stdin
export BACKEND_IMAGE="${{ vars.REGISTRY_HOST }}/${{ vars.REGISTRY_NAMESPACE }}/backend:${{ gitea.sha }}"
export FRONTEND_IMAGE="${{ vars.REGISTRY_HOST }}/${{ vars.REGISTRY_NAMESPACE }}/frontend:${{ gitea.sha }}"
docker compose -f docker-compose.prod.yml pull
docker compose -f docker-compose.prod.yml run --rm backend uv run alembic upgrade head
docker compose -f docker-compose.prod.yml up -d
docker image prune -f
EOF