--- # Gitea Runner Management Tasks # Supports both fix (diagnose) and register actions - name: Check if Gitea runner directory exists ansible.builtin.stat: path: "{{ gitea_runner_path }}" register: runner_dir_exists - name: Fail if runner directory does not exist ansible.builtin.fail: msg: "Gitea runner directory not found at {{ gitea_runner_path }}" when: not runner_dir_exists.stat.exists - name: Check if runner container is running ansible.builtin.shell: | docker ps --format json | jq -r 'select(.Names == "{{ gitea_runner_container_name }}") | .State' register: runner_container_state changed_when: false failed_when: false - name: Display runner container status ansible.builtin.debug: msg: | Runner Container Status: {{ runner_container_state.stdout | default('NOT RUNNING') }} when: gitea_runner_show_status | default(true) | bool - name: Check if .runner file exists ansible.builtin.stat: path: "{{ gitea_runner_path }}/data/.runner" register: runner_file_exists - name: Read .runner file content (if exists) ansible.builtin.slurp: src: "{{ gitea_runner_path }}/data/.runner" register: runner_file_content when: runner_file_exists.stat.exists changed_when: false - name: Display .runner file content ansible.builtin.debug: msg: | Runner Registration File Content: {{ runner_file_content.content | b64decode | default('File not found') }} when: - runner_file_exists.stat.exists - gitea_runner_show_status | default(true) | bool - name: Check for GitHub URLs in .runner file ansible.builtin.shell: | grep -i "github.com" "{{ gitea_runner_path }}/data/.runner" 2>/dev/null || echo "NO_GITHUB_URLS" register: github_urls_check when: runner_file_exists.stat.exists changed_when: false failed_when: false - name: Display GitHub URLs check result ansible.builtin.debug: msg: | GitHub URLs in .runner file: {{ github_urls_check.stdout }} when: gitea_runner_show_status | default(true) | bool - name: Check runner logs for incorrect URLs ansible.builtin.shell: | docker logs {{ gitea_runner_container_name }} --tail=100 2>&1 | grep -E "(github.com|instance|repo)" || echo "NO_MATCHES" register: runner_logs_check changed_when: false failed_when: false - name: Display runner logs analysis ansible.builtin.debug: msg: | Runner Logs Analysis (last 100 lines): {{ runner_logs_check.stdout }} when: gitea_runner_show_status | default(true) | bool - name: Check .env file for GITEA_INSTANCE_URL ansible.builtin.shell: | grep "^GITEA_INSTANCE_URL=" "{{ gitea_runner_path }}/.env" 2>/dev/null || echo "NOT_FOUND" register: env_instance_url changed_when: false failed_when: false - name: Display GITEA_INSTANCE_URL from .env ansible.builtin.debug: msg: | GITEA_INSTANCE_URL in .env: {{ env_instance_url.stdout }} when: gitea_runner_show_status | default(true) | bool - name: Check if .env has correct Gitea URL ansible.builtin.set_fact: env_has_correct_url: "{{ env_instance_url.stdout is defined and gitea_instance_url in env_instance_url.stdout }}" - name: Check if runner needs re-registration (for fix action) ansible.builtin.set_fact: runner_needs_reregistration: >- {%- if not runner_file_exists.stat.exists -%} true {%- elif 'github.com' in (github_urls_check.stdout | default('')) -%} true {%- elif not env_has_correct_url -%} true {%- else -%} false {%- endif -%} when: gitea_runner_action | default('fix') == 'fix' - name: Display re-registration decision ansible.builtin.debug: msg: | Runner Re-registration Needed: {{ runner_needs_reregistration | bool }} Reasons: - Runner file exists: {{ runner_file_exists.stat.exists }} - Contains GitHub URLs: {{ 'github.com' in (github_urls_check.stdout | default('')) }} - .env has correct URL: {{ env_has_correct_url | bool }} when: - gitea_runner_action | default('fix') == 'fix' - gitea_runner_show_status | default(true) | bool - name: Fail if registration token is not provided (for register action) ansible.builtin.fail: msg: "gitea_runner_registration_token must be provided via -e 'gitea_runner_registration_token='" when: - gitea_runner_action | default('fix') == 'register' - gitea_runner_registration_token | string | trim == '' - name: Stop runner container before re-registration (fix action) ansible.builtin.shell: | cd {{ gitea_runner_path }} docker compose stop {{ gitea_runner_container_name }} when: - gitea_runner_action | default('fix') == 'fix' - runner_needs_reregistration | bool register: stop_runner changed_when: stop_runner.rc == 0 - name: Stop runner container if running (register action) ansible.builtin.shell: | cd {{ gitea_runner_path }} docker compose stop {{ gitea_runner_container_name }} when: gitea_runner_action | default('fix') == 'register' register: stop_result changed_when: stop_result.rc == 0 failed_when: false - name: Backup existing .runner file ansible.builtin.copy: src: "{{ gitea_runner_path }}/data/.runner" dest: "{{ gitea_runner_path }}/data/.runner.backup.{{ ansible_date_time.epoch }}" remote_src: yes when: - runner_file_exists.stat.exists - (gitea_runner_action | default('fix') == 'register') or (runner_needs_reregistration | bool) ignore_errors: yes - name: Remove existing .runner file ansible.builtin.file: path: "{{ gitea_runner_path }}/data/.runner" state: absent when: - (gitea_runner_action | default('fix') == 'register') or (runner_needs_reregistration | bool) - name: Update .env file with correct GITEA_INSTANCE_URL (fix action) ansible.builtin.lineinfile: path: "{{ gitea_runner_path }}/.env" regexp: '^GITEA_INSTANCE_URL=' line: "GITEA_INSTANCE_URL={{ gitea_instance_url }}" create: yes when: - gitea_runner_action | default('fix') == 'fix' - runner_needs_reregistration | bool register: env_updated - name: Update .env file with correct configuration (register action) ansible.builtin.lineinfile: path: "{{ gitea_runner_path }}/.env" regexp: '^{{ item.key }}=' line: "{{ item.key }}={{ item.value }}" create: yes loop: - { key: 'GITEA_INSTANCE_URL', value: '{{ gitea_instance_url }}' } - { key: 'GITEA_RUNNER_REGISTRATION_TOKEN', value: '{{ gitea_runner_registration_token }}' } - { key: 'GITEA_RUNNER_NAME', value: '{{ gitea_runner_name }}' } - { key: 'GITEA_RUNNER_LABELS', value: '{{ gitea_runner_labels }}' } when: gitea_runner_action | default('fix') == 'register' no_log: true - name: Display instructions for manual re-registration (fix action) ansible.builtin.debug: msg: | ======================================== Runner Re-registration Required ======================================== The runner needs to be re-registered with the correct Gitea instance URL. Steps to re-register: 1. Get a new registration token from Gitea: {{ gitea_instance_url }}/admin/actions/runners Click "Create New Runner" and copy the token 2. Update .env file with the token: GITEA_RUNNER_REGISTRATION_TOKEN= 3. Re-register the runner: cd {{ gitea_runner_path }} ./register.sh Or use Ansible to set the token and register: ansible-playbook -i inventory/production.yml \ playbooks/register-gitea-runner.yml \ -e "gitea_runner_registration_token=" ======================================== when: - gitea_runner_action | default('fix') == 'fix' - runner_needs_reregistration | bool - gitea_runner_show_status | default(true) | bool - name: Start runner services (register action) ansible.builtin.shell: | cd {{ gitea_runner_path }} docker compose up -d when: gitea_runner_action | default('fix') == 'register' register: start_services changed_when: start_services.rc == 0 - name: Wait for services to be ready (register action) ansible.builtin.pause: seconds: "{{ gitea_runner_wait_seconds | default(5) }}" when: gitea_runner_action | default('fix') == 'register' - name: Register runner with correct Gitea instance (register action) ansible.builtin.shell: | cd {{ gitea_runner_path }} docker compose exec -T {{ gitea_runner_container_name }} act_runner register \ --instance "{{ gitea_instance_url }}" \ --token "{{ gitea_runner_registration_token }}" \ --name "{{ gitea_runner_name }}" \ --labels "{{ gitea_runner_labels }}" when: gitea_runner_action | default('fix') == 'register' register: register_result no_log: true changed_when: register_result.rc == 0 - name: Display registration result (register action) ansible.builtin.debug: msg: | Runner Registration Result: {{ register_result.stdout | default('No output') }} when: - gitea_runner_action | default('fix') == 'register' - register_result.rc == 0 - gitea_runner_show_status | default(true) | bool - name: Verify .runner file was created (register action) ansible.builtin.stat: path: "{{ gitea_runner_path }}/data/.runner" register: runner_file_created when: gitea_runner_action | default('fix') == 'register' - name: Check .runner file for correct instance URL (register action) ansible.builtin.shell: | grep -i "{{ gitea_instance_url }}" "{{ gitea_runner_path }}/data/.runner" 2>/dev/null || echo "URL_NOT_FOUND" register: runner_url_check when: - gitea_runner_action | default('fix') == 'register' - runner_file_created.stat.exists changed_when: false - name: Check .runner file for GitHub URLs (register action) ansible.builtin.shell: | grep -i "github.com" "{{ gitea_runner_path }}/data/.runner" 2>/dev/null || echo "NO_GITHUB_URLS" register: runner_github_check when: - gitea_runner_action | default('fix') == 'register' - runner_file_created.stat.exists changed_when: false - name: Display final status (fix action) ansible.builtin.debug: msg: | ======================================== Gitea Runner Configuration Status ======================================== Runner Directory: {{ gitea_runner_path }} Container Running: {{ 'YES' if runner_container_state.stdout == 'running' else 'NO' }} Runner File Exists: {{ 'YES' if runner_file_exists.stat.exists else 'NO' }} Contains GitHub URLs: {{ 'YES' if 'github.com' in (github_urls_check.stdout | default('')) else 'NO' }} .env has correct URL: {{ 'YES' if env_has_correct_url else 'NO' }} Re-registration Needed: {{ 'YES' if runner_needs_reregistration | bool else 'NO' }} ======================================== {% if not runner_needs_reregistration | bool %} ✅ Runner configuration looks correct! {% else %} ⚠️ Runner needs to be re-registered with correct Gitea URL {% endif %} when: - gitea_runner_action | default('fix') == 'fix' - gitea_runner_show_status | default(true) | bool - name: Display final status (register action) ansible.builtin.debug: msg: | ======================================== Gitea Runner Registration Status ======================================== Registration: {{ '✅ SUCCESS' if register_result.rc == 0 else '❌ FAILED' }} Runner File Created: {{ '✅ YES' if runner_file_created.stat.exists else '❌ NO' }} Contains Correct URL: {{ '✅ YES' if 'URL_NOT_FOUND' not in runner_url_check.stdout else '❌ NO' }} Contains GitHub URLs: {{ '❌ YES' if 'NO_GITHUB_URLS' not in runner_github_check.stdout else '✅ NO' }} ======================================== {% if register_result.rc == 0 and runner_file_created.stat.exists %} ✅ Runner registered successfully with {{ gitea_instance_url }}! Check runner status: {{ gitea_instance_url }}/admin/actions/runners {% else %} ❌ Registration failed. Check logs: docker logs {{ gitea_runner_container_name }} {% endif %} when: - gitea_runner_action | default('fix') == 'register' - gitea_runner_show_status | default(true) | bool