infra: déploiement continu — relance automatique des apps à chaque merge sur main (#95) #96

Merged
lenaic merged 2 commits from gabriel/95-deploiement-continu into develop 2026-09-02 19:28:25 +00:00
Member

Ferme #95.

Contenu

.forgejo/workflows/deploy.yml : sur push main (et workflow_dispatch), rejoue ansible-playbook site.yml --tags app --limit prod avec repo_version = commit fusionné. Socle système (base, deploy_user, ssh_hardening, docker) volontairement hors périmètre.

group_vars/all/vault.yml est désormais commité chiffré (ansible-vault) : la chaîne le lit, seul ANSIBLE_VAULT_PASSWORD devient un secret Forgejo, avec DEPLOY_SSH_KEY.

Fiabilisation (revue interne)

  • known_hosts amorcé par ssh-keyscan avant la connexion Ansible : le conteneur du job est neuf et ansible.cfg impose host_key_checking = True.
  • --vault-password-file passé aussi à la commande ad hoc « État des piles » (sinon échec de déchiffrement du vault.yml commité).
  • cancel-in-progress: false : un ansible-playbook en cours ne doit pas être coupé (état serveur à mi-chemin).
  • Clé SSH écrite avec newline final, secrets passés par env:.
  • tests/ci/test-deploiement-continu.sh branché dans ci.yml (tourne sur chaque PR) et étendu : déclencheur, périmètre, secrets, concurrence, known_hosts, vault chiffré.

Docs

docs/runbooks/deploiement.md : procédure de mise en place (générer la clé CI, jouer --tags deploy_user d'abord, créer les 2 secrets). docs/runbooks/ci.md : diagnostic, dont Host key verification failed.

À faire avant que ça serve (hors dépôt)

  1. Générer la paire CI, ajouter la pubkey à vault_deploy_authorized_keys, recommit du vault.
  2. ansible-playbook site.yml --tags deploy_user --limit prod.
  3. Créer DEPLOY_SSH_KEY et ANSIBLE_VAULT_PASSWORD dans les secrets du dépôt.
  4. Déclencher une fois par workflow_dispatch et vérifier le journal.
Ferme #95. ## Contenu `.forgejo/workflows/deploy.yml` : sur push `main` (et `workflow_dispatch`), rejoue `ansible-playbook site.yml --tags app --limit prod` avec `repo_version` = commit fusionné. Socle système (`base`, `deploy_user`, `ssh_hardening`, `docker`) volontairement hors périmètre. `group_vars/all/vault.yml` est désormais commité **chiffré** (ansible-vault) : la chaîne le lit, seul `ANSIBLE_VAULT_PASSWORD` devient un secret Forgejo, avec `DEPLOY_SSH_KEY`. ## Fiabilisation (revue interne) - **known_hosts** amorcé par `ssh-keyscan` avant la connexion Ansible : le conteneur du job est neuf et `ansible.cfg` impose `host_key_checking = True`. - `--vault-password-file` passé aussi à la commande ad hoc « État des piles » (sinon échec de déchiffrement du `vault.yml` commité). - `cancel-in-progress: false` : un `ansible-playbook` en cours ne doit pas être coupé (état serveur à mi-chemin). - Clé SSH écrite avec newline final, secrets passés par `env:`. - `tests/ci/test-deploiement-continu.sh` branché dans `ci.yml` (tourne sur chaque PR) et étendu : déclencheur, périmètre, secrets, concurrence, known_hosts, vault chiffré. ## Docs `docs/runbooks/deploiement.md` : procédure de mise en place (générer la clé CI, jouer `--tags deploy_user` d'abord, créer les 2 secrets). `docs/runbooks/ci.md` : diagnostic, dont `Host key verification failed`. ## À faire avant que ça serve (hors dépôt) 1. Générer la paire CI, ajouter la pubkey à `vault_deploy_authorized_keys`, recommit du vault. 2. `ansible-playbook site.yml --tags deploy_user --limit prod`. 3. Créer `DEPLOY_SSH_KEY` et `ANSIBLE_VAULT_PASSWORD` dans les secrets du dépôt. 4. Déclencher une fois par `workflow_dispatch` et vérifier le journal.
Ajoute .forgejo/workflows/deploy.yml, déclenché uniquement sur push vers
main, qui rejoue ansible-playbook site.yml --tags app avec repo_version
réglé sur le commit fusionné (au lieu de la valeur par défaut develop).
Le socle système (base, deploy_user, ssh_hardening, docker) reste un
geste manuel volontaire.

Commite group_vars/all/vault.yml chiffré par ansible-vault (le
.gitignore l'excluait jusqu'ici) : la chaîne a besoin de le lire, seul
le mot de passe du coffre devient un secret Forgejo.

Ticket #95.
infra: fiabilise le déploiement continu (revue du ticket #95)
All checks were successful
Intégration / Qualité du code Python (pull_request) Successful in 11s
Intégration / Tests unitaires et couverture (pull_request) Successful in 11s
Intégration / Dépendances du tableau de bord (pull_request) Successful in 8s
Intégration / Images épinglées par version (pull_request) Successful in 3s
Intégration / Aucun secret commité (pull_request) Successful in 3s
Intégration / Dépendances Python et inventaire applicatif (pull_request) Successful in 46s
Infra Ansible / Playbooks Ansible valides (pull_request) Successful in 53s
ef6142cb30
- deploy.yml : amorce known_hosts par ssh-keyscan avant qu'Ansible ne se
  connecte (le conteneur du job est neuf, ansible.cfg impose
  host_key_checking = True) ; passe --vault-password-file à la commande ad
  hoc « État des piles » (vault.yml est désormais commité chiffré) ;
  cancel-in-progress: false pour ne pas couper un playbook en cours ;
  workflow_dispatch pour valider la chaîne hors merge ; clé SSH écrite avec
  un newline final et secrets passés par env.
- ci.yml : joue tests/ci/test-deploiement-continu.sh sur chaque PR.
- test-deploiement-continu.sh : couvre les points ci-dessus et vérifie que
  group_vars/all/vault.yml est commité et chiffré.
- docs : procédure de mise en place (clé CI, rôle deploy_user à jouer
  d'abord, secrets Forgejo) et diagnostic « Host key verification failed ».

Ticket #95.
gabriel self-assigned this 2026-09-02 18:06:25 +00:00
lenaic approved these changes 2026-09-02 19:22:48 +00:00
lenaic left a comment

Relu. Très propre : périmètre limité au rôle app, coffre commité chiffré (vérifié), secrets temporaires nettoyés quel que soit le résultat, concurrence sans annulation, et le test statique du workflow est une très bonne idée.

Deux petites demandes, non bloquantes :

  1. runbooks/deploiement.md : un lien pointe sur http://localhost:3000/... → à passer en lien relatif, il est mort hors de ton poste.
  2. Le .gitignore n'excluant plus infra/ansible/**/vault.yml, le contrôle « coffre chiffré » de test-deploiement-continu.sh ne couvre que group_vars/all/vault.yml : étends-le à tout vault.yml/*.vault commité (chaque fichier doit commencer par $ANSIBLE_VAULT), sinon un coffre non chiffré créé ailleurs passerait la chaîne.

Risque vu et accepté : DEPLOY_SSH_KEY en secret du dépôt = tout accès write peut déployer. C'est le but, et tes garde-fous (secrets par référence seulement + relecture obligatoire) le couvrent.

Relu. Très propre : périmètre limité au rôle `app`, coffre commité chiffré (vérifié), secrets temporaires nettoyés quel que soit le résultat, concurrence sans annulation, et le test statique du workflow est une très bonne idée. Deux petites demandes, non bloquantes : 1. `runbooks/deploiement.md` : un lien pointe sur `http://localhost:3000/...` → à passer en lien relatif, il est mort hors de ton poste. 2. Le `.gitignore` n'excluant plus `infra/ansible/**/vault.yml`, le contrôle « coffre chiffré » de `test-deploiement-continu.sh` ne couvre que `group_vars/all/vault.yml` : étends-le à tout `vault.yml`/`*.vault` commité (chaque fichier doit commencer par `$ANSIBLE_VAULT`), sinon un coffre non chiffré créé ailleurs passerait la chaîne. Risque vu et accepté : `DEPLOY_SSH_KEY` en secret du dépôt = tout accès write peut déployer. C'est le but, et tes garde-fous (secrets par référence seulement + relecture obligatoire) le couvrent.
lenaic merged commit 65d3118cb2 into develop 2026-09-02 19:28:25 +00:00
lenaic deleted branch gabriel/95-deploiement-continu 2026-09-02 19:28:25 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
g2/enervision!96
No description provided.