mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2026-11-06 02:54:26 +00:00
The compose and host deploy jobs tee the whole deploy stdout into the file ANSIBLE_LOG_PATH names, and both downstream steps parse that stream. Only stdout carries the host-side "matrix-deploy: round N/M ... PASS n" markers, so it is the sole source the per-variant runtime tables can come from. dedicated.sh's cleanup then copied the container-side ansible log onto that same path. docker cp unlinks and recreates the destination, so tee kept writing into an orphaned inode and the visible file became ansible's own log_path output — whose "<ts> p= u= n= LEVEL| " line prefix defeats the anchored recap matchers in logparse.py while the unanchored has_sections substring test still fires. in_roles_recap never flips, every role-time line is skipped, and the step dies with "no profile_roles entries found" although the deploy succeeded. Run 30578244959: 14 of 14 compose+host jobs. Why it looked like a flake: docker cp cannot read a /tmp that is a tmpfs mounted inside the container, and the Debian image enables systemd's tmp.mount while CentOS Stream 10 does not. The copy silently failed on debian (host file survived, jobs green) and landed on centos (host file destroyed). feature/swarm-nfs never had the block; it returned here through merge drift from main, where the copy is still load-bearing because those workflows do not tee. The copy is dropped: stdout is a strict superset of what it provided, and the in-container verifier reads the log inside the container. Alongside it: the swarm workflow's file-exists guard is adopted so an aborted deploy does not paint the summary step red on top; the log_path prefix moves to utils/ansible_log.py and is applied in logparse.py, so an ansible run log parses instead of yielding an empty summary; a lint pins that nothing writes onto ANSIBLE_LOG_PATH again; and the parser regression test now covers the recap headers, not just the role rows. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
18 lines
596 B
Python
18 lines
596 B
Python
"""SPOT for the line prefix Ansible writes into its ``log_path`` file.
|
|
|
|
Every line of the file named by ``ANSIBLE_LOG_PATH`` carries
|
|
``<ts> p=<pid> u=<user> n=<name> <LEVEL>| `` in front of the message that
|
|
also went to stdout. Left unstripped, that prefix defeats every
|
|
line-anchored matcher a reader applies, so a reader that mixes an anchored
|
|
match with an unanchored one silently sees an empty log instead of failing.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import re
|
|
|
|
LOG_PREFIX_RE = re.compile(
|
|
r"^\d{4}-\d\d-\d\d \d\d:\d\d:\d\d,\d+ p=\d+ u=\S+ n=\S+ (?:\w+)?\| ",
|
|
re.MULTILINE,
|
|
)
|