Avec un NPM_TOKEN expiré, les trois workflows de release sont ressortis « réussis » alors qu'aucune release n'avait été créée et qu'aucun asset n'était attaché : l'attache était en continue-on-error et le script sortait en 0 quand l'API refusait le token. Diagnostiquer a demandé de comparer les assets de releases pour comprendre ce que les logs auraient dit tout de suite. Désormais : token ABSENT (fork, run sans secret) reste un cas légitime qui sort proprement, mais un token PRÉSENT et refusé, ou un upload d'asset en échec, fait échouer le job avec un message qui nomme les portées attendues. Les artefacts du run sont uploadés AVANT cette étape, donc un job rouge ne perd aucun binaire. L'attache du VSIX passe au même script partagé : elle dupliquait la logique, avec le même angle mort.
200 lines
8.9 KiB
YAML
200 lines
8.9 KiB
YAML
# Packaging de l'app de bureau Electron, déclenché par un tag desktop-vX.Y.Z (séparé de la release du
|
|
# daemon qui écoute v*, et du VSIX qui écoute vscode-v*).
|
|
#
|
|
# Linux (AppImage + deb) : toujours automatisé.
|
|
# Windows (NSIS + portable) : job dédié, ACTIVÉ par la variable de dépôt ENABLE_WINDOWS_BUILD=true une
|
|
# fois qu'un runner labellisé `windows-latest` est enregistré sur le forge. Procédure complète dans
|
|
# docs/CI_RUNNERS.md. Tant que la variable est absente, le job est sauté et la release Linux part
|
|
# normalement ; le repli reste un build manuel attaché à la release.
|
|
# Le cross-build depuis Linux est IMPOSSIBLE : node-pty ne copie conpty.dll / OpenConsole.exe que si
|
|
# l'hôte de build est Windows, et son tarball ne contient que les prebuilds linux.
|
|
# macOS (dmg + zip) : non automatisé (aucun runner) ; build manuel documenté dans le README desktop.
|
|
#
|
|
# `workflow_dispatch` permet de tester les jobs sans créer de tag (le garde-fou tag == version est
|
|
# alors ignoré, puisqu'il n'y a pas de tag à comparer).
|
|
name: Desktop Release
|
|
|
|
on:
|
|
push:
|
|
tags: ['desktop-v*']
|
|
workflow_dispatch:
|
|
|
|
permissions:
|
|
contents: write
|
|
|
|
env:
|
|
NODE_VERSION: '22.21.1'
|
|
|
|
jobs:
|
|
linux:
|
|
name: Build Linux (AppImage + deb)
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: actions/setup-node@v4
|
|
with:
|
|
node-version: ${{ env.NODE_VERSION }}
|
|
cache: npm
|
|
# Garde-fou : le tag (sans "desktop-v") doit correspondre à la version du paquet desktop.
|
|
- name: Verify tag matches desktop version
|
|
if: github.event_name == 'push'
|
|
run: |
|
|
pkg=$(node -p "require('./packages/desktop/package.json').version")
|
|
tag="${GITHUB_REF_NAME#desktop-v}"
|
|
if [ "$pkg" != "$tag" ]; then
|
|
echo "ERREUR: tag '$tag' != version desktop '$pkg'"
|
|
exit 1
|
|
fi
|
|
echo "OK: tag $tag == version $pkg"
|
|
# Deps racine (build/pack du daemon) puis deps du paquet desktop (hors workspaces racine).
|
|
- run: npm ci
|
|
- name: Install desktop deps
|
|
run: cd packages/desktop && npm ci
|
|
# Build complet : shell + daemon empaqueté + Node standalone + AppImage/deb (electron-builder).
|
|
- name: Build installers
|
|
run: cd packages/desktop && npm run dist:linux
|
|
- name: Compute checksums
|
|
run: |
|
|
cd packages/desktop/release
|
|
sha256sum *.AppImage *.deb > SHA256SUMS-linux.txt
|
|
cat SHA256SUMS-linux.txt
|
|
# Artefacts du run : canal fiable, indépendant de l'API release.
|
|
- uses: actions/upload-artifact@v3
|
|
with:
|
|
name: desktop-linux
|
|
path: |
|
|
packages/desktop/release/*.AppImage
|
|
packages/desktop/release/*.deb
|
|
packages/desktop/release/*.blockmap
|
|
packages/desktop/release/latest-linux.yml
|
|
packages/desktop/release/SHA256SUMS-linux.txt
|
|
# 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'
|
|
env:
|
|
RELEASE_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
run: |
|
|
version=$(node -p "require('./packages/desktop/package.json').version")
|
|
bash .gitea/scripts/attach-release-assets.sh "${GITHUB_REF_NAME}" "Arboretum Desktop ${version}" \
|
|
packages/desktop/release/*.AppImage \
|
|
packages/desktop/release/*.deb \
|
|
packages/desktop/release/*.blockmap \
|
|
packages/desktop/release/latest-linux.yml \
|
|
packages/desktop/release/SHA256SUMS-linux.txt
|
|
|
|
windows:
|
|
name: Build Windows (NSIS + portable)
|
|
# Activé par la variable de dépôt ENABLE_WINDOWS_BUILD (voir docs/CI_RUNNERS.md). Sans runner
|
|
# Windows enregistré, un job non conditionné resterait en attente indéfiniment et bloquerait la
|
|
# release entière.
|
|
if: vars.ENABLE_WINDOWS_BUILD == 'true'
|
|
runs-on: windows-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: actions/setup-node@v4
|
|
with:
|
|
node-version: ${{ env.NODE_VERSION }}
|
|
- name: Verify tag matches desktop version
|
|
if: github.event_name == 'push'
|
|
shell: bash
|
|
run: |
|
|
pkg=$(node -p "require('./packages/desktop/package.json').version")
|
|
tag="${GITHUB_REF_NAME#desktop-v}"
|
|
if [ "$pkg" != "$tag" ]; then
|
|
echo "ERREUR: tag '$tag' != version desktop '$pkg'"
|
|
exit 1
|
|
fi
|
|
echo "OK: tag $tag == version $pkg"
|
|
- run: npm ci
|
|
- name: Install desktop deps
|
|
shell: bash
|
|
run: cd packages/desktop && npm ci
|
|
# `dist:win` sur hôte Windows : c'est le SEUL chemin qui produit un node-pty utilisable (ConPTY,
|
|
# conpty.dll + OpenConsole.exe copiés par le post-install de node-pty).
|
|
- name: Build installers
|
|
shell: bash
|
|
run: cd packages/desktop && npm run dist:win
|
|
- name: Compute checksums
|
|
shell: bash
|
|
run: |
|
|
cd packages/desktop/release
|
|
sha256sum *.exe > SHA256SUMS-windows.txt
|
|
cat SHA256SUMS-windows.txt
|
|
- uses: actions/upload-artifact@v3
|
|
with:
|
|
name: desktop-windows
|
|
path: |
|
|
packages/desktop/release/*.exe
|
|
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'
|
|
shell: bash
|
|
env:
|
|
RELEASE_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
run: |
|
|
version=$(node -p "require('./packages/desktop/package.json').version")
|
|
bash .gitea/scripts/attach-release-assets.sh "${GITHUB_REF_NAME}" "Arboretum Desktop ${version}" \
|
|
packages/desktop/release/*.exe \
|
|
packages/desktop/release/*.blockmap \
|
|
packages/desktop/release/latest.yml \
|
|
packages/desktop/release/SHA256SUMS-windows.txt
|
|
|
|
# Canal d'auto-update : electron-updater interroge une URL FIXE
|
|
# (.../releases/download/desktop-latest, cf. electron-builder.yml). Ce tag flottant doit donc exister
|
|
# et porter les latest*.yml de la dernière version, sinon l'updater reçoit un 404 · c'était le cas
|
|
# jusqu'en 0.1.3, où l'auto-update annoncé ne fonctionnait pour personne.
|
|
latest-channel:
|
|
name: Publish floating desktop-latest release
|
|
if: github.event_name == 'push'
|
|
runs-on: ubuntu-latest
|
|
needs: [linux]
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: actions/setup-node@v4
|
|
with:
|
|
node-version: ${{ env.NODE_VERSION }}
|
|
- uses: actions/download-artifact@v3
|
|
with:
|
|
name: desktop-linux
|
|
path: dl
|
|
# Les artefacts Windows n'existent que si le job correspondant a tourné : téléchargement toléré
|
|
# en échec pour ne jamais bloquer la publication du canal Linux.
|
|
- uses: actions/download-artifact@v3
|
|
continue-on-error: true
|
|
with:
|
|
name: desktop-windows
|
|
path: dl
|
|
# On repart d'une release flottante VIERGE : sinon les assets de la version précédente y
|
|
# restent (mêmes noms de fichiers uniquement remplacés, un ancien numéro de version subsisterait).
|
|
# La recréation est faite par le script suivant, via l'API (Gitea crée le tag au besoin).
|
|
- name: Reset the floating release
|
|
env:
|
|
RELEASE_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
run: |
|
|
if [ -z "$RELEASE_TOKEN" ]; then
|
|
echo "::notice::NPM_TOKEN absent, canal desktop-latest non publié."
|
|
exit 0
|
|
fi
|
|
api="${GITHUB_SERVER_URL}/api/v1/repos/${GITHUB_REPOSITORY}"
|
|
auth="Authorization: token ${RELEASE_TOKEN}"
|
|
old=$(curl -fsSL -H "$auth" "${api}/releases/tags/desktop-latest" | node -p "JSON.parse(require('fs').readFileSync(0,'utf8')).id || ''" || true)
|
|
if [ -n "$old" ]; then
|
|
echo "suppression de l'ancienne release flottante (id ${old})"
|
|
curl -fsSL -X DELETE -H "$auth" "${api}/releases/${old}" || true
|
|
fi
|
|
curl -fsSL -X DELETE -H "$auth" "${api}/tags/desktop-latest" || true
|
|
- name: Attach installers to the floating release
|
|
env:
|
|
RELEASE_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
run: |
|
|
version=$(node -p "require('./packages/desktop/package.json').version")
|
|
bash .gitea/scripts/attach-release-assets.sh desktop-latest "Arboretum Desktop (latest, ${version})" \
|
|
dl/*.AppImage dl/*.deb dl/*.exe dl/*.blockmap dl/latest-linux.yml dl/latest.yml dl/SHA256SUMS-*.txt
|