Skip to content

Fix(tooling,#24700): la tache du controleur de runners n'affiche plus de console 60 fois par heure (lanceur wscript depuis le generateur) #24706

Open

Description

@jsboige

Part of #24700.

Constat

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

  1. task_xml() émet un lanceur sans fenêtre :
    • <Command>wscript.exe</Command>
    • <Arguments>//B //Nologo "<chemin du lanceur>"</Arguments>
  2. 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.
  3. Le chemin du lanceur est dérivé du profil, jamais codé en dur : sinon le défaut se déplace sur une autre machine.
  4. 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.

Activity

  1. jsboige commented on Nov 4, 2026

    @jsboige
    OwnerAuthor

    [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() é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.

  2. added a commit that references this issue on Nov 4, 2026
  3. added a commit that references this issue on Nov 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions