# 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 RETIRÉ tant qu'aucun runner `windows-latest` n'est enregistré sur le # forge. Un job conditionné par une variable de dépôt ne suffisait pas : la release entière tombait # en erreur. Le repli est un build manuel attaché à la release. Pour le rétablir : enregistrer un # runner (docs/CI_RUNNERS.md) puis restaurer le job depuis l'historique git (tag desktop-v0.2.3). # 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 # Le job Windows (NSIS + portable) est RETIRÉ pour le moment : aucun runner Windows n'est # enregistré sur ce Gitea, et `runs-on: windows-latest` fait échouer la release entière au lieu # d'être simplement ignoré. Le job complet reste dans l'historique git (dernier état : tag # desktop-v0.2.3) et la procédure d'enregistrement d'un runner est dans docs/CI_RUNNERS.md : le # rétablir revient à restaurer ce job, puis à réactiver le téléchargement de son artefact et ses # assets dans le canal flottant ci-dessous. # 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 # 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/*.blockmap dl/latest-linux.yml dl/SHA256SUMS-*.txt