GRM-19: add molecule tests for template content, deregister, and update workflows

- template-content: Verifies rendered systemd template contains correct
  directives for docker mode (Type=oneshot, RemainAfterExit=yes) and
  prune service/timer content.
- deregister: Installs runner, creates fake .runner file, runs deregister
  tasks, verifies .runner file is removed.
- update: Installs docker and binary runners, runs update tasks, verifies
  image/binary and data directories remain intact after update.

These scenarios bridge gaps where the deregister task file and update
workflows were not covered by existing molecule tests.
This commit is contained in:
Emil Simeonov
2026-06-19 03:24:19 +02:00
parent 5fb282e38e
commit 39ef86647c
11 changed files with 371 additions and 0 deletions
@@ -0,0 +1,11 @@
---
- name: Converge
hosts: all
become: true
vars:
gitea_url: "http://localhost:3000"
registration_token: "fake-token-for-testing"
runner_name: "deregister-test-runner"
skip_runner_registration: true
roles:
- role: gitea-runner
@@ -0,0 +1,40 @@
---
driver:
name: docker
platforms:
- name: ${MOLECULE_PLATFORM_NAME:-ubuntu-2204}
image: ${MOLECULE_PLATFORM_IMAGE:-geerlingguy/docker-ubuntu2204-ansible:latest}
command: ${MOLECULE_PLATFORM_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
side_effect: side_effect.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,28 @@
---
- name: Create fake runner registration file
hosts: all
become: true
vars:
runner_name: "deregister-test-runner"
tasks:
- name: Ensure fake .runner file exists
ansible.builtin.copy:
dest: "/var/lib/gitea-runner/{{ runner_name }}/.runner"
content: |
{"id": 1, "uuid": "test-uuid-1234", "name": "{{ runner_name }}", "address": "http://localhost:3000"}
mode: "0644"
- name: Deregister runner
hosts: all
become: true
vars:
runner_name: "deregister-test-runner"
registration_token: "fake-token-for-testing"
gitea_url: "http://localhost:3000"
runner_mode: "docker"
skip_runner_registration: false
tasks:
- name: Include deregistration tasks
ansible.builtin.include_role:
name: gitea-runner
tasks_from: deregister.yml
@@ -0,0 +1,30 @@
---
- name: Verify
hosts: all
become: true
pre_tasks:
- name: Load role defaults
ansible.builtin.include_vars:
dir: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') }}/defaults"
tasks:
- name: Check registration file was removed
ansible.builtin.stat:
path: "/var/lib/gitea-runner/deregister-test-runner/.runner"
register: runner_file_stat
- name: Assert registration file no longer exists
ansible.builtin.assert:
that:
- not runner_file_stat.stat.exists
fail_msg: "Registration file (.runner) was not removed by deregistration"
- name: Check systemd template still exists
ansible.builtin.stat:
path: "/etc/systemd/system/gitea-runner@.service"
register: service_stat
- name: Assert systemd template still exists after deregister
ansible.builtin.assert:
that:
- service_stat.stat.exists
fail_msg: "Systemd template unit was incorrectly removed"
@@ -0,0 +1,23 @@
---
- name: Converge Docker mode
hosts: all
become: true
vars:
gitea_url: "http://localhost:3000"
registration_token: "fake-token-for-testing"
runner_name: "template-docker-runner"
skip_runner_registration: true
roles:
- role: gitea-runner
- name: Converge Binary mode
hosts: all
become: true
vars:
gitea_url: "http://localhost:3000"
registration_token: "fake-token-for-testing"
runner_name: "template-binary-runner"
runner_mode: "binary"
skip_runner_registration: true
roles:
- role: gitea-runner
@@ -0,0 +1,39 @@
---
driver:
name: docker
platforms:
- name: ${MOLECULE_PLATFORM_NAME:-ubuntu-2204}
image: ${MOLECULE_PLATFORM_IMAGE:-geerlingguy/docker-ubuntu2204-ansible:latest}
command: ${MOLECULE_PLATFORM_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,50 @@
---
- name: Verify
hosts: all
become: true
pre_tasks:
- name: Load role defaults
ansible.builtin.include_vars:
dir: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') }}/defaults"
tasks:
- name: Read rendered Docker systemd template
ansible.builtin.slurp:
src: "/etc/systemd/system/gitea-runner@.service"
register: docker_template
- name: Assert Docker mode template contains expected directives
ansible.builtin.assert:
that:
- "'Type=oneshot' in docker_template.content | b64decode"
- "'RemainAfterExit=yes' in docker_template.content | b64decode"
- "'Requires=docker.service' in docker_template.content | b64decode"
- "'docker run -d' in docker_template.content | b64decode"
- "'ExecStop=/usr/bin/docker stop' in docker_template.content | b64decode"
- "'Restart=on-failure' in docker_template.content | b64decode"
fail_msg: "Docker systemd template is missing expected directives"
- name: Read rendered prune service template
ansible.builtin.slurp:
src: "/etc/systemd/system/docker-prune.service"
register: prune_service
- name: Assert prune service contains expected directives
ansible.builtin.assert:
that:
- "'Type=oneshot' in prune_service.content | b64decode"
- "'docker system prune' in prune_service.content | b64decode"
- "'docker volume prune' in prune_service.content | b64decode"
- "'label=gitea-runner=true' in prune_service.content | b64decode"
fail_msg: "Prune service template is missing expected directives"
- name: Read rendered prune timer template
ansible.builtin.slurp:
src: "/etc/systemd/system/docker-prune.timer"
register: prune_timer
- name: Assert prune timer contains expected directives
ansible.builtin.assert:
that:
- "'OnCalendar=daily' in prune_timer.content | b64decode"
- "'Persistent=true' in prune_timer.content | b64decode"
fail_msg: "Prune timer template is missing expected directives"
@@ -0,0 +1,23 @@
---
- name: Converge Docker mode
hosts: all
become: true
vars:
gitea_url: "http://localhost:3000"
registration_token: "fake-token-for-testing"
runner_name: "update-docker-runner"
skip_runner_registration: true
roles:
- role: gitea-runner
- name: Converge Binary mode
hosts: all
become: true
vars:
gitea_url: "http://localhost:3000"
registration_token: "fake-token-for-testing"
runner_name: "update-binary-runner"
runner_mode: "binary"
skip_runner_registration: true
roles:
- role: gitea-runner
@@ -0,0 +1,40 @@
---
driver:
name: docker
platforms:
- name: ${MOLECULE_PLATFORM_NAME:-ubuntu-2204}
image: ${MOLECULE_PLATFORM_IMAGE:-geerlingguy/docker-ubuntu2204-ansible:latest}
command: ${MOLECULE_PLATFORM_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
side_effect: side_effect.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,24 @@
---
- name: Update Docker mode runner
hosts: all
become: true
vars:
runner_name: "update-docker-runner"
runner_mode: "docker"
tasks:
- name: Include Docker update tasks
ansible.builtin.include_role:
name: gitea-runner
tasks_from: docker_update.yml
- name: Update Binary mode runner
hosts: all
become: true
vars:
runner_name: "update-binary-runner"
runner_mode: "binary"
tasks:
- name: Include binary update tasks
ansible.builtin.include_role:
name: gitea-runner
tasks_from: binary_update.yml
@@ -0,0 +1,63 @@
---
- name: Verify
hosts: all
become: true
pre_tasks:
- name: Load role defaults
ansible.builtin.include_vars:
dir: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') }}/defaults"
tasks:
- name: Check Docker runner image still exists after update
ansible.builtin.command: docker images gitea/runner --format '{{ '{{' }} .Repository {{ '}}' }}:{{ '{{' }} .Tag {{ '}}' }}'
register: image_list
changed_when: false
- name: Assert runner image exists after update
ansible.builtin.assert:
that:
- "'gitea/runner' in image_list.stdout"
fail_msg: "Runner Docker image missing after update"
- name: Check binary runner executable still exists after update
ansible.builtin.stat:
path: "{{ gitea_runner_binary_path }}"
register: binary_stat
- name: Assert binary executable exists after update
ansible.builtin.assert:
that:
- binary_stat.stat.exists
fail_msg: "Binary runner executable missing after update"
- name: Check systemd template still exists
ansible.builtin.stat:
path: "/etc/systemd/system/gitea-runner@.service"
register: service_stat
- name: Assert systemd template still exists after update
ansible.builtin.assert:
that:
- service_stat.stat.exists
fail_msg: "Systemd template unit missing after update"
- name: Check Docker mode data directory still exists
ansible.builtin.stat:
path: "/var/lib/gitea-runner/update-docker-runner"
register: docker_data_stat
- name: Assert Docker mode data directory exists after update
ansible.builtin.assert:
that:
- docker_data_stat.stat.exists
fail_msg: "Docker runner data directory missing after update"
- name: Check Binary mode data directory still exists
ansible.builtin.stat:
path: "/var/lib/gitea-runner/update-binary-runner"
register: binary_data_stat
- name: Assert Binary mode data directory exists after update
ansible.builtin.assert:
that:
- binary_data_stat.stat.exists
fail_msg: "Binary runner data directory missing after update"