feat: déploiement multi-branches avec URL par branche
ci/woodpecker/push/woodpecker Pipeline was successful

- Déclenche le pipeline sur main, dev et ci uniquement
- main → APP_DOMAIN (domaine racine, pas de préfixe)
- dev/ci → branche.APP_DOMAIN (sous-domaine par branche)
- Dossier de déploiement isolé par branche : /opt/g1flux/<branche>/

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
syoul
2026-03-23 15:22:29 +01:00
parent 2499fac213
commit ead63f9459
+35 -12
View File
@@ -1,5 +1,8 @@
when:
- branch: main
- branch:
- main
- dev
- ci
event: push
steps:
@@ -88,11 +91,20 @@ steps:
- name: write-env
image: alpine:3.20
environment:
APP_DOMAIN:
APP_DOMAIN_BASE:
from_secret: app_domain
commands:
- env | grep -E "^(APP_DOMAIN)=" > .env.deploy
- OWNER=$(echo "$CI_REPO_OWNER" | tr 'A-Z' 'a-z') && REPO=$(echo "$CI_REPO_NAME" | tr 'A-Z' 'a-z') && BRANCH=$(echo "$CI_COMMIT_BRANCH" | tr 'A-Z/' 'a-z-') && echo "COMPOSE_PROJECT_NAME=$OWNER-$REPO-$BRANCH" >> .env.deploy
- |
BRANCH=$(echo "$CI_COMMIT_BRANCH" | tr 'A-Z/' 'a-z-')
if [ "$CI_COMMIT_BRANCH" = "main" ]; then
EFFECTIVE_DOMAIN="$APP_DOMAIN_BASE"
else
EFFECTIVE_DOMAIN="$BRANCH.$APP_DOMAIN_BASE"
fi
OWNER=$(echo "$CI_REPO_OWNER" | tr 'A-Z' 'a-z')
REPO=$(echo "$CI_REPO_NAME" | tr 'A-Z' 'a-z')
echo "APP_DOMAIN=$EFFECTIVE_DOMAIN" > .env.deploy
echo "COMPOSE_PROJECT_NAME=$OWNER-$REPO-$BRANCH" >> .env.deploy
- echo "Fichier .env.deploy cree ($(wc -c < .env.deploy) octets)"
# Etape 5b : Validation du .env.deploy
@@ -120,12 +132,18 @@ steps:
- /var/run/docker.sock:/var/run/docker.sock
- /opt/g1flux:/opt/g1flux
commands:
- cp .env.deploy /opt/g1flux/.env
- chmod 600 /opt/g1flux/.env
- cp docker-compose.yml /opt/g1flux/docker-compose.yml
- cd /opt/g1flux && docker compose stop
- |
DOMAIN=$(grep '^APP_DOMAIN=' /opt/g1flux/.env | cut -d= -f2)
BRANCH=$(echo "$CI_COMMIT_BRANCH" | tr 'A-Z/' 'a-z-')
DEPLOY_DIR="/opt/g1flux/$BRANCH"
mkdir -p "$DEPLOY_DIR"
cp .env.deploy "$DEPLOY_DIR/.env"
chmod 600 "$DEPLOY_DIR/.env"
cp docker-compose.yml "$DEPLOY_DIR/docker-compose.yml"
cd "$DEPLOY_DIR" && docker compose stop
- |
BRANCH=$(echo "$CI_COMMIT_BRANCH" | tr 'A-Z/' 'a-z-')
DEPLOY_DIR="/opt/g1flux/$BRANCH"
DOMAIN=$(grep '^APP_DOMAIN=' "$DEPLOY_DIR/.env" | cut -d= -f2)
# Certificat TLS (acme.sh, idempotent)
# Exit 0 = emis/renouvele, exit 2 = skip (cert valide), autres = erreur
@@ -143,8 +161,11 @@ steps:
docker exec sonic-acme-1 cp /etc/acme.sh/$DOMAIN/fullchain.cer /host/certs/$DOMAIN-cert.pem
docker exec sonic-acme-1 cp /etc/acme.sh/$DOMAIN/$DOMAIN.key /host/certs/$DOMAIN-key.pem
echo "Cert TLS OK (acme exit $ACME_EXIT)"
- cd /opt/g1flux && docker compose up -d --remove-orphans
- cd /opt/g1flux && docker compose ps
- |
BRANCH=$(echo "$CI_COMMIT_BRANCH" | tr 'A-Z/' 'a-z-')
DEPLOY_DIR="/opt/g1flux/$BRANCH"
cd "$DEPLOY_DIR" && docker compose up -d --remove-orphans
docker compose ps
# Etape 7 : Verification que le container est running
- name: test-deploy
@@ -154,7 +175,9 @@ steps:
- /opt/g1flux:/opt/g1flux
commands:
- |
PROJECT=$(grep '^COMPOSE_PROJECT_NAME=' /opt/g1flux/.env | cut -d= -f2)
BRANCH=$(echo "$CI_COMMIT_BRANCH" | tr 'A-Z/' 'a-z-')
DEPLOY_DIR="/opt/g1flux/$BRANCH"
PROJECT=$(grep '^COMPOSE_PROJECT_NAME=' "$DEPLOY_DIR/.env" | cut -d= -f2)
STATUS=$(docker inspect --format '{{.State.Status}}' "$PROJECT-app" 2>/dev/null || echo "absent")
echo "$PROJECT-app : $STATUS"
[ "$STATUS" = "running" ] || { echo "FAIL: container non running"; exit 1; }