Le filtrage du réseau de l'école bloque duckdns.org, site et API, depuis les postes comme depuis la VM : sans API, pas de défi DNS-01. deSEC (dedyn.io) répond depuis les deux. - Domaine enervision-g3.dedyn.io ; provision-host.sh publie par l'API deSEC l'enregistrement du domaine et son joker vers la VM. - make tls-desec remplace tls-duckdns. acme.sh recopie le jeton dans acme/account.conf : le dossier est retiré aux autres comptes. - deploy.yml ne demande un certificat qu'à un .env déjà réaligné sur le domaine deSEC, pour ne pas faire échouer un déploiement en cours de migration.
76 lines
3.7 KiB
YAML
76 lines
3.7 KiB
YAML
# Pourquoi : le runner tourne sur la VM ENI, adresse privée que les runners hébergés par GitHub
|
|
# ne joignent pas, et travaille dans un dossier stable par environnement plutôt que dans son
|
|
# espace de travail : `.env`, certificats et volumes y survivent d'un déploiement à l'autre.
|
|
# Pourquoi : appelé par ci.yml une fois « CI ok » vert, jamais directement par un push, et il
|
|
# déploie `GITHUB_SHA`, le commit testé, pas la pointe de branche du moment (ADR 0014).
|
|
# Pourquoi : `main` va en prod, `dev` en recette, et toute autre branche lancée à la main
|
|
# (workflow_dispatch) va dans `dev`, la vitrine d'une branche de travail (ADR 0017).
|
|
# Piège : jamais de déclencheur `pull_request` ici. Sur un dépôt public, une PR de fork
|
|
# exécuterait son code sur la machine de production (ADR 0009) - job deploy.
|
|
# Piège : les CI de deux push finissent parfois dans le désordre. Un commit qui précède celui déjà
|
|
# déployé depuis la même branche est ignoré, et le verrou est un `flock` sur le dossier de
|
|
# l'environnement plutôt qu'un groupe `concurrency` : GitHub n'y garde qu'un job en attente, et
|
|
# le suivant l'évince sans bruit.
|
|
|
|
name: Déploiement
|
|
|
|
on:
|
|
workflow_call:
|
|
workflow_dispatch:
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
jobs:
|
|
deploy:
|
|
name: Déploie sur la VM
|
|
runs-on: [self-hosted, linux, eni-g3]
|
|
timeout-minutes: 30
|
|
environment:
|
|
name: ${{ github.ref_name == 'main' && 'prod' || github.ref_name == 'dev' && 'rec' || 'dev' }}
|
|
url: ${{ github.ref_name == 'main' && 'https://enervision-g3.dedyn.io' || github.ref_name == 'dev' && 'https://rec.enervision-g3.dedyn.io' || 'https://dev.enervision-g3.dedyn.io' }}
|
|
env:
|
|
ENVIRONNEMENT: ${{ github.ref_name == 'main' && 'prod' || github.ref_name == 'dev' && 'rec' || 'dev' }}
|
|
PORT_HTTPS: ${{ github.ref_name == 'main' && '10443' || github.ref_name == 'dev' && '8443' || '9443' }}
|
|
steps:
|
|
# Un seul step : le verrou tombe avec le shell qui l'a posé.
|
|
- name: Déploie le commit testé, sans jamais reculer
|
|
run: |
|
|
cd "/srv/enervision/${ENVIRONNEMENT}"
|
|
exec 9>"$(git rev-parse --git-dir)/verrou-deploiement"
|
|
flock 9
|
|
|
|
echo "::group::Aligne le dossier de l'environnement sur le commit testé"
|
|
git fetch --quiet origin "${GITHUB_REF_NAME}"
|
|
deploye="$(git rev-parse HEAD)"
|
|
if [ "$(git branch --show-current)" = "$GITHUB_REF_NAME" ] && [ "$deploye" != "$GITHUB_SHA" ] \
|
|
&& git merge-base --is-ancestor "$GITHUB_SHA" "$deploye"; then
|
|
echo "::notice::${GITHUB_SHA:0:7} précède le commit déjà déployé (${deploye:0:7}) : rien à déployer."
|
|
exit 0
|
|
fi
|
|
git checkout --quiet "${GITHUB_REF_NAME}"
|
|
git reset --quiet --hard "${GITHUB_SHA}"
|
|
git log -1 --format='%h %s'
|
|
echo "::endgroup::"
|
|
|
|
echo "::group::Reconstruit et redémarre la stack"
|
|
# Un `.env` pas encore réaligné par provision-host.sh porte encore un nom en `.local`.
|
|
if [ -r ../desec.token ] && grep -q '^PUBLIC_HOST=.*\.dedyn\.io$' .env; then make tls-desec; fi
|
|
make stack-up
|
|
if [ "${ENVIRONNEMENT}" = prod ]; then make front-up; fi
|
|
echo "::endgroup::"
|
|
|
|
echo "::group::Attend que l'API réponde derrière le proxy"
|
|
for _ in $(seq 1 36); do
|
|
if curl --fail --silent --insecure "https://localhost:${PORT_HTTPS}/api/v1/health/ready"; then
|
|
exit 0
|
|
fi
|
|
sleep 5
|
|
done
|
|
echo "::endgroup::"
|
|
echo "L'API ne répond pas après 3 minutes" >&2
|
|
compose="docker compose -f docker-compose.yml -f docker-compose.prod.yml"
|
|
$compose ps
|
|
$compose logs --tail=50 backend proxy
|
|
exit 1
|