From 7d02efd9fad5e0c7b1203f8b8f18b0901fccb56c Mon Sep 17 00:00:00 2001 From: Alkatrazz Date: Wed, 10 Jun 2026 13:38:40 +0200 Subject: [PATCH] =?UTF-8?q?feat(hermes-auto-improve):=20passe=20quotidienn?= =?UTF-8?q?e=20compl=C3=A8te=20=C3=A0=2022h=20(tous=20les=20docs)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Ajout systemd timer hermes-auto-improve-daily.timer (22h00, Persistent=true) - Service oneshot : --all puis --daily-pr (TimeoutSec=7200 pour 28 fichiers) - auto-improve.py : flag --all qui bypass MAX_FILES et traite tout admin/ - trigger-server.py : timeout 600s → 7200s pour les runs --all via HTTP La rotation par batch (MAX_FILES=5) reste active pour les triggers n8n à la demande. Le workflow n8n 30-min doit être désactivé manuellement. Co-Authored-By: Claude Sonnet 4.6 --- .../hermes_auto_improve/handlers/main.yml | 4 ++++ .../roles/hermes_auto_improve/tasks/main.yml | 21 +++++++++++++++++++ .../hermes-auto-improve-daily.service.j2 | 14 +++++++++++++ .../hermes-auto-improve-daily.timer.j2 | 10 +++++++++ tools/hermes-auto-improve/auto-improve.py | 16 ++++++++------ tools/hermes-auto-improve/trigger-server.py | 2 +- 6 files changed, 60 insertions(+), 7 deletions(-) create mode 100644 ansible/roles/hermes_auto_improve/templates/hermes-auto-improve-daily.service.j2 create mode 100644 ansible/roles/hermes_auto_improve/templates/hermes-auto-improve-daily.timer.j2 diff --git a/ansible/roles/hermes_auto_improve/handlers/main.yml b/ansible/roles/hermes_auto_improve/handlers/main.yml index e8f1d3a..47ed868 100644 --- a/ansible/roles/hermes_auto_improve/handlers/main.yml +++ b/ansible/roles/hermes_auto_improve/handlers/main.yml @@ -5,6 +5,10 @@ state: restarted daemon_reload: true +- name: Reload systemd daemon + ansible.builtin.systemd: + daemon_reload: true + - name: Reload nftables ansible.builtin.service: name: nftables diff --git a/ansible/roles/hermes_auto_improve/tasks/main.yml b/ansible/roles/hermes_auto_improve/tasks/main.yml index fc458d9..195de05 100644 --- a/ansible/roles/hermes_auto_improve/tasks/main.yml +++ b/ansible/roles/hermes_auto_improve/tasks/main.yml @@ -47,3 +47,24 @@ state: started daemon_reload: true +- name: Deploy daily service (oneshot — analyse complète) + ansible.builtin.template: + src: hermes-auto-improve-daily.service.j2 + dest: /etc/systemd/system/hermes-auto-improve-daily.service + mode: '0644' + notify: Reload systemd daemon + +- name: Deploy daily timer (22h00) + ansible.builtin.template: + src: hermes-auto-improve-daily.timer.j2 + dest: /etc/systemd/system/hermes-auto-improve-daily.timer + mode: '0644' + notify: Reload systemd daemon + +- name: Enable and start daily timer + ansible.builtin.systemd: + name: hermes-auto-improve-daily.timer + enabled: true + state: started + daemon_reload: true + diff --git a/ansible/roles/hermes_auto_improve/templates/hermes-auto-improve-daily.service.j2 b/ansible/roles/hermes_auto_improve/templates/hermes-auto-improve-daily.service.j2 new file mode 100644 index 0000000..5057a7c --- /dev/null +++ b/ansible/roles/hermes_auto_improve/templates/hermes-auto-improve-daily.service.j2 @@ -0,0 +1,14 @@ +[Unit] +Description=Hermes Auto-Improve — Analyse quotidienne complète (tous les docs) +After=network-online.target hermes-agent.service +Wants=network-online.target + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/hermes-auto-improve --all +ExecStartPost=/usr/local/bin/hermes-auto-improve --daily-pr +TimeoutSec=7200 +Environment=HOME=/root +StandardOutput=journal +StandardError=journal +SyslogIdentifier=hermes-auto-improve-daily diff --git a/ansible/roles/hermes_auto_improve/templates/hermes-auto-improve-daily.timer.j2 b/ansible/roles/hermes_auto_improve/templates/hermes-auto-improve-daily.timer.j2 new file mode 100644 index 0000000..377988e --- /dev/null +++ b/ansible/roles/hermes_auto_improve/templates/hermes-auto-improve-daily.timer.j2 @@ -0,0 +1,10 @@ +[Unit] +Description=Hermes Auto-Improve — Timer quotidien 22h00 + +[Timer] +OnCalendar=*-*-* 22:00:00 +Persistent=true +RandomizedDelaySec=300 + +[Install] +WantedBy=timers.target diff --git a/tools/hermes-auto-improve/auto-improve.py b/tools/hermes-auto-improve/auto-improve.py index 6b45a45..2d0502d 100644 --- a/tools/hermes-auto-improve/auto-improve.py +++ b/tools/hermes-auto-improve/auto-improve.py @@ -213,6 +213,7 @@ def main(): parser = argparse.ArgumentParser() parser.add_argument("--daily-pr", action="store_true", help="Créer PR GitHub + résumé journalier") parser.add_argument("--dry-run", action="store_true", help="Analyser sans écrire ni push") + parser.add_argument("--all", action="store_true", help="Analyser tous les fichiers en une passe (ignore MAX_FILES)") parser.add_argument("--subdir", default=None, help="Sous-dossier admin/ (ex: ia, k8s)") args = parser.parse_args() @@ -254,13 +255,16 @@ def main(): if "hermes/builtin" not in str(f) # ne pas analyser ses propres rapports ] - # Rotation : reprend là où il s'est arrêté - todo = [f for f in all_md if str(f) not in state["processed"]] - if not todo: + if args.all: + batch = all_md state["processed"] = [] - todo = all_md - - batch = todo[:MAX_FILES] + else: + # Rotation : reprend là où il s'est arrêté + todo = [f for f in all_md if str(f) not in state["processed"]] + if not todo: + state["processed"] = [] + todo = all_md + batch = todo[:MAX_FILES] results = [] # ── Analyse ─────────────────────────────────────────────────── diff --git a/tools/hermes-auto-improve/trigger-server.py b/tools/hermes-auto-improve/trigger-server.py index 5e7cb0a..8a96a2d 100644 --- a/tools/hermes-auto-improve/trigger-server.py +++ b/tools/hermes-auto-improve/trigger-server.py @@ -63,7 +63,7 @@ def run_script(extra_args: list = None): with open(LOG_FILE, "a") as log: log.write(f"\n=== {datetime.now().isoformat()} — {' '.join(cmd)} ===\n") result = subprocess.run( - cmd, capture_output=True, text=True, timeout=600 + cmd, capture_output=True, text=True, timeout=7200 ) log.write(result.stdout) if result.stderr: