diff --git a/ansible/playbooks/09_gitea_setup.yml b/ansible/playbooks/09_gitea_setup.yml new file mode 100644 index 0000000..9b158fe --- /dev/null +++ b/ansible/playbooks/09_gitea_setup.yml @@ -0,0 +1,152 @@ +--- +- name: Deploy Gitea and Act Runner on Utility VM + hosts: utility.lab.local + gather_facts: true + become: false + + vars: + gitea_container_dir: "/home/{{ admin_user }}/containers/gitea" + runner_dir: "/home/{{ admin_user }}/containers/act_runner" + + tasks: + - name: Create Gitea persistent volume directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + loop: + - "{{ gitea_container_dir }}/data" + - "{{ gitea_container_dir }}/config" + + - name: Deploy pre-seeded Gitea Configuration + become: true + ansible.builtin.template: + src: "./templates/app.ini.j2" + dest: "{{ gitea_container_dir }}/config/app.ini" + owner: 100999 + group: 100999 + mode: "0644" + + - name: Enable systemd lingering for the administrator user + become: true + ansible.builtin.command: + cmd: "loginctl enable-linger {{ admin_user }}" + changed_when: false + + - name: Deploy Gitea Systemd Service + become: true + ansible.builtin.template: + src: "./templates/gitea.service.j2" + dest: "/etc/systemd/system/gitea.service" + mode: "0644" + + - name: Enable and start Gitea system service + become: true + ansible.builtin.systemd_service: + name: gitea.service + state: restarted + enabled: true + daemon_reload: true + + - name: Wait for Gitea to become responsive + ansible.builtin.wait_for: + port: 3000 + delay: 2 + timeout: 60 + + + - name: Install build tool dependencies + become: true + ansible.builtin.package: + name: + - unzip + - git + - python3-pip + state: present + + - name: Install Ansible-Lint via pip + become: true + ansible.builtin.pip: + name: ansible-lint + state: present + extra_args: --break-system-packages + + - name: Download and install Terraform CLI + become: true + ansible.builtin.unarchive: + src: "https://releases.hashicorp.com/terraform/1.8.5/terraform_1.8.5_linux_amd64.zip" + dest: "/usr/local/bin" + remote_src: true + mode: "0755" + + - name: Download and install TFLint + become: true + ansible.builtin.unarchive: + src: "https://github.com/terraform-linters/tflint/releases/download/v0.50.1/tflint_linux_amd64.zip" + dest: "/usr/local/bin" + remote_src: true + mode: "0755" + + + - name: Create Gitea Runner directories + become: true + ansible.builtin.file: + path: "{{ item.path }}" + state: directory + owner: "{{ item.owner }}" + group: "{{ item.owner }}" + mode: "0755" + loop: + - { path: "{{ runner_dir }}", owner: "{{ admin_user }}" } + - { path: "/etc/act_runner", owner: "root" } + + - name: Deploy Gitea Runner config file + become: true + ansible.builtin.template: + src: "./templates/act_runner_config.yaml.j2" + dest: "/etc/act_runner/config.yaml" + mode: "0644" + + - name: Download Gitea Runner binary + become: true + ansible.builtin.get_url: + url: "https://dl.gitea.com/gitea-runner/2.1.0/gitea-runner-2.1.0-linux-amd64" + dest: "/usr/local/bin/gitea-runner" + mode: "0755" + + - name: Generate Gitea runner registration token + ansible.builtin.command: + cmd: "podman exec -w / -u git gitea gitea --config /etc/gitea/app.ini actions generate-runner-token" + register: gitea_runner_token_cmd + changed_when: false + + - name: Check if Gitea Runner is already registered + ansible.builtin.stat: + path: "{{ runner_dir }}/.runner" + register: runner_state_file + + - name: Register Gitea Runner with Gitea + ansible.builtin.command: + cmd: > + /usr/local/bin/gitea-runner register + --instance http://localhost:3000 + --token {{ gitea_runner_token_cmd.stdout | trim }} + --name utility-runner + --labels "linux_amd64:host,self-hosted:host" + --no-interactive + chdir: "{{ runner_dir }}" + when: not runner_state_file.stat.exists + + - name: Deploy Gitea Runner Systemd Service + become: true + ansible.builtin.template: + src: "./templates/act_runner.service.j2" + dest: "/etc/systemd/system/act_runner.service" + mode: "0644" + + - name: Enable and start Gitea Runner service + become: true + ansible.builtin.systemd_service: + name: act_runner.service + state: restarted + enabled: true + daemon_reload: true diff --git a/ansible/playbooks/templates/act_runner.service.j2 b/ansible/playbooks/templates/act_runner.service.j2 new file mode 100644 index 0000000..56d095e --- /dev/null +++ b/ansible/playbooks/templates/act_runner.service.j2 @@ -0,0 +1,16 @@ +[Unit] +Description=Gitea Act Runner +After=network-online.target gitea.service +Wants=gitea.service + +[Service] +Type=simple +User={{ admin_user }} +Group={{ admin_user }} +WorkingDirectory=/home/{{ admin_user }}/containers/act_runner +ExecStart=/usr/local/bin/gitea-runner daemon --config /etc/act_runner/config.yaml +Restart=always +RestartSec=10 + +[Install] +WantedBy=multi-user.target diff --git a/ansible/playbooks/templates/act_runner_config.yaml.j2 b/ansible/playbooks/templates/act_runner_config.yaml.j2 new file mode 100644 index 0000000..7b8f01b --- /dev/null +++ b/ansible/playbooks/templates/act_runner_config.yaml.j2 @@ -0,0 +1,14 @@ +log: + level: info + +runner: + file: .runner + capacity: 2 + envs: {} + timeout: 3h + +container: + network: "" + +host: + enable: true diff --git a/ansible/playbooks/templates/app.ini.j2 b/ansible/playbooks/templates/app.ini.j2 new file mode 100644 index 0000000..b0bbaff --- /dev/null +++ b/ansible/playbooks/templates/app.ini.j2 @@ -0,0 +1,25 @@ +APP_NAME = Gitea: Git with a cup of tea +RUN_USER = git +RUN_MODE = prod + +[database] +DB_TYPE = sqlite3 +PATH = /var/lib/gitea/data/gitea.db + +[repository] +ROOT = /var/lib/gitea/git/repositories + +[server] +SSH_DOMAIN = 172.30.1.80 +HTTP_PORT = 3000 +ROOT_URL = http://172.30.1.80:3000/ +DISABLE_SSH = false +SSH_PORT = 2222 +LFS_START_SERVER = true + +[security] +INSTALL_LOCK = true +SECRET_KEY = {{ gitea_secret_key | default('GiteaSecretKeyChangeMeDefault123') }} + +[service] +DISABLE_REGISTRATION = false diff --git a/ansible/playbooks/templates/gitea.service.j2 b/ansible/playbooks/templates/gitea.service.j2 new file mode 100644 index 0000000..48f9b5a --- /dev/null +++ b/ansible/playbooks/templates/gitea.service.j2 @@ -0,0 +1,27 @@ +[Unit] +Description=Gitea Git Server +After=network-online.target +Wants=network-online.target + +[Service] +Type=simple +User={{ admin_user }} +Group={{ admin_user }} +WorkingDirectory=/home/{{ admin_user }}/containers/gitea +ExecStartPre=-/usr/bin/podman rm -f gitea +ExecStart=/usr/bin/podman run --name gitea --rm \ + -p 3000:3000 \ + -p 2222:22 \ + -v /home/{{ admin_user }}/containers/gitea/data:/var/lib/gitea:z,U \ + -v /home/{{ admin_user }}/containers/gitea/config:/etc/gitea:z,U \ + -e GITEA__security__INSTALL_LOCK=true \ + -e GITEA__database__DB_TYPE=sqlite3 \ + -e GITEA__database__PATH=/var/lib/gitea/data/gitea.db \ + docker.io/gitea/gitea:1.22-rootless +ExecStop=/usr/bin/podman -t 10 gitea +ExecStopPost=-/usr/bin/podman rm -f gitea +Restart=always +RestartSec=10 + +[Install] +WantedBy=multi-user.target diff --git a/ansible/site.yml b/ansible/site.yml index 1a94cf3..f26ad34 100644 --- a/ansible/site.yml +++ b/ansible/site.yml @@ -26,3 +26,7 @@ - name: Grafana/Prometheus Setup import_playbook: ./playbooks/07_observability.yml tags: observability + +- name: Gitea & Act Runner Setup + import_playbook: ./playbooks/09_gitea_setup.yml + tags: gitea