From 9dcd7062aa0d18bd67af776b54d1a28c808d8c4b Mon Sep 17 00:00:00 2001 From: Ricky Date: Sat, 25 Jul 2026 22:02:18 +0200 Subject: [PATCH] =?UTF-8?q?fix(ci):=20garde-fou=20de=20d=C3=A9ploiement=20?= =?UTF-8?q?lisible=20depuis=20un=20if,=20et=20lint=20des=20workflows?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Le workflow Deploy était invalide et aucun job ne démarrait : le garde-fou utilisait `if: ${{ secrets.SCW_CONTAINER_ID != '' }}`, or le contexte `secrets` n'est autorisé dans aucun `if`, ni au niveau job ni au niveau step. L'image n'a donc jamais été publiée sur GHCR au merge de la PR #4. Le secret passe désormais par `env` au niveau du job — un des rares endroits où `secrets` est autorisé — et les steps testent `env`, qui est lisible depuis un `if`. Une notice explicite signale le cas sauté plutôt que de laisser un job vide et silencieux. Ajoute actionlint à la CI, qui détecte précisément cette erreur. Sans lui, deploy.yml n'était validé par rien : il ne se déclenche que sur `master`, donc une PR ne pouvait pas en révéler les défauts. Le binaire vient d'une release épinglée et non d'un `curl | bash`, pour ne pas exécuter en CI du code non versionné. Co-Authored-By: Claude Opus 5 (1M context) --- .github/workflows/ci.yml | 15 +++++++++++++++ .github/workflows/deploy.yml | 28 +++++++++++++++++----------- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1abae45..66b0150 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,6 +26,21 @@ jobs: - run: npm test + # deploy.yml ne se déclenche que sur `master` : sans cette étape, une + # erreur de syntaxe ou de contexte dans ce fichier ne serait découverte + # qu'après le merge, workflow en échec et image non publiée. + # + # Binaire téléchargé depuis une release épinglée plutôt qu'un script + # `curl | bash`, pour ne pas exécuter du code non versionné en CI. + - name: Lint des workflows GitHub Actions + env: + ACTIONLINT_VERSION: 1.7.12 + run: | + set -euo pipefail + curl -sSfL "https://github.com/rhysd/actionlint/releases/download/v${ACTIONLINT_VERSION}/actionlint_${ACTIONLINT_VERSION}_linux_amd64.tar.gz" \ + | tar -xz actionlint + ./actionlint -color + # Vérifie que l'image se construit, sans la pousser : une PR qui casse le # Dockerfile doit échouer ici plutôt qu'au merge sur master. - name: Build de contrôle de l'image diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 9629742..24295c4 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -72,15 +72,27 @@ jobs: needs: build runs-on: ubuntu-latest - # Sauté proprement quand les secrets d'infrastructure sont absents, ce qui - # couvre deux cas réels : + # Les étapes ci-dessous sont sautées quand les secrets d'infrastructure sont + # absents, ce qui couvre deux cas réels : # - l'amorçage, où l'image doit exister sur GHCR avant que Terraform # puisse créer le container et donc fournir son ID ; # - les forks de ce dépôt public, qui n'ont pas ces secrets et dont la CI # serait sinon rouge en permanence. - if: ${{ secrets.SCW_CONTAINER_ID != '' }} + # + # Le test se fait sur `env` et non sur `secrets` : le contexte `secrets` + # n'est autorisé dans aucun `if`, ni au niveau job ni au niveau step. Il est + # en revanche autorisé dans `env` au niveau du job, et `env` est lisible + # depuis un `if` de step — d'où ce passage de relais. + env: + SCW_SECRET_KEY: ${{ secrets.SCW_SECRET_KEY }} + CONTAINER_ID: ${{ secrets.SCW_CONTAINER_ID }} + REGION: ${{ secrets.SCW_REGION }} steps: + - name: Vérifier la présence des secrets d'infrastructure + if: env.CONTAINER_ID == '' + run: | + echo "::notice::Secrets d'infrastructure absents, deploiement saute." # Terraform déclare l'image en `:latest` et n'est jamais exécuté ici : ce # dépôt reste indépendant de l'infrastructure. Il lui suffit de demander à # Scaleway de re-tirer le tag. @@ -89,10 +101,7 @@ jobs: # projet Kompas (voir og-bot-discord.tf côté infra). Le token Discord, # lui, n'est jamais exposé à la CI. - name: Déclencher le redéploiement - env: - SCW_SECRET_KEY: ${{ secrets.SCW_SECRET_KEY }} - CONTAINER_ID: ${{ secrets.SCW_CONTAINER_ID }} - REGION: ${{ secrets.SCW_REGION }} + if: env.CONTAINER_ID != '' run: | set -euo pipefail @@ -109,10 +118,7 @@ jobs: # Sans cette étape, la CI serait verte même si le container ne démarre # pas : l'appel de redéploiement est asynchrone. - name: Attendre que le container soit prêt - env: - SCW_SECRET_KEY: ${{ secrets.SCW_SECRET_KEY }} - CONTAINER_ID: ${{ secrets.SCW_CONTAINER_ID }} - REGION: ${{ secrets.SCW_REGION }} + if: env.CONTAINER_ID != '' run: | set -euo pipefail