You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Fix(tooling,#24700): la tache du controleur de runners n'affiche plus de console 60 fois par heure (lanceur wscript depuis le generateur) #24706
runner_controller.py::task_xml() écrit <Command>pwsh.exe</Command> en dur. La tâche qu'il installe est Interactive uniquement et se répète toutes les minutes (PT60S) : tant qu'un utilisateur est connecté, une console pwsh.exe apparaît donc 60 fois par heure sur son écran.
Mesure à l'appui (lane myia-po-2024:CoursIA, 2026-11-04) : la tâche CoursIA-Runner-Controller a été durcie à la main à 18:33:21Z par la lane Maintenance (action remplacée par wscript.exe //B //Nologo <launcher>.vbs) et le durcissement a été annulé à 18:33:22Z — une seconde plus tard — parce que apply_task_install() réinstalle par schtasks /Create /TN … /XML … /F.
C'est donc une propriété du générateur, pas de la tâche : tout durcissement posé côté Planificateur revient au premier task-install --apply. Le corriger à la tâche serait un pansement qui ne survit pas à la réinstallation suivante.
Ce que la PR doit faire
task_xml() émet un lanceur sans fenêtre :
<Command>wscript.exe</Command>
<Arguments>//B //Nologo "<chemin du lanceur>"</Arguments>
Le VBS est écrit par le générateur (apply_task_install), pas posé à la main, avec CreateObject("WScript.Shell").Run "<commande>", 0, False (le 0 = fenêtre masquée) et le même corps que l'ancien -Command : aucune régression fonctionnelle.
Le chemin du lanceur est dérivé du profil, jamais codé en dur : sinon le défaut se déplace sur une autre machine.
Témoin négatif dans les tests : l'XML ne doit plus contenir pwsh.exe comme <Command>, et le VBS doit porter , 0, False ainsi que la commande réelle.
Hors périmètre
Le défaut voisin — schtasks /Change /RL HIGHEST qui suspend une session élevée non interactive — est traité séparément par #24700 / PR #24702, sur les mêmes fonctions. Les deux se complètent sans se recouvrir : celui-ci change ce que la tâche exécute, celui-là avec quel niveau.
Contrainte de mesure
L'échappement XML du corps de script existe déjà (_xml_escape, & et *>>) et un test le fige : le passage au VBS déplace la question sans la supprimer — le chemin du lanceur part dans Arguments et doit être échappé de la même façon.
Les quatre items du body sont couverts : task_xml() émet wscript.exe //B //Nologo "<lanceur>" ; le VBS est écrit par apply_task_install() avec CreateObject("WScript.Shell").Run "…", 0, False et le même corps que l'ancienne action ; le chemin est dérivé du profil (task_launcher_path) ; les témoins négatifs sont dans scripts/tests/test_runner_controller.py (20 tests passent).
La collision de hunks avec #24700 / PR #24702 est annoncée dans le body de la PR : ce n'est pas un conflit d'intention, mais la seconde à merger devra être rebasée.
Activity
jsboige commentedon Nov 4, 2026
[DELIVERED] lane myia-po-2024:CoursIA -- PR #24707 -- paths: scripts/ci/runner_controller.py, scripts/tests/test_runner_controller.py, docs/ci/self-hosted-runners.md
Les quatre items du body sont couverts :
task_xml()émetwscript.exe //B //Nologo "<lanceur>"; le VBS est écrit parapply_task_install()avecCreateObject("WScript.Shell").Run "…", 0, Falseet le même corps que l'ancienne action ; le chemin est dérivé du profil (task_launcher_path) ; les témoins négatifs sont dansscripts/tests/test_runner_controller.py(20 tests passent).La collision de hunks avec #24700 / PR #24702 est annoncée dans le body de la PR : ce n'est pas un conflit d'intention, mais la seconde à merger devra être rebasée.
Fix(tooling,#24706): le lanceur attend la fin du tick et propage son …
Fix(tooling,#24706): la tache du controleur passe par un lanceur wscr…