GRM-118: fix: improve runner service stability and deregistration

This commit is contained in:
emil
2026-06-29 10:38:32 +00:00
parent 312a706d39
commit df4b7f2a19
5 changed files with 33 additions and 9 deletions
@@ -24,6 +24,11 @@ gitea_runner_prune_label: "gitea-runner=true"
# Service configuration # Service configuration
gitea_runner_service_restart_sec: "5" gitea_runner_service_restart_sec: "5"
# Admin token for runner deregistration via Gitea API.
# If not set, falls back to registration_token (which likely lacks admin scope).
# Set this to a token with admin scope to enable automatic runner cleanup on removal.
gitea_admin_token: ""
# Removal defaults # Removal defaults
remove_systemd_template: true remove_systemd_template: true
remove_runner_user: true remove_runner_user: true
@@ -30,7 +30,10 @@
that: that:
- "'Type=simple' in service_template.content | b64decode" - "'Type=simple' in service_template.content | b64decode"
- "'ExecStart={{ gitea_runner_binary_path }}' in service_template.content | b64decode" - "'ExecStart={{ gitea_runner_binary_path }}' in service_template.content | b64decode"
- "'Restart=on-failure' in service_template.content | b64decode" - "'Restart=always' in service_template.content | b64decode"
- "'Requires=docker.service' in service_template.content | b64decode"
- "'PartOf=docker.service' in service_template.content | b64decode"
- "'StartLimitBurst=10' in service_template.content | b64decode"
- "'DOCKER_HOST=unix:///run/user' in service_template.content | b64decode" - "'DOCKER_HOST=unix:///run/user' in service_template.content | b64decode"
- "'XDG_RUNTIME_DIR=/run/user' in service_template.content | b64decode" - "'XDG_RUNTIME_DIR=/run/user' in service_template.content | b64decode"
fail_msg: "User service template is missing expected directives" fail_msg: "User service template is missing expected directives"
@@ -18,13 +18,11 @@
else {} }} else {} }}
when: runner_file_stat.stat.exists | default(false) | bool when: runner_file_stat.stat.exists | default(false) | bool
- name: Deregister runner with Gitea via CLI - name: Deregister runner from Gitea via API
ansible.builtin.command: > ansible.builtin.command: >
{{ gitea_runner_binary_path }} delete curl -sf --connect-timeout 5 --max-time 10 -X DELETE
--token {{ registration_token }} -H "Authorization: token {{ gitea_admin_token | default(registration_token) }}"
--name {{ runner_name }} "{{ gitea_url }}/api/v1/admin/actions/runners/{{ runner_reg.id }}"
--instance {{ gitea_url }}
--no-interactive
args: args:
chdir: "{{ gitea_runner_data_dir }}" chdir: "{{ gitea_runner_data_dir }}"
become: true become: true
@@ -35,10 +33,24 @@
when: when:
- runner_file_stat.stat.exists | default(false) | bool - runner_file_stat.stat.exists | default(false) | bool
- not skip_runner_registration - not skip_runner_registration
- runner_reg.id is defined
register: deregister_output register: deregister_output
changed_when: deregister_output.rc == 0 changed_when: deregister_output.rc == 0
failed_when: false failed_when: false
- name: Warn if deregistration failed
ansible.builtin.debug:
msg: >-
WARNING: Runner deregistration from Gitea failed (rc={{ deregister_output.rc | default('N/A') }}).
The runner entry may remain in Gitea's admin UI as offline.
Use an admin token (gitea_admin_token var) to enable automatic cleanup,
or remove it manually from {{ gitea_url }}/-/admin/actions/runners
when:
- runner_file_stat.stat.exists | default(false) | bool
- not skip_runner_registration
- deregister_output is defined
- deregister_output.rc | default(1) != 0
- name: Remove runner registration file - name: Remove runner registration file
ansible.builtin.file: ansible.builtin.file:
path: "{{ gitea_runner_data_dir }}/.runner" path: "{{ gitea_runner_data_dir }}/.runner"
@@ -6,4 +6,4 @@ Type=oneshot
Environment=DOCKER_HOST=unix:///run/user/{{ gitea_runner_uid }}/docker.sock Environment=DOCKER_HOST=unix:///run/user/{{ gitea_runner_uid }}/docker.sock
Environment=XDG_RUNTIME_DIR=/run/user/{{ gitea_runner_uid }} Environment=XDG_RUNTIME_DIR=/run/user/{{ gitea_runner_uid }}
ExecStart=/usr/bin/docker system prune -f --filter "label={{ gitea_runner_prune_label }}" --filter "until={{ gitea_runner_prune_until }}" ExecStart=/usr/bin/docker system prune -f --filter "label={{ gitea_runner_prune_label }}" --filter "until={{ gitea_runner_prune_until }}"
ExecStart=/usr/bin/docker volume prune -f --filter "label={{ gitea_runner_prune_label }}" --filter "until={{ gitea_runner_prune_until }}" ExecStart=/usr/bin/docker volume prune -f --filter "label={{ gitea_runner_prune_label }}"
@@ -1,6 +1,8 @@
[Unit] [Unit]
Description=Gitea Actions Runner (rootless) Description=Gitea Actions Runner (rootless)
After=docker.service After=docker.service
Requires=docker.service
PartOf=docker.service
[Service] [Service]
Type=simple Type=simple
@@ -10,8 +12,10 @@ Environment=DOCKER_HOST=unix:///run/user/{{ gitea_runner_uid }}/docker.sock
Environment=XDG_RUNTIME_DIR=/run/user/{{ gitea_runner_uid }} Environment=XDG_RUNTIME_DIR=/run/user/{{ gitea_runner_uid }}
ExecStop=/bin/kill -TERM $MAINPID ExecStop=/bin/kill -TERM $MAINPID
TimeoutStopSec=30 TimeoutStopSec=30
Restart=on-failure Restart=always
RestartSec={{ gitea_runner_service_restart_sec }} RestartSec={{ gitea_runner_service_restart_sec }}
StartLimitIntervalSec=300
StartLimitBurst=10
[Install] [Install]
WantedBy=default.target WantedBy=default.target