Le job était conditionné par la variable de dépôt ENABLE_WINDOWS_BUILD, ce qui ne suffit pas : sans runner labellisé `windows-latest`, la release desktop tombait en erreur au lieu de sauter le job. Il est retiré, ainsi que le téléchargement de son artefact et ses assets dans le canal flottant desktop-latest. Le job complet reste dans l'historique (tag desktop-v0.2.3) et docs/CI_RUNNERS.md décrit ce qu'il faut restaurer une fois un runner Windows enregistré. Le repli reste un `npm run dist:win` manuel attaché à la release.
140 lines
6.7 KiB
YAML
140 lines
6.7 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 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
|