diff --git a/.gitea/scripts/attach-release-assets.sh b/.gitea/scripts/attach-release-assets.sh index 6ed2561..221b77b 100755 --- a/.gitea/scripts/attach-release-assets.sh +++ b/.gitea/scripts/attach-release-assets.sh @@ -12,6 +12,10 @@ tag="${1:?tag manquant}" release_name="${2:?nom de release manquant}" shift 2 +# Token ABSENT : cas légitime (fork, run sans secret) → on sort proprement. +# Token PRÉSENT mais refusé par l'API : anomalie, on doit ÉCHOUER. Sinon le job reste vert alors +# qu'aucun asset n'est attaché et qu'aucune release n'est créée, ce qui s'est produit avec un token +# expiré : trois workflows « réussis » et zéro fichier publié. if [ -z "${RELEASE_TOKEN:-}" ]; then echo "::notice::RELEASE_TOKEN absent, aucun asset attaché (les artefacts du run restent disponibles)." exit 0 @@ -30,8 +34,9 @@ if [ -z "$release_id" ]; then fi if [ -z "$release_id" ]; then - echo "::warning::impossible de résoudre ou créer la release ${tag}" - exit 0 + echo "::error::impossible de résoudre ou créer la release ${tag} avec le token fourni." + echo "::error::vérifier que le secret porte les portées write:repository et write:package, et qu'il n'a pas expiré." + exit 1 fi for f in "$@"; do @@ -45,7 +50,15 @@ for f in "$@"; do curl -fsSL -X DELETE -H "$auth" "${api}/releases/${release_id}/assets/${existing}" || true fi echo "attaching $name" - curl -fsSL -X POST -H "$auth" -F "attachment=@${f}" "${api}/releases/${release_id}/assets?name=${name}" + if ! curl -fsSL -X POST -H "$auth" -F "attachment=@${f}" "${api}/releases/${release_id}/assets?name=${name}"; then + echo "::error::échec de l'upload de ${name}" + failed=1 + fi done +if [ "${failed:-0}" != "0" ]; then + echo "::error::au moins un asset n'a pas pu être attaché à ${tag}." + exit 1 +fi + echo "Assets attachés à la release ${tag}." diff --git a/.gitea/workflows/desktop-release.yml b/.gitea/workflows/desktop-release.yml index 3907eec..9d05a7a 100644 --- a/.gitea/workflows/desktop-release.yml +++ b/.gitea/workflows/desktop-release.yml @@ -68,12 +68,13 @@ jobs: packages/desktop/release/*.blockmap packages/desktop/release/latest-linux.yml packages/desktop/release/SHA256SUMS-linux.txt - # Best-effort : attache les installeurs (+ latest-linux.yml pour l'auto-update) à la release du - # tag. Réutilise NPM_TOKEN (même token Gitea) : il doit porter write:repository en plus de - # write:package, sinon l'API release renvoie 403 (les artefacts du run restent disponibles). + # Attache les installeurs (+ latest-linux.yml pour l'auto-update) à la release du tag. Réutilise + # NPM_TOKEN (même token Gitea) : il doit porter write:repository en plus de write:package, sinon + # l'API release renvoie 403. Pas de continue-on-error : les artefacts du run sont déjà uploadés à + # l'étape précédente, donc un échec ici ne perd rien et doit être VU (avec un token expiré, la + # release ressortait verte et vide). - name: Attach installers to the tag release if: github.event_name == 'push' - continue-on-error: true env: RELEASE_TOKEN: ${{ secrets.NPM_TOKEN }} run: | @@ -131,9 +132,9 @@ jobs: packages/desktop/release/*.blockmap packages/desktop/release/latest.yml packages/desktop/release/SHA256SUMS-windows.txt + # Pas de continue-on-error : cf. la note du job Linux. - name: Attach installers to the tag release if: github.event_name == 'push' - continue-on-error: true shell: bash env: RELEASE_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.gitea/workflows/vscode-release.yml b/.gitea/workflows/vscode-release.yml index b8891c4..8f75ccc 100644 --- a/.gitea/workflows/vscode-release.yml +++ b/.gitea/workflows/vscode-release.yml @@ -45,31 +45,15 @@ jobs: with: name: vsix path: packages/vscode/*.vsix - # Best-effort : attache le VSIX à la release Gitea du tag (crée la release si absente). - # Réutilise le secret NPM_TOKEN (même token Gitea que la publication du daemon) : ce token doit - # porter write:repository en plus de write:package, sinon l'API release renvoie un 403. Sans - # token, l'étape est ignorée sans faire échouer le job (continue-on-error) ; le VSIX reste - # disponible en artefact. + # Attache le VSIX à la release Gitea du tag (créée si absente), via le script partagé avec la + # release desktop : la logique était dupliquée, avec le même angle mort. Réutilise le secret + # NPM_TOKEN (même token Gitea que la publication du daemon), qui doit porter write:repository en + # plus de write:package. Sans token du tout, le script sort proprement ; avec un token REFUSÉ, il + # échoue, pour que l'anomalie soit visible (le VSIX reste dans les artefacts du run). - name: Attach VSIX to Gitea release - continue-on-error: true env: RELEASE_TOKEN: ${{ secrets.NPM_TOKEN }} run: | - if [ -z "$RELEASE_TOKEN" ]; then - echo "::notice::NPM_TOKEN absent : VSIX disponible en artefact uniquement." - exit 0 - fi - api="${GITHUB_SERVER_URL}/api/v1/repos/${GITHUB_REPOSITORY}" - auth="Authorization: token ${RELEASE_TOKEN}" version=$(node -p "require('./packages/vscode/package.json').version") - vsix="packages/vscode/git-arboretum-${version}.vsix" - # id de release du tag, sinon création - rid=$(curl -fsSL -H "$auth" "${api}/releases/tags/${GITHUB_REF_NAME}" | node -p "JSON.parse(require('fs').readFileSync(0,'utf8')).id || ''" || true) - if [ -z "$rid" ]; then - rid=$(curl -fsSL -X POST -H "$auth" -H 'Content-Type: application/json' \ - -d "{\"tag_name\":\"${GITHUB_REF_NAME}\",\"name\":\"Arboretum VSCode ${version}\"}" \ - "${api}/releases" | node -p "JSON.parse(require('fs').readFileSync(0,'utf8')).id || ''") - fi - curl -fsSL -X POST -H "$auth" -F "attachment=@${vsix}" \ - "${api}/releases/${rid}/assets?name=git-arboretum-${version}.vsix" - echo "VSIX attaché à la release ${GITHUB_REF_NAME}." + bash .gitea/scripts/attach-release-assets.sh "${GITHUB_REF_NAME}" "Arboretum VSCode ${version}" \ + "packages/vscode/git-arboretum-${version}.vsix"