GRM-118: fix: improve runner service stability and deregistration
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user