diff --git a/defaults/main.yml b/defaults/main.yml index dbc4beb..265dc12 100644 --- a/defaults/main.yml +++ b/defaults/main.yml @@ -22,10 +22,10 @@ deploy_gitea_runner_config: labels: [] cache: enabled: true - dir: "{{ deploy_gitea_runner_directory }}/cache" # this HAS TO BE /cache if deploy_gitea_runner_deploy_method is docker + dir: "{{ deploy_gitea_runner_directory }}" # this HAS TO BE /cache if deploy_gitea_runner_deploy_method is docker host: 127.0.0.1 port: 4974 - external_server: + external_server: "" container: network: "" privileged: false @@ -34,4 +34,4 @@ deploy_gitea_runner_config: valid_volumes: [] docker_host: "-" host: - workdir_parent: + workdir_parent: "" diff --git a/defaults/config.yaml b/files/config.yaml similarity index 100% rename from defaults/config.yaml rename to files/config.yaml diff --git a/handlers/main.yml b/handlers/main.yml index 353118f..2750854 100644 --- a/handlers/main.yml +++ b/handlers/main.yml @@ -3,12 +3,14 @@ - name: "Reload systemd file" ansible.builtin.systemd: daemon_reload: true + become: true listen: "systemctl-daemon-reload" - name: "Enable gitea-runner service" ansible.builtin.service: name: gitea-runner enabled: true + become: true listen: "systemctl-enable-gitea-runner" - name: "Start gitea-runner service" @@ -18,3 +20,4 @@ listen: "systemctl-restart-gitea-runner" throttle: 1 when: deploy_gitea_runner_start_service + become: true diff --git a/molecule/default_vagrant/converge.yml b/molecule/default_vagrant/converge.yml new file mode 100644 index 0000000..ea9f7d8 --- /dev/null +++ b/molecule/default_vagrant/converge.yml @@ -0,0 +1,7 @@ +--- +- name: Converge + hosts: all + tasks: + - name: "Include ednxzu.deploy_gitea_runner" + ansible.builtin.include_role: + name: "ednxzu.deploy_gitea_runner" diff --git a/molecule/default_vagrant/group_vars/all.yml b/molecule/default_vagrant/group_vars/all.yml new file mode 100644 index 0000000..8339b8d --- /dev/null +++ b/molecule/default_vagrant/group_vars/all.yml @@ -0,0 +1,42 @@ +--- +# defaults file for deploy_gitea_runner +deploy_gitea_runner_version: latest +deploy_gitea_runner_deploy_method: docker # deployment method, either host or docker. +deploy_gitea_runner_directory: /opt/gitea-actions +deploy_gitea_runner_timezone: "Europe/Paris" +deploy_gitea_runner_register: true +deploy_gitea_runner_start_service: true +deploy_gitea_runner_server_url: https://git.example.com +deploy_gitea_runner_server_token: "" +deploy_gitea_runner_name: gitea-runner +deploy_gitea_runner_config: + log: + level: info + runner: + file: ".runner" # this HAS TO BE .runner if deploy_gitea_runner_deploy_method is docker + capacity: 1 + timeout: 3h + insecure: false + fetch_timeout: 5s + fetch_interval: 15s + labels: + - alpine-latest:docker://node:16-alpine + - alpine-3.18:docker://node:16-alpine3.18 + - alpine-3.17:docker://node:16-alpine3.17 + - alpine-3.16:docker://node:16-alpine3.16 + - ubuntu-latest:docker://ghcr.io/catthehacker/ubuntu:act-latest + - ubuntu-22.04:docker://ghcr.io/catthehacker/ubuntu:act-22.04 + - ubuntu-20.04:docker://ghcr.io/catthehacker/ubuntu:act-20.04 + cache: + enabled: true + dir: "/cache" # this HAS TO BE /cache if deploy_gitea_runner_deploy_method is docker + host: 127.0.0.1 + port: 4974 + container: + network: "" + privileged: false + options: "" + workdir_parent: + valid_volumes: [] + docker_host: "-" + host: {} diff --git a/molecule/default_vagrant/molecule.yml b/molecule/default_vagrant/molecule.yml new file mode 100644 index 0000000..2b02360 --- /dev/null +++ b/molecule/default_vagrant/molecule.yml @@ -0,0 +1,35 @@ +--- +dependency: + name: galaxy + options: + requirements-file: ./requirements.yml +driver: + name: vagrant + provider: + name: libvirt +platforms: + - name: instance + box: generic/${MOLECULE_TEST_OS} + cpus: 4 + memory: 4096 +provisioner: + name: ansible + config_options: + defaults: + remote_tmp: /tmp/.ansible +verifier: + name: ansible +scenario: + name: default_vagrant + test_sequence: + - dependency + - cleanup + - destroy + - syntax + - create + - prepare + - converge + - idempotence + - verify + - cleanup + - destroy diff --git a/molecule/default_vagrant/prepare.yml b/molecule/default_vagrant/prepare.yml new file mode 100644 index 0000000..60391d6 --- /dev/null +++ b/molecule/default_vagrant/prepare.yml @@ -0,0 +1,17 @@ +--- +- name: Prepare + hosts: all + tasks: + - name: "Include ednxzu.install_docker" + ansible.builtin.include_role: + name: ednxzu.install_docker + vars: + install_docker_edition: ce + install_docker_start_service: true + install_docker_compose: false + install_docker_compose_version: latest + install_docker_python_packages: true + install_docker_python_packages_version: latest + install_docker_users: [] + install_docker_daemon_options: + live-restore: true diff --git a/molecule/default_vagrant/requirements.yml b/molecule/default_vagrant/requirements.yml new file mode 100644 index 0000000..e53b0f7 --- /dev/null +++ b/molecule/default_vagrant/requirements.yml @@ -0,0 +1,6 @@ +--- +# requirements file for molecule +roles: + - name: ednxzu.manage_repositories + - name: ednxzu.manage_apt_packages + - name: mhutter.docker-systemd-service diff --git a/molecule/default_vagrant/verify.yml b/molecule/default_vagrant/verify.yml new file mode 100644 index 0000000..60161b1 --- /dev/null +++ b/molecule/default_vagrant/verify.yml @@ -0,0 +1,5 @@ +--- +- name: Verify + hosts: all + gather_facts: true + tasks: diff --git a/tasks/configure.yml b/tasks/configure.yml index d721661..9988646 100644 --- a/tasks/configure.yml +++ b/tasks/configure.yml @@ -1,23 +1,42 @@ --- # task/configure file for deploy_adguard -- name: "Copy gitea-runnner.service file" - ansible.builtin.template: - src: "gitea-runner.service.j2" - dest: "/etc/systemd/system/gitea-runner.service" - owner: root - group: root - mode: '0644' - notify: - - systemctl-daemon-reload +- name: "configure host installation" + when: deploy_gitea_runner_deploy_method == 'host' + block: + - name: "Copy gitea-runnner.service file" + ansible.builtin.template: + src: "gitea-runner.service.j2" + dest: "/etc/systemd/system/gitea-runner.service" + owner: root + group: root + mode: '0644' + become: true + notify: + - systemctl-daemon-reload + + - name: "Copy config.yaml" + ansible.builtin.template: + src: "config.yaml.j2" + dest: "{{ deploy_gitea_host_config_directory }}/config.yaml" + owner: act_runner + group: act_runner + mode: '0600' + when: deploy_gitea_runner_config != {} + become: true + notify: + - systemctl-enable-gitea-runner + - systemctl-restart-gitea-runner + +- name: "configure docker installation" + when: deploy_gitea_runner_deploy_method == 'docker' + block: + - name: "Copy config.yaml" + ansible.builtin.template: + src: "config.yaml.j2" + dest: "{{ deploy_gitea_runner_directory }}/config.yaml" + owner: root + group: root + mode: '0600' + when: deploy_gitea_runner_config != {} + become: true -- name: "Copy config.yaml" - ansible.builtin.template: - src: "config.yaml.j2" - dest: "{{ deploy_gitea_runner_directory }}/config.yaml" - owner: root - group: root - mode: '0600' - when: deploy_gitea_runner_config != {} - notify: - - systemctl-enable-gitea-runner - - systemctl-restart-gitea-runner diff --git a/tasks/install_docker.yml b/tasks/install_docker.yml index 6f2b030..a2f8687 100644 --- a/tasks/install_docker.yml +++ b/tasks/install_docker.yml @@ -1,14 +1,36 @@ --- # task/install_docker file for deploy_gitea_runner -- name: "Configure docker-compose deployment" - block: - - name: "Copy docker-compose.yml template" - ansible.builtin.template: - src: "docker-compose.yml.j2" - dest: "{{ deploy_gitea_runner_directory }}/docker-compose.yml" - owner: root - group: root - mode: '0600' - notify: - - systemctl-enable-gitea-runner - - systemctl-restart-gitea-runner +- name: "Include mhutter.docker-systemd-service" + ansible.builtin.include_role: + name: mhutter.docker-systemd-service + apply: + become: true + vars: + container_image: "gitea/act_runner:{{ deploy_gitea_runner_version }}" + container_name: "{{ deploy_gitea_runner_name }}" + container_docker_pull: true + container_docker_pull_force_source: true + container_host_network: false + container_network: "bridge" + container_ports: "{{ [deploy_gitea_runner_config.cache.port ~ ':' ~ deploy_gitea_runner_config.cache.port] if deploy_gitea_runner_config.cache.enabled else [] }}" + container_volumes: + - "/var/run/docker.sock:/var/run/docker.sock" + - "{{ deploy_gitea_runner_directory }}/config.yaml:/config.yaml" + - "{{ deploy_gitea_runner_directory }}/data:/data" + - "{{ deploy_gitea_runner_directory }}/cache:/cache" + container_env: + TZ: "{{ deploy_gitea_runner_timezone }}" + CONFIG_FILE: /config.yaml + GITEA_INSTANCE_URL: "{{ deploy_gitea_runner_server_url }}" + GITEA_RUNNER_REGISTRATION_TOKEN: "{{ deploy_gitea_runner_server_token }}" + GITEA_RUNNER_NAME: "{{ deploy_gitea_runner_name }}" + service_name: "{{ deploy_gitea_runner_name }}_container" + service_systemd_options: [] + service_systemd_unit_options: + After: docker.service + PartOf: docker.service + Requires: docker.service + service_enabled: true + service_masked: false + service_state: "{{ 'started' if deploy_gitea_runner_start_service else 'stopped'}}" + service_restart: false diff --git a/tasks/install_host.yml b/tasks/install_host.yml index 509b049..5a6d6a2 100644 --- a/tasks/install_host.yml +++ b/tasks/install_host.yml @@ -14,6 +14,7 @@ changed_when: false check_mode: false register: _gitea_runner_is_installed + become: true - name: "Check current gitea_runner version" ansible.builtin.command: "cat {{ deploy_gitea_runner_directory }}/.version" @@ -21,6 +22,7 @@ check_mode: false changed_when: false when: _gitea_runner_is_installed.stat.exists + become: true - name: "Set facts for wanted gitea_runner release" ansible.builtin.set_fact: @@ -35,6 +37,7 @@ and (_gitea_runner_old_release.stdout | length > 0) - name: "Install gitea_runner" + become: true when: deploy_gitea_runner_current_version is not defined or deploy_gitea_runner_wanted_version not in deploy_gitea_runner_current_version block: diff --git a/tasks/main.yml b/tasks/main.yml index d668e36..5cee453 100644 --- a/tasks/main.yml +++ b/tasks/main.yml @@ -3,12 +3,12 @@ - name: "Import prerequisites.yml" ansible.builtin.include_tasks: prerequisites.yml -- name: "Import install.yml" - ansible.builtin.include_tasks: "install_{{ deploy_gitea_runner_deploy_method }}.yml" - - name: "Import configure.yml" ansible.builtin.include_tasks: configure.yml +- name: "Import install.yml" + ansible.builtin.include_tasks: "install_{{ deploy_gitea_runner_deploy_method }}.yml" + - name: "Import register.yml" ansible.builtin.include_tasks: register.yml when: deploy_gitea_runner_register diff --git a/tasks/prerequisites.yml b/tasks/prerequisites.yml index 2ed2c03..843a39f 100644 --- a/tasks/prerequisites.yml +++ b/tasks/prerequisites.yml @@ -1,28 +1,69 @@ --- # task/prerequisites file for deploy_gitea_runner -- name: "Create gitea_actions directory" - ansible.builtin.file: - path: "{{ deploy_gitea_runner_directory }}" - state: directory - owner: root - group: root - mode: '0755' +- name: "Prerequisites for host installation" + when: deploy_gitea_runner_deploy_method == 'host' + block: + - name: "Create group act_runner" + ansible.builtin.group: + name: "{{ deploy_gitea_runner_host_user }}" + state: present + become: true -- name: "Create gitea_actions/data directory" - ansible.builtin.file: - path: "{{ deploy_gitea_runner_directory }}/data" - state: directory - owner: root - group: root - mode: '0755' - when: deploy_gitea_runner_deploy_method == "docker" + - name: "Create user act_runner" + ansible.builtin.user: + name: "{{ deploy_gitea_runner_host_user }}" + group: "{{ deploy_gitea_runner_host_user }}" + home: "{{ deploy_gitea_runner_directory }}" + shell: /bin/false + state: present + become: true -- name: "Create gitea_actions/cache directory" - ansible.builtin.file: - path: "{{ deploy_gitea_runner_config['cache']['dir'] if deploy_gitea_runner_deploy_method == 'host' else deploy_gitea_runner_directory + '/data' }}" - state: directory - owner: root - group: root - mode: '0755' - when: deploy_gitea_runner_config['cache']['enabled'] is defined - and deploy_gitea_runner_config['cache']['enabled'] + - name: "Add act_runner user to docker group" + ansible.builtin.user: + name: "{{ deploy_gitea_runner_host_user }}" + groups: "{{ deploy_gitea_runner_docker_group }}" + append: true + become: true + + - name: "Create runner configuration directory" + ansible.builtin.file: + path: "{{ deploy_gitea_host_config_directory }}" + state: directory + owner: act_runner + group: act_runner + mode: '0755' + become: true + + +- name: "Prerequisites for docker installation" + when: deploy_gitea_runner_deploy_method == 'docker' + block: + - name: "Create gitea_actions directory" + ansible.builtin.file: + path: "{{ deploy_gitea_runner_directory }}" + state: directory + owner: root + group: root + mode: '0755' + become: true + + - name: "Create gitea_actions/data directory" + ansible.builtin.file: + path: "{{ deploy_gitea_runner_directory }}/data" + state: directory + owner: root + group: root + mode: '0755' + when: deploy_gitea_runner_deploy_method == "docker" + become: true + + - name: "Create gitea_actions/cache directory" + ansible.builtin.file: + path: "{{ deploy_gitea_runner_directory }}/cache" + state: directory + owner: root + group: root + mode: '0755' + become: true + when: deploy_gitea_runner_config['cache']['enabled'] is defined + and deploy_gitea_runner_config['cache']['enabled'] diff --git a/tasks/register.yml b/tasks/register.yml index bb7d678..8a33ce6 100644 --- a/tasks/register.yml +++ b/tasks/register.yml @@ -16,9 +16,10 @@ GITEA_URL: "{{ deploy_gitea_runner_server_url }}" GITEA_TOKEN: "{{ deploy_gitea_runner_server_token }}" GITEA_RUNNER_NAME: "{{ deploy_gitea_runner_name }}" - CONFIG_FILE: "{{ deploy_gitea_runner_directory }}/config.yaml" + CONFIG_FILE: "{{ deploy_gitea_host_config_directory }}/config.yaml" changed_when: false register: register_gitea_runner + become: true - name: "Ensure registration is successful" ansible.builtin.assert: diff --git a/templates/docker-compose.yml.j2 b/templates/docker-compose.yml.j2 deleted file mode 100644 index a0ccf34..0000000 --- a/templates/docker-compose.yml.j2 +++ /dev/null @@ -1,51 +0,0 @@ ---- -version: '3.9' - -services: - runner: - image: gitea/act_runner:{{ deploy_gitea_runner_version }} - configs: - - source: config_yaml - target: /config.yaml - environment: - CONFIG_FILE: /config.yaml - GITEA_INSTANCE_URL: "{{ deploy_gitea_runner_server_url }}" - GITEA_RUNNER_REGISTRATION_TOKEN: "{{ deploy_gitea_runner_server_token }}" - GITEA_RUNNER_NAME: "{{ deploy_gitea_runner_name }}" - volumes: - - data:/data -{% if deploy_gitea_runner_config['cache']['enabled'] is defined and deploy_gitea_runner_config['cache']['enabled'] %} - - cache:/cache -{% endif %} - - /var/run/docker.sock:/var/run/docker.sock -{% if deploy_gitea_runner_config['cache']['port'] is defined %} - ports: - - target: {{ deploy_gitea_runner_config['cache']['port'] }} - published: {{ deploy_gitea_runner_config['cache']['port'] }} - protocol: tcp - mode: ingress -{% endif %} - networks: - - internal - -networks: - internal: - driver: bridge - -volumes: - data: - driver_opts: - o: bind - device: {{ deploy_gitea_runner_directory }}/data - type: none -{% if deploy_gitea_runner_config['cache']['enabled'] is defined and deploy_gitea_runner_config['cache']['enabled'] %} - cache: - driver_opts: - o: bind - device: {{ deploy_gitea_runner_directory }}/cache - type: none -{%- endif %} - -configs: - config_yaml: - file: {{ deploy_gitea_runner_directory }}/config.yaml diff --git a/templates/gitea-runner.service.j2 b/templates/gitea-runner.service.j2 index 699a546..d4e1ed4 100644 --- a/templates/gitea-runner.service.j2 +++ b/templates/gitea-runner.service.j2 @@ -1,29 +1,16 @@ -{% if deploy_gitea_runner_deploy_method == 'docker' %} [Unit] -Description=Act runner is a runner for Gitea based on Gitea fork of act. -After=docker.service -Requires=docker.service - -[Service] -Type=oneshot -RemainAfterExit=yes -ExecStart=/bin/bash -c "docker-compose -f {{ deploy_gitea_runner_directory }}/docker-compose.yml up --detach" -ExecStop=/bin/bash -c "docker-compose -f {{ deploy_gitea_runner_directory }}/docker-compose.yml down" - -[Install] +Description=Gitea Actions runner +Documentation=https://gitea.com/gitea/act_runner WantedBy=multi-user.target -{% elif deploy_gitea_runner_deploy_method == 'host' %} -[Unit] -Description=Act runner is a runner for Gitea based on Gitea fork of act. -After=network.target -Requires=network.target [Service] -Type=simple -EnvironmentFile=-{{ deploy_gitea_runner_directory }}/gitea-runner.env +ExecStart={{ deploy_gitea_runner_path }} daemon --config /etc/act_runner/config.yaml +ExecReload=/bin/kill -s HUP $MAINPID WorkingDirectory={{ deploy_gitea_runner_directory }} -ExecStart={{ deploy_gitea_runner_path }} daemon +TimeoutSec=0 +RestartSec=10 +Restart=always +User=act_runner [Install] WantedBy=multi-user.target -{% endif %} \ No newline at end of file diff --git a/vars/main.yml b/vars/main.yml index 400fa4f..9071a33 100644 --- a/vars/main.yml +++ b/vars/main.yml @@ -1,8 +1,11 @@ --- # vars file for deploy_gitea_runner +deploy_gitea_host_config_directory: "/etc/act_runner" deploy_gitea_runner_path: "/usr/local/bin/act-runner" deploy_gitea_runner_gitea_api: https://gitea.com/api/v1/repos/gitea/act_runner deploy_gitea_runner_gitea_url: https://gitea.com/gitea/act_runner +deploy_gitea_runner_host_user: act_runner +deploy_gitea_runner_docker_group: docker deploy_gitea_runner_arch_map: x86_64: 'amd64' aarch64: 'arm64'