Implements the repo-side artifacts of Phase B5 (plans/implementation-plan-A-B.md). Creates 5 .service + .timer pairs under deploy/systemd/ that replicate the periodic tasks registered on Windows by scripts/Register-CIScheduledTasks.ps1: - ci-cleanup-orphans -> python -m ci_orchestrator vm cleanup --max-age-hours 6 (every 6h + boot) - ci-retention-policy -> pwsh Invoke-RetentionPolicy.ps1 (daily 03:00) - ci-watch-disk-space -> python -m ci_orchestrator monitor disk (every 15min) - ci-watch-runner-health -> python -m ci_orchestrator monitor runner (every 15min) - ci-backup-template -> pwsh Backup-CITemplate.ps1 (weekly Sun 02:00, NEW) Includes deploy/systemd/README.md with mapping table, install/test/rollback instructions, and PowerShell Core install note for the two PS-only scripts. Plan checklist updated; B5-closeout.md added. Hardware install steps (systemctl enable + smoke) remain user responsibility on the Linux host.
4.3 KiB
B5 — Closeout (parziale: artefatti repo)
Fase B5 di plans/implementation-plan-A-B.md: conversione scheduled task
Windows in coppie *.service + *.timer systemd su Linux.
Cosa è stato fatto in questa sessione (su host Windows dev)
- Inventario dei 4 task in
scripts/Register-CIScheduledTasks.ps1(cadenze + comandi) - 5 coppie
*.service+*.timercreate indeploy/systemd/:ci-cleanup-orphans.{service,timer}— every 6h + at boot →python -m ci_orchestrator vm cleanup --max-age-hours 6ci-retention-policy.{service,timer}— daily 03:00 + 30min jitter →pwsh Invoke-RetentionPolicy.ps1ci-watch-disk-space.{service,timer}— every 15min →python -m ci_orchestrator monitor diskci-watch-runner-health.{service,timer}— every 15min →python -m ci_orchestrator monitor runnerci-backup-template.{service,timer}— weekly Sun 02:00 + 1h jitter →pwsh Backup-CITemplate.ps1(NEW, non era in Register-CIScheduledTasks.ps1)
deploy/systemd/README.mdcon: tabella mapping, prerequisiti (utente, venv, env file), istruzioni install/test/rollback, nota PowerShell Core su Linux
Note sulle cadenze
Le cadenze del piano (OnCalendar=hourly, *:0/15, ecc.) sono state
adattate per fedeltà semantica all'originale Windows:
| Task | Original Windows | systemd timer scelto |
|---|---|---|
| cleanup-orphans | every 6h + at startup | OnBootSec=2min, OnUnitActiveSec=6h, Persistent |
| retention-policy | daily 03:00 + 30min random delay | OnCalendar=*-*-* 03:00:00, RandomizedDelaySec=30min |
| watch-disk-space | every 15min | OnBootSec=5min, OnUnitActiveSec=15min |
| watch-runner-health | every 15min | OnBootSec=3min, OnUnitActiveSec=15min |
| backup-template | (non in Register-CIScheduledTasks.ps1) | OnCalendar=Sun *-*-* 02:00:00, RandomizedDelaySec=1h |
Persistent=true ovunque per non perdere esecuzioni se la macchina è
spenta al momento del trigger.
Decisione — script che restano in PowerShell
Invoke-RetentionPolicy.ps1 e Backup-CITemplate.ps1 non sono stati
portati a Python (resta scelta documentata in AGENTS.md "Mappatura").
Su Linux quindi le rispettive .service invocano pwsh (PowerShell
Core). Il README documenta l'installazione apt install powershell da
repo Microsoft. Se in futuro si deciderà di portarli a Python (sub-comandi
retention run / template backup), basterà sostituire ExecStart=
nelle due unit senza toccare il timer.
Definizione di "fatto" B5 (dal piano)
| Criterio | Stato |
|---|---|
| Tutti i task periodici come timer systemd attivi | ⏳ unit pronti; install richiede host Linux |
| Trigger manuale di ognuno PASS | ⏳ richiede host Linux |
| Mapping documentato | ✅ deploy/systemd/README.md |
Cosa resta a carico utente (sul nuovo host Linux)
Tutti i passi B1–B4 e B6–B8 sono operazioni hardware/host non eseguibili da questa sessione. Per chiudere B5 una volta sull'host Linux:
# Prerequisito: aver completato B1 (ci-runner user, /opt/ci/venv, /etc/ci/environment)
sudo cp deploy/systemd/ci-*.service deploy/systemd/ci-*.timer /etc/systemd/system/
sudo systemctl daemon-reload
for t in ci-cleanup-orphans ci-retention-policy ci-watch-disk-space \
ci-watch-runner-health ci-backup-template; do
sudo systemctl enable --now "${t}.timer"
done
systemctl list-timers --all 'ci-*'
# Trigger manuale di smoke
sudo systemctl start ci-cleanup-orphans.service
journalctl -u ci-cleanup-orphans.service -n 50 --no-pager
Riferimenti
- Spec systemd timer:
man systemd.timer,man systemd.time - Original PS task scheduler:
scripts/Register-CIScheduledTasks.ps1 - Mapping completo:
deploy/systemd/README.md - Piano:
plans/implementation-plan-A-B.mdsezione B5