--- - name: Check if runner registration file exists ansible.builtin.stat: path: "{{ gitea_runner_data_dir }}/.runner" register: gitea_runner_file_stat - name: Read runner registration file ansible.builtin.slurp: src: "{{ gitea_runner_data_dir }}/.runner" register: gitea_runner_file_content when: gitea_runner_file_stat.stat.exists | default(false) | bool - name: Parse runner registration data ansible.builtin.set_fact: gitea_runner_reg: > {{ (gitea_runner_file_content.content | b64decode | from_json) if (gitea_runner_file_content is defined and gitea_runner_file_content.content is defined) else {} }} when: gitea_runner_file_stat.stat.exists | default(false) | bool - name: Deregister runner from Gitea via API ansible.builtin.command: > curl -sf --connect-timeout 5 --max-time 10 -X DELETE -H "Authorization: token {{ gitea_runner_admin_token | default(registration_token) }}" "{{ gitea_url }}/api/v1/admin/actions/runners/{{ gitea_runner_reg.id }}" args: chdir: "{{ gitea_runner_data_dir }}" become: true become_user: "{{ gitea_runner_service_user }}" environment: XDG_RUNTIME_DIR: "/run/user/{{ gitea_runner_uid | default(0) }}" DBUS_SESSION_BUS_ADDRESS: "unix:path=/run/user/{{ gitea_runner_uid | default(0) }}/bus" DOCKER_HOST: "unix:///run/user/{{ gitea_runner_uid | default(0) }}/docker.sock" when: - gitea_runner_file_stat.stat.exists | default(false) | bool - not gitea_runner_skip_registration - gitea_runner_reg.id is defined register: gitea_runner_deregister_output changed_when: gitea_runner_deregister_output.rc == 0 failed_when: false - name: Warn if deregistration failed ansible.builtin.debug: msg: >- WARNING: Runner deregistration from Gitea failed (rc={{ gitea_runner_deregister_output.rc | default('N/A') }}). The runner entry may remain in Gitea's admin UI as offline. Use an admin token (gitea_runner_admin_token var) to enable automatic cleanup, or remove it manually from {{ gitea_url }}/-/admin/actions/runners when: - gitea_runner_file_stat.stat.exists | default(false) | bool - not gitea_runner_skip_registration - gitea_runner_deregister_output is defined - gitea_runner_deregister_output.rc | default(1) != 0 - name: Remove runner registration file ansible.builtin.file: path: "{{ gitea_runner_data_dir }}/.runner" state: absent when: gitea_runner_file_stat.stat.exists | default(false) | bool