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.
5.9 KiB
Runners Gitea Actions · ajouter Windows (et macOS)
Ce document explique comment activer le build Windows de l'app de bureau dans la CI. Il est écrit
pour être appliqué tel quel sur git.lidge.fr (Gitea 1.25).
Pourquoi un runner Windows est obligatoire
Le cross-build Windows depuis Linux ne peut pas fonctionner, pour deux raisons vérifiées dans
node_modules/@homebridge/node-pty-prebuilt-multiarch :
scripts/check-prebuild.jssort en succès dès que le binaire de l'hôte existe, doncprebuild-installn'est jamais appelé et aucun binairewin32n'est téléchargé (le tarball publié ne contient queprebuilds/linux-*) ;scripts/post-install.jsne copieconpty.dlletOpenConsole.exeque si la plateforme de build est win32. Sans eux, pas de ConPTY, donc aucun terminal dans l'app.
Un build produit sous Wine serait donc installable mais inutilisable. C'est pour cela que
packages/desktop/README.md ne propose plus cette voie.
État actuel
| Plateforme | Runner | Build |
|---|---|---|
| Linux | ubuntu-latest (déjà en place) |
automatique à chaque tag desktop-v* |
| Windows | à enregistrer | job retiré du workflow ; manuel (npm run dist:win sur Windows) |
| macOS | aucun | manuel (npm run dist:mac sur un Mac) |
Le job Windows a d'abord été gardé dans le workflow, conditionné par
if: vars.ENABLE_WINDOWS_BUILD == 'true'. Cela n'a pas suffi : sans runner labellisé
windows-latest, la release entière tombait en erreur au lieu de sauter le job. Il est donc
retiré de .gitea/workflows/desktop-release.yml. Son dernier état complet est dans l'historique
git (tag desktop-v0.2.3) : après avoir enregistré le runner ci-dessous, restaurer ce job, puis
remettre dans latest-channel le download-artifact de desktop-windows ainsi que
dl/*.exe dl/latest.yml dans la liste d'assets du canal flottant.
1. Préparer la machine Windows
Prérequis (Windows 10 1809+ ou Windows 11, x64) :
- Git pour Windows (fournit aussi
bash, utilisé par les étapesshell: bashdu workflow) ; - Node.js 22.21.1 (même version que
NODE_VERSIONdans le workflow) ; - rien d'autre :
node-ptys'installe via des binaires précompilés, aucun compilateur C++ n'est requis.
Vérification rapide dans PowerShell :
node --version # v22.21.1
git --version
bash --version # fourni par Git for Windows
2. Enregistrer le runner
Récupérer un jeton d'enregistrement dans Gitea : Site Administration → Actions → Runners → Create new runner (jeton d'instance), ou au niveau du dépôt : Settings → Actions → Runners.
Puis, dans PowerShell (répertoire dédié, par exemple C:\actions-runner) :
mkdir C:\actions-runner; cd C:\actions-runner
# Binaire act_runner pour Windows (adapter la version à celle de votre Gitea)
Invoke-WebRequest -Uri "https://gitea.com/gitea/act_runner/releases/download/v0.2.13/act_runner-0.2.13-windows-amd64.exe" -OutFile act_runner.exe
.\act_runner.exe register --no-interactive `
--instance https://git.lidge.fr `
--token <JETON_DENREGISTREMENT> `
--name windows-builder `
--labels windows-latest:host
Le label windows-latest:host est essentiel : :host signifie « exécuter directement sur la
machine », sans conteneur (il n'y a pas d'image Docker Windows utilisable ici), et windows-latest est
le nom attendu par runs-on dans le workflow.
Démarrage manuel pour un premier essai :
.\act_runner.exe daemon
3. Exécuter le runner en service
Pour qu'il survive aux redémarrages, créer une tâche planifiée « à l'ouverture de session » (même
principe que arboretum install sur Windows) :
schtasks /Create /TN "GiteaActRunner" /TR "C:\actions-runner\act_runner.exe daemon" `
/SC ONLOGON /RL LIMITED /F
schtasks /Run /TN "GiteaActRunner"
Alternative : NSSM pour un vrai service Windows, si le runner doit tourner sans session ouverte. Attention : un service hors session n'a pas accès au profil utilisateur.
4. Activer le job dans la CI
Dans Gitea, sur le dépôt johanleroy/arboretum : Settings → Actions → Variables → Add Variable
| Nom | Valeur |
|---|---|
ENABLE_WINDOWS_BUILD |
true |
5. Vérifier sans créer de tag
Le workflow accepte workflow_dispatch : Actions → Desktop Release → Run workflow. Dans ce mode, le
garde-fou « tag == version » est ignoré et rien n'est attaché à une release ; les installeurs sont
récupérables dans les artefacts du run (desktop-windows).
Contrôles à faire sur l'installeur produit :
- l'installeur NSIS s'exécute et propose le répertoire d'installation ;
- l'app démarre et affiche l'IDE sans écran de connexion (le token passe par le descripteur 3 ;
c'est le point le plus susceptible de différer sur Windows, cf.
packages/desktop/src/main/daemon.ts) ; - un terminal s'ouvre et répond (ConPTY présent) ;
- le CLI
claudeest trouvé (sinon renseigner son chemin dans Réglages → Claude CLI) ; - « Démarrer le projet » lance bien les commandes sous PowerShell.
6. Signature de code
Aucun binaire n'est signé. SmartScreen affichera « éditeur inconnu » au premier lancement : choisir
« Informations complémentaires » puis « Exécuter quand même ». Pour signer plus tard, ajouter les
secrets CSC_LINK (certificat .pfx encodé en base64) et CSC_KEY_PASSWORD au dépôt : electron-builder
les utilise automatiquement, sans changement de workflow.
Repli si aucun runner n'est possible
Sur une machine Windows, avec le dépôt cloné :
npm ci
cd packages\desktop
npm ci
npm run dist:win
Puis attacher packages\desktop\release\*.exe, latest.yml et les .blockmap à la release
desktop-vX.Y.Z depuis l'interface Gitea. Le canal d'auto-update (desktop-latest) doit recevoir les
mêmes fichiers, sinon les utilisateurs Windows ne verront pas la mise à jour.