The lifecycle scenario runs in a Docker container without systemd
as PID 1. The side_effect and verify playbooks used systemd module
operations unconditionally, causing failures like:
System has not been booted with systemd as init system
Add a systemd availability check (/run/systemd/system stat) to both
playbooks and conditionally skip systemd tasks when running in
environments without systemd (e.g. Molecule Docker containers).
The multi-instance scenario verify playbook expects config files at
/etc/gitea-runner/<name>/config.yaml (binary mode path). Without
runner_mode set, the role defaulted to docker mode, which places the
config in /var/lib/gitea-runner/<name>/config.yaml instead.
Add runner_mode: binary to both converge plays so config placement
matches the verify assertions.
The binary_mode.yml task file did not create gitea_runner_data_dir
when runner registration was skipped (as in molecule tests). This
caused the binary scenario verify playbook to fail because the
data directory assertion expected it to exist.
Add an explicit directory creation step before config creation,
mirroring the docker_mode.yml structure.
Replace include_tasks with include_role + tasks_from in disable, remove,
start, enable, stop, and status playbooks. include_tasks does not load
role defaults, causing undefined variable errors (e.g. gitea_runner_data_dir)
when deregistering or registering runners.
- systemd template for docker mode now uses Type=oneshot + RemainAfterExit=yes
so that systemctl is-active returns active when the container is running.
Previously docker run -d exited immediately, causing systemd to mark the
service as inactive even though the container was still up.
- grm list now tries multiple container name fallbacks for docker mode:
1. gitea-runner-{name} (current naming)
2. gitea-runner-{host} (legacy installs where name defaulted to host)
3. systemctl is-active gitea-runner@{name} (for installs with fixed template)
- All tests pass, 100% coverage, ruff + pyright clean