GRM-4: refactor: consolidate systemd checks and deduplicate role structure

This commit is contained in:
Emil Simeonov
2026-06-18 03:36:19 +02:00
parent b3838eb180
commit 0cea9b9490
13 changed files with 262 additions and 47 deletions
@@ -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
@@ -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
@@ -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'
@@ -6,5 +6,6 @@
gitea_url: "http://localhost:3000" gitea_url: "http://localhost:3000"
registration_token: "fake-token-for-testing" registration_token: "fake-token-for-testing"
runner_name: "molecule-test-runner" runner_name: "molecule-test-runner"
skip_runner_registration: true
roles: roles:
- role: gitea-runner - role: gitea-runner
@@ -5,7 +5,7 @@ driver:
platforms: platforms:
- name: instance - name: instance
image: geerlingguy/docker-ubuntu2204-ansible:latest image: geerlingguy/docker-ubuntu2204-ansible:latest
command: "" command: sleep infinity
volumes: volumes:
- /sys/fs/cgroup:/sys/fs/cgroup:rw - /sys/fs/cgroup:/sys/fs/cgroup:rw
cgroupns_mode: host cgroupns_mode: host
@@ -16,6 +16,24 @@ provisioner:
name: ansible name: ansible
playbooks: playbooks:
converge: converge.yml 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: verifier:
name: ansible name: ansible
@@ -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'
@@ -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
+52 -17
View File
@@ -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) - name: Install Docker (Debian/Ubuntu)
when: ansible_facts['os_family'] == 'Debian' when:
- ansible_facts['os_family'] == 'Debian'
- docker_check.rc != 0
block: 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 - name: Install prerequisite packages
ansible.builtin.apt: ansible.builtin.apt:
name: name:
@@ -13,21 +29,20 @@
update_cache: true update_cache: true
- name: Add Docker GPG key - name: Add Docker GPG key
ansible.builtin.apt_key: ansible.builtin.get_url:
url: https://download.docker.com/linux/{{ ansible_distribution | lower }}/gpg url: https://download.docker.com/linux/{{ ansible_facts['distribution'] | lower }}/gpg
keyring: /etc/apt/keyrings/docker.gpg dest: "{{ docker_gpg_key_path }}"
when: ansible_distribution != 'Ubuntu' or ansible_distribution_major_version | int >= 22 mode: "0644"
- name: Add Docker repository - name: Add Docker repository
ansible.builtin.apt_repository: ansible.builtin.deb822_repository:
repo: >- name: docker
deb [arch={{ ansible_architecture }} types: deb
signed-by=/etc/apt/keyrings/docker.gpg] uris: https://download.docker.com/linux/{{ ansible_facts['distribution'] | lower }}
https://download.docker.com/linux/{{ ansible_distribution | lower }} suites: "{{ ansible_facts['distribution_release'] }}"
{{ ansible_distribution_release }} stable components: stable
filename: docker signed_by: "{{ docker_gpg_key_path }}"
state: present state: present
update_cache: true
- name: Install Docker packages - name: Install Docker packages
ansible.builtin.apt: ansible.builtin.apt:
@@ -37,9 +52,12 @@
- containerd.io - containerd.io
- docker-compose-plugin - docker-compose-plugin
state: present state: present
update_cache: true
- name: Install Docker (Arch Linux) - name: Install Docker (Arch Linux)
when: ansible_facts['os_family'] == 'Archlinux' when:
- ansible_facts['os_family'] == 'Archlinux'
- docker_check.rc != 0
block: block:
- name: Install Docker packages - name: Install Docker packages
community.general.pacman: community.general.pacman:
@@ -49,15 +67,32 @@
state: present state: present
update_cache: true update_cache: true
- name: Ensure Docker service is running - name: Ensure Docker service is running (systemd)
ansible.builtin.systemd: ansible.builtin.systemd:
name: docker name: docker
state: started state: started
enabled: true 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 - name: Add user to docker group
ansible.builtin.user: ansible.builtin.user:
name: "{{ ansible_user | default(ansible_user_id) }}" name: "{{ ansible_user | default(ansible_facts['user_id']) }}"
groups: docker groups: docker
append: true 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
@@ -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
+9 -15
View File
@@ -1,24 +1,18 @@
--- ---
- name: Include OS-specific Docker installation - name: Include systemd availability check
ansible.builtin.include_tasks: docker.yml ansible.builtin.include_tasks: systemd_check.yml
- name: Include act_runner download - name: Install runner (Docker mode)
ansible.builtin.include_tasks: download_act_runner.yml ansible.builtin.include_tasks: docker_mode.yml
when: runner_mode == 'docker'
- name: Include validation - name: Install runner (Binary mode)
ansible.builtin.include_tasks: validate.yml ansible.builtin.include_tasks: binary_mode.yml
when: runner_mode == 'binary'
- 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: Include prune setup - name: Include prune setup
ansible.builtin.include_tasks: prune.yml ansible.builtin.include_tasks: prune.yml
- name: Include integration test - name: Include integration test
ansible.builtin.include_tasks: integration_test.yml ansible.builtin.include_tasks: integration_test.yml
when: not skip_runner_registration
@@ -17,3 +17,4 @@
state: started state: started
enabled: true enabled: true
daemon_reload: true daemon_reload: true
when: systemd_available.stat.exists
+6 -5
View File
@@ -1,16 +1,17 @@
--- ---
- name: Create systemd service file - name: Create systemd service file
ansible.builtin.template: ansible.builtin.template:
src: act-runner.service.j2 src: gitea-runner.service.j2
dest: "/etc/systemd/system/act-runner-{{ runner_name }}.service" dest: "/etc/systemd/system/gitea-runner-{{ runner_name }}.service"
mode: "0644" mode: "0644"
notify: notify:
- Reload systemd - 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: ansible.builtin.systemd:
name: "act-runner-{{ runner_name }}" name: "gitea-runner-{{ runner_name }}"
state: started state: started
enabled: true enabled: true
daemon_reload: true daemon_reload: true
when: systemd_available.stat.exists
@@ -0,0 +1,5 @@
---
- name: Check if systemd is available
ansible.builtin.stat:
path: /run/systemd/system
register: systemd_available