From 0cf572592c80688e8f53a842d93046ecededd23c Mon Sep 17 00:00:00 2001 From: Kylian Bardini Date: Fri, 14 Aug 2026 19:29:53 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20fix(ci):=20ssh-keyscan=20avec=20?= =?UTF-8?q?timeout=20et=20retry,=20il=20tuait=20le=20d=C3=A9ploiement?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Le premier déploiement prod de v1.0.0 est tombé sur `Setup ssh`, cinq secondes après un « ssh key OK » : le timeout par défaut de ssh-keyscan. La commande était la dernière du step, sans timeout explicite ni retry, et son `2>/dev/null` masquait la raison — sous le `bash -e` qu'impose GitHub Actions, son code de retour devenait celui du job. Un keyscan qui n'aboutit pas est pourtant transitoire par nature : la cible répondait avant et répond encore. Timeout porté à 10 s, cinq tentatives espacées, vérification que known_hosts est non vide, et échec explicite avec message si la clé hôte reste inaccessible. Appliqué aux deux workflows : le bloc SSH y est dupliqué. C'était un choix assumé — neuf inputs à déclarer puis repasser coûtaient plus que vingt lignes de YAML — mais c'est la première fois qu'il faut corriger aux deux endroits. S'il rebouge, il faudra l'extraire en action composite. refs #26 --- .github/workflows/deploy.yml | 19 ++++++++++++++++++- .github/workflows/release.yml | 19 ++++++++++++++++++- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index e4abba0..c7642e2 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -137,7 +137,24 @@ jobs: chmod 600 ~/.ssh/id_ed25519 # sanity check sans dévoiler la clé ssh-keygen -y -f ~/.ssh/id_ed25519 >/dev/null && echo "ssh key OK" - ssh-keyscan -H "$VPS_HOST" >> ~/.ssh/known_hosts 2>/dev/null + # ssh-keyscan expire au bout de 5 s par defaut, et son echec en + # derniere commande d'un step lance sous `bash -e` faisait tomber tout + # le deploiement — avec `2>/dev/null` pour masquer la raison. Vecu sur + # le premier deploiement prod de v1.0.0. Timeout explicite, retry, et + # verification qu'on a vraiment une cle avant de continuer. + for i in 1 2 3 4 5; do + if ssh-keyscan -T 10 -H "$VPS_HOST" >> ~/.ssh/known_hosts 2>/dev/null \ + && [ -s ~/.ssh/known_hosts ]; then + echo "known_hosts ok (tentative $i)" + break + fi + echo "ssh-keyscan sans reponse (tentative $i/5)" + if [ "$i" -eq 5 ]; then + echo "::error::ssh-keyscan n'a pas recupere la cle hote apres 5 tentatives" + exit 1 + fi + sleep 5 + done - name: Compute image ref id: img diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 493616b..6991778 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -248,7 +248,24 @@ jobs: sed -i 's/\r$//' ~/.ssh/id_ed25519 chmod 600 ~/.ssh/id_ed25519 ssh-keygen -y -f ~/.ssh/id_ed25519 >/dev/null && echo "ssh key OK" - ssh-keyscan -H "$VPS_HOST" >> ~/.ssh/known_hosts 2>/dev/null + # ssh-keyscan expire au bout de 5 s par defaut, et son echec en + # derniere commande d'un step lance sous `bash -e` faisait tomber tout + # le deploiement — avec `2>/dev/null` pour masquer la raison. Vecu sur + # le premier deploiement prod de v1.0.0. Timeout explicite, retry, et + # verification qu'on a vraiment une cle avant de continuer. + for i in 1 2 3 4 5; do + if ssh-keyscan -T 10 -H "$VPS_HOST" >> ~/.ssh/known_hosts 2>/dev/null \ + && [ -s ~/.ssh/known_hosts ]; then + echo "known_hosts ok (tentative $i)" + break + fi + echo "ssh-keyscan sans reponse (tentative $i/5)" + if [ "$i" -eq 5 ]; then + echo "::error::ssh-keyscan n'a pas recupere la cle hote apres 5 tentatives" + exit 1 + fi + sleep 5 + done - name: Deploy via ssh wrapper env: