From 0cea9b9490c9c68d65a58c34365989dc91e838ea Mon Sep 17 00:00:00 2001 From: Emil Simeonov Date: Thu, 18 Jun 2026 03:18:59 +0200 Subject: [PATCH] GRM-4: refactor: consolidate systemd checks and deduplicate role structure --- .../gitea-runner/molecule/binary/converge.yml | 12 ++++ .../gitea-runner/molecule/binary/molecule.yml | 39 +++++++++++ .../gitea-runner/molecule/common/prepare.yml | 30 ++++++++ .../molecule/default/converge.yml | 1 + .../molecule/default/molecule.yml | 20 +++++- .../gitea-runner/molecule/default/prepare.yml | 9 --- .../roles/gitea-runner/tasks/binary_mode.yml | 26 +++++++ ansible/roles/gitea-runner/tasks/docker.yml | 69 ++++++++++++++----- .../roles/gitea-runner/tasks/docker_mode.yml | 62 +++++++++++++++++ ansible/roles/gitea-runner/tasks/main.yml | 24 +++---- ansible/roles/gitea-runner/tasks/prune.yml | 1 + ansible/roles/gitea-runner/tasks/service.yml | 11 +-- .../gitea-runner/tasks/systemd_check.yml | 5 ++ 13 files changed, 262 insertions(+), 47 deletions(-) create mode 100644 ansible/roles/gitea-runner/molecule/binary/converge.yml create mode 100644 ansible/roles/gitea-runner/molecule/binary/molecule.yml create mode 100644 ansible/roles/gitea-runner/molecule/common/prepare.yml delete mode 100644 ansible/roles/gitea-runner/molecule/default/prepare.yml create mode 100644 ansible/roles/gitea-runner/tasks/binary_mode.yml create mode 100644 ansible/roles/gitea-runner/tasks/docker_mode.yml create mode 100644 ansible/roles/gitea-runner/tasks/systemd_check.yml diff --git a/ansible/roles/gitea-runner/molecule/binary/converge.yml b/ansible/roles/gitea-runner/molecule/binary/converge.yml new file mode 100644 index 0000000..809a573 --- /dev/null +++ b/ansible/roles/gitea-runner/molecule/binary/converge.yml @@ -0,0 +1,12 @@ +--- +- name: Converge + hosts: all + become: true + vars: + gitea_url: "http://localhost:3000" + registration_token: "fake-token-for-testing" + runner_name: "molecule-test-runner" + runner_mode: "binary" + skip_runner_registration: true + roles: + - role: gitea-runner diff --git a/ansible/roles/gitea-runner/molecule/binary/molecule.yml b/ansible/roles/gitea-runner/molecule/binary/molecule.yml new file mode 100644 index 0000000..dee039d --- /dev/null +++ b/ansible/roles/gitea-runner/molecule/binary/molecule.yml @@ -0,0 +1,39 @@ +--- +driver: + name: docker + +platforms: + - name: instance + image: geerlingguy/docker-ubuntu2204-ansible:latest + command: sleep infinity + volumes: + - /sys/fs/cgroup:/sys/fs/cgroup:rw + cgroupns_mode: host + privileged: true + pre_build_image: true + +provisioner: + name: ansible + playbooks: + converge: converge.yml + prepare: ../common/prepare.yml + env: + ANSIBLE_ROLES_PATH: "../../.." + +scenario: + test_sequence: + - dependency + - cleanup + - destroy + - syntax + - create + - prepare + - converge + - idempotence + - side_effect + - verify + - cleanup + - destroy + +verifier: + name: ansible diff --git a/ansible/roles/gitea-runner/molecule/common/prepare.yml b/ansible/roles/gitea-runner/molecule/common/prepare.yml new file mode 100644 index 0000000..3351d7f --- /dev/null +++ b/ansible/roles/gitea-runner/molecule/common/prepare.yml @@ -0,0 +1,30 @@ +--- +- name: Prepare + hosts: all + become: true + tasks: + - name: Update apt cache + ansible.builtin.apt: + update_cache: true + when: ansible_facts['os_family'] == 'Debian' + + - name: Install python3-debian for deb822_repository module + ansible.builtin.apt: + name: python3-debian + state: present + when: ansible_facts['os_family'] == 'Debian' + + - name: Ensure /etc/docker directory exists + ansible.builtin.file: + path: /etc/docker + state: directory + mode: "0755" + when: ansible_facts['os_family'] == 'Debian' + + - name: Configure Docker daemon for vfs storage driver (DinD) + ansible.builtin.copy: + dest: /etc/docker/daemon.json + content: | + {"storage-driver": "vfs"} + mode: "0644" + when: ansible_facts['os_family'] == 'Debian' diff --git a/ansible/roles/gitea-runner/molecule/default/converge.yml b/ansible/roles/gitea-runner/molecule/default/converge.yml index dff36dc..efefd4c 100644 --- a/ansible/roles/gitea-runner/molecule/default/converge.yml +++ b/ansible/roles/gitea-runner/molecule/default/converge.yml @@ -6,5 +6,6 @@ gitea_url: "http://localhost:3000" registration_token: "fake-token-for-testing" runner_name: "molecule-test-runner" + skip_runner_registration: true roles: - role: gitea-runner diff --git a/ansible/roles/gitea-runner/molecule/default/molecule.yml b/ansible/roles/gitea-runner/molecule/default/molecule.yml index a7c4c5c..dee039d 100644 --- a/ansible/roles/gitea-runner/molecule/default/molecule.yml +++ b/ansible/roles/gitea-runner/molecule/default/molecule.yml @@ -5,7 +5,7 @@ driver: platforms: - name: instance image: geerlingguy/docker-ubuntu2204-ansible:latest - command: "" + command: sleep infinity volumes: - /sys/fs/cgroup:/sys/fs/cgroup:rw cgroupns_mode: host @@ -16,6 +16,24 @@ provisioner: name: ansible playbooks: converge: converge.yml + prepare: ../common/prepare.yml + env: + ANSIBLE_ROLES_PATH: "../../.." + +scenario: + test_sequence: + - dependency + - cleanup + - destroy + - syntax + - create + - prepare + - converge + - idempotence + - side_effect + - verify + - cleanup + - destroy verifier: name: ansible diff --git a/ansible/roles/gitea-runner/molecule/default/prepare.yml b/ansible/roles/gitea-runner/molecule/default/prepare.yml deleted file mode 100644 index 2cca80f..0000000 --- a/ansible/roles/gitea-runner/molecule/default/prepare.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- -- name: Prepare - hosts: all - become: true - tasks: - - name: Update apt cache - ansible.builtin.apt: - update_cache: true - when: ansible_facts['os_family'] == 'Debian' diff --git a/ansible/roles/gitea-runner/tasks/binary_mode.yml b/ansible/roles/gitea-runner/tasks/binary_mode.yml new file mode 100644 index 0000000..ef25159 --- /dev/null +++ b/ansible/roles/gitea-runner/tasks/binary_mode.yml @@ -0,0 +1,26 @@ +--- +- name: Include Docker installation + ansible.builtin.include_tasks: docker.yml + +- name: Include gitea_runner download + ansible.builtin.include_tasks: download_gitea_runner.yml + +- name: Include config creation + ansible.builtin.include_tasks: config.yml + +- name: Include validation + ansible.builtin.include_tasks: validate.yml + +- name: Include registration + ansible.builtin.include_tasks: register.yml + when: not skip_runner_registration + +- name: Include service setup + ansible.builtin.include_tasks: service.yml + +- name: Include prune setup + ansible.builtin.include_tasks: prune.yml + +- name: Include integration test + ansible.builtin.include_tasks: integration_test.yml + when: not skip_runner_registration diff --git a/ansible/roles/gitea-runner/tasks/docker.yml b/ansible/roles/gitea-runner/tasks/docker.yml index 8af08b8..a839c5e 100644 --- a/ansible/roles/gitea-runner/tasks/docker.yml +++ b/ansible/roles/gitea-runner/tasks/docker.yml @@ -1,7 +1,23 @@ --- +- name: Check if Docker is already installed + ansible.builtin.command: docker --version + register: docker_check + changed_when: false + failed_when: false + - name: Install Docker (Debian/Ubuntu) - when: ansible_facts['os_family'] == 'Debian' + when: + - ansible_facts['os_family'] == 'Debian' + - docker_check.rc != 0 block: + - name: Remove old Docker apt repository files + ansible.builtin.file: + path: "{{ item }}" + state: absent + loop: + - /etc/apt/sources.list.d/docker.list + - /etc/apt/keyrings/docker.gpg + - name: Install prerequisite packages ansible.builtin.apt: name: @@ -13,21 +29,20 @@ update_cache: true - name: Add Docker GPG key - ansible.builtin.apt_key: - url: https://download.docker.com/linux/{{ ansible_distribution | lower }}/gpg - keyring: /etc/apt/keyrings/docker.gpg - when: ansible_distribution != 'Ubuntu' or ansible_distribution_major_version | int >= 22 + ansible.builtin.get_url: + url: https://download.docker.com/linux/{{ ansible_facts['distribution'] | lower }}/gpg + dest: "{{ docker_gpg_key_path }}" + mode: "0644" - name: Add Docker repository - ansible.builtin.apt_repository: - repo: >- - deb [arch={{ ansible_architecture }} - signed-by=/etc/apt/keyrings/docker.gpg] - https://download.docker.com/linux/{{ ansible_distribution | lower }} - {{ ansible_distribution_release }} stable - filename: docker + ansible.builtin.deb822_repository: + name: docker + types: deb + uris: https://download.docker.com/linux/{{ ansible_facts['distribution'] | lower }} + suites: "{{ ansible_facts['distribution_release'] }}" + components: stable + signed_by: "{{ docker_gpg_key_path }}" state: present - update_cache: true - name: Install Docker packages ansible.builtin.apt: @@ -37,9 +52,12 @@ - containerd.io - docker-compose-plugin state: present + update_cache: true - name: Install Docker (Arch Linux) - when: ansible_facts['os_family'] == 'Archlinux' + when: + - ansible_facts['os_family'] == 'Archlinux' + - docker_check.rc != 0 block: - name: Install Docker packages community.general.pacman: @@ -49,15 +67,32 @@ state: present update_cache: true -- name: Ensure Docker service is running +- name: Ensure Docker service is running (systemd) ansible.builtin.systemd: name: docker state: started enabled: true + when: systemd_available.stat.exists + +- name: Start Docker daemon manually (no systemd) + ansible.builtin.shell: nohup dockerd > /var/log/dockerd.log 2>&1 & + when: + - not systemd_available.stat.exists + - docker_check.rc != 0 + changed_when: true + +- name: Wait for Docker daemon to be ready + ansible.builtin.command: docker version + register: docker_ready + until: docker_ready.rc == 0 + retries: 10 + delay: 2 + changed_when: false + when: not systemd_available.stat.exists - name: Add user to docker group ansible.builtin.user: - name: "{{ ansible_user | default(ansible_user_id) }}" + name: "{{ ansible_user | default(ansible_facts['user_id']) }}" groups: docker append: true - when: ansible_user is defined or ansible_user_id is defined + when: ansible_user is defined or ansible_facts['user_id'] is defined diff --git a/ansible/roles/gitea-runner/tasks/docker_mode.yml b/ansible/roles/gitea-runner/tasks/docker_mode.yml new file mode 100644 index 0000000..73ef0ad --- /dev/null +++ b/ansible/roles/gitea-runner/tasks/docker_mode.yml @@ -0,0 +1,62 @@ +--- +- name: Include Docker installation + ansible.builtin.include_tasks: docker.yml + +- name: Ensure runner data directory exists + ansible.builtin.file: + path: "{{ gitea_runner_data_dir }}" + state: directory + mode: "0755" + +- name: Create gitea_runner config file in data directory + ansible.builtin.template: + src: gitea-runner-config.toml.j2 + dest: "{{ gitea_runner_data_dir }}/config.toml" + mode: "0644" + +- name: Pull gitea_runner image + ansible.builtin.command: docker pull {{ gitea_runner_docker_image }}:{{ gitea_runner_version | regex_replace('^v', '') }} + changed_when: "'Downloaded newer image' in pull_result.stdout or 'Status: Downloaded' in pull_result.stdout" + register: pull_result + +- name: Check if runner is already registered + ansible.builtin.stat: + path: "{{ gitea_runner_data_dir }}/.runner" + register: runner_registered + +- name: Register runner with Gitea via Docker + ansible.builtin.command: > + docker run --rm + -v {{ gitea_runner_data_dir }}:/data + {{ gitea_runner_docker_image }}:{{ gitea_runner_version | regex_replace('^v', '') }} register + --token {{ registration_token }} + --name {{ runner_name }} + --instance {{ gitea_url }} + --labels {{ runner_labels }} + --no-interactive + when: + - not runner_registered.stat.exists + - not skip_runner_registration + register: register_output + changed_when: "'already exists' not in register_output.stdout | default('')" + +- name: Check if gitea_runner container exists + ansible.builtin.command: docker inspect -f '{{ '{{' }} .State.Running {{ '}}' }}' gitea-runner-{{ runner_name }} + register: container_check + changed_when: false + failed_when: container_check.rc != 0 and 'no such object' not in container_check.stderr + +- name: Run gitea_runner daemon container + ansible.builtin.command: > + docker run -d + --name gitea-runner-{{ runner_name }} + --restart unless-stopped + -v /var/run/docker.sock:/var/run/docker.sock + -v {{ gitea_runner_data_dir }}:/data + {{ gitea_runner_docker_image }}:{{ gitea_runner_version | regex_replace('^v', '') }} daemon + --config /data/config.toml + when: + - container_check.rc != 0 + - not skip_runner_registration + register: docker_run + changed_when: docker_run.rc == 0 diff --git a/ansible/roles/gitea-runner/tasks/main.yml b/ansible/roles/gitea-runner/tasks/main.yml index c097e98..8774a57 100644 --- a/ansible/roles/gitea-runner/tasks/main.yml +++ b/ansible/roles/gitea-runner/tasks/main.yml @@ -1,24 +1,18 @@ --- -- name: Include OS-specific Docker installation - ansible.builtin.include_tasks: docker.yml +- name: Include systemd availability check + ansible.builtin.include_tasks: systemd_check.yml -- name: Include act_runner download - ansible.builtin.include_tasks: download_act_runner.yml +- name: Install runner (Docker mode) + ansible.builtin.include_tasks: docker_mode.yml + when: runner_mode == 'docker' -- name: Include validation - ansible.builtin.include_tasks: validate.yml - -- name: Include config creation - ansible.builtin.include_tasks: config.yml - -- name: Include registration - ansible.builtin.include_tasks: register.yml - -- name: Include service setup - ansible.builtin.include_tasks: service.yml +- name: Install runner (Binary mode) + ansible.builtin.include_tasks: binary_mode.yml + when: runner_mode == 'binary' - name: Include prune setup ansible.builtin.include_tasks: prune.yml - name: Include integration test ansible.builtin.include_tasks: integration_test.yml + when: not skip_runner_registration diff --git a/ansible/roles/gitea-runner/tasks/prune.yml b/ansible/roles/gitea-runner/tasks/prune.yml index 5ff07bc..a80c54b 100644 --- a/ansible/roles/gitea-runner/tasks/prune.yml +++ b/ansible/roles/gitea-runner/tasks/prune.yml @@ -17,3 +17,4 @@ state: started enabled: true daemon_reload: true + when: systemd_available.stat.exists diff --git a/ansible/roles/gitea-runner/tasks/service.yml b/ansible/roles/gitea-runner/tasks/service.yml index b98468e..9a158ba 100644 --- a/ansible/roles/gitea-runner/tasks/service.yml +++ b/ansible/roles/gitea-runner/tasks/service.yml @@ -1,16 +1,17 @@ --- - name: Create systemd service file ansible.builtin.template: - src: act-runner.service.j2 - dest: "/etc/systemd/system/act-runner-{{ runner_name }}.service" + src: gitea-runner.service.j2 + dest: "/etc/systemd/system/gitea-runner-{{ runner_name }}.service" mode: "0644" notify: - Reload systemd - - Restart act-runner + - Restart gitea-runner -- name: Enable and start act-runner service +- name: Enable and start gitea-runner service ansible.builtin.systemd: - name: "act-runner-{{ runner_name }}" + name: "gitea-runner-{{ runner_name }}" state: started enabled: true daemon_reload: true + when: systemd_available.stat.exists diff --git a/ansible/roles/gitea-runner/tasks/systemd_check.yml b/ansible/roles/gitea-runner/tasks/systemd_check.yml new file mode 100644 index 0000000..4f7044a --- /dev/null +++ b/ansible/roles/gitea-runner/tasks/systemd_check.yml @@ -0,0 +1,5 @@ +--- +- name: Check if systemd is available + ansible.builtin.stat: + path: /run/systemd/system + register: systemd_available