Skip to content

🐛 fix(ci): ssh-keyscan avec timeout et retry, il tuait le déploiement - #31

Merged
kbrdn1 merged 1 commit into
devfrom
fix/#26-ssh-keyscan-retry
Aug 14, 2026
Merged

🐛 fix(ci): ssh-keyscan avec timeout et retry, il tuait le déploiement#31
kbrdn1 merged 1 commit into
devfrom
fix/#26-ssh-keyscan-retry

Conversation

@kbrdn1

@kbrdn1 kbrdn1 commented Aug 14, 2026

Copy link
Copy Markdown
Owner

Summary

Le premier déploiement prod de v1.0.0 est tombé sur Setup ssh, cinq secondes exactement 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 (rc=0 sur trois essais depuis une autre machine, après coup).

Related Issue

Closes #26

Type of Change

  • 🐛 Bug fix (non-breaking change which fixes an issue)
  • ✨ New feature (non-breaking change which adds functionality)
  • 💥 Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • 📝 Documentation update
  • ♻️ Refactoring (no functional changes)
  • ⚡️ Performance improvement
  • 🎨 Style/UI update

Scope

  • Homepage
  • Blog
  • Projects
  • UI Components
  • i18n / Translations
  • SEO
  • Configuration

Changes

Dans release.yml et deploy.yml :

  • -T 10 — timeout explicite au lieu des 5 s par défaut
  • 5 tentatives espacées de 5 s
  • [ -s ~/.ssh/known_hosts ] — on vérifie qu'une clé a vraiment été écrite, un rc=0 sans contenu ne suffit pas
  • Échec explicite et lisible si la clé hôte reste inaccessible, au lieu d'un exit 1 muet

Tests

  • YAML des deux workflows validé
  • ssh-keyscan sur la cible rejoué hors CI : rc=0 trois fois — l'échec était bien transitoire
  • Une seule occurrence du motif par fichier, vérifiée après remplacement
  • Le comportement en CI sera vérifié par la reprise de la release v1.0.0

Checklist

  • My code follows the project's coding style
  • I have performed a self-review of my code
  • I have tested my changes locally
  • My changes generate no new warnings
  • I have updated the documentation if needed
  • TypeScript compiles without errors (make typecheck) — sans objet
  • Linting passes (make lint) — sans objet

Additional Notes

Le bloc SSH est dupliqué entre les deux workflows. C'était un choix assumé lors de #19 — neuf inputs à déclarer puis à repasser deux fois coûtaient plus que vingt lignes de YAML. C'est la première fois qu'il faut corriger aux deux endroits ; s'il rebouge, il faudra l'extraire en action composite.

Second incident, distinct et non traité ici : le run deploy.yml du même merge a échoué sur le build, pas sur SSH — @nuxt/fonts a reçu un 404 de fonts.gstatic.com pour une woff2 Inter. Le build Docker dépend donc du réseau Google au moment du build. À traiter à part.

État de la release : le tag v1.0.0 est posé sur main et l'image ghcr.io/kbrdn1/kbrdn.dev:v1.0.0 est publiée — seuls le déploiement prod et la release GitHub manquent. La reprise se fera par workflow_dispatch sur le tag, qui saute le build puisque l'image existe déjà.

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
@kbrdn1
kbrdn1 merged commit 3f183eb into dev Aug 14, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant