# 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