commit 88e3f01895005774c343ce7c911a60153fb96592 Author: mathieu Date: Sun May 24 17:13:35 2026 +0200 feat: initial installation role for gitea diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a8b42eb --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.retry diff --git a/README.md b/README.md new file mode 100644 index 0000000..9670a30 --- /dev/null +++ b/README.md @@ -0,0 +1,39 @@ +# ansible-role-gitea + +Installs the Gitea binary from GitHub releases and sets up a systemd service. +Architecture is auto-detected. The role is idempotent. + +The service user and group (default: `git`) must be created beforehand. +Application configuration (`app.ini`) is out of scope for this role. + +## Requirements + +- Ansible >= 2.14 + +## Role Variables + +| Variable | Default | Description | +|---|---|---| +| `gitea_version` | `""` | Version to install (empty = latest) | +| `gitea_user` | `git` | User to run Gitea | +| `gitea_group` | `git` | Group to run Gitea | +| `gitea_install_dir` | `/usr/local/bin` | Directory for the Gitea binary | +| `gitea_home_dir` | `/var/lib/gitea` | Gitea work directory | +| `gitea_config_dir` | `/etc/gitea` | Directory for `app.ini` | +| `gitea_service_enabled` | `true` | Enable service at boot | +| `gitea_service_state` | `started` | Service state after installation | + +## Example Playbook + +```yaml +- hosts: git_servers + roles: + - role: ansible-role-gitea + vars: + gitea_user: git + gitea_group: git +``` + +## License + +MIT diff --git a/defaults/main.yml b/defaults/main.yml new file mode 100644 index 0000000..2f3c3d7 --- /dev/null +++ b/defaults/main.yml @@ -0,0 +1,9 @@ +--- +gitea_version: "" +gitea_user: git +gitea_group: git +gitea_install_dir: /usr/local/bin +gitea_home_dir: /var/lib/gitea +gitea_config_dir: /etc/gitea +gitea_service_enabled: true +gitea_service_state: started diff --git a/handlers/main.yml b/handlers/main.yml new file mode 100644 index 0000000..ed97d53 --- /dev/null +++ b/handlers/main.yml @@ -0,0 +1 @@ +--- diff --git a/meta/main.yml b/meta/main.yml new file mode 100644 index 0000000..7d15ace --- /dev/null +++ b/meta/main.yml @@ -0,0 +1,15 @@ +--- +galaxy_info: + author: mathieu + description: Install Gitea binary on Linux + license: MIT + min_ansible_version: "2.14" + platforms: + - name: Debian + versions: [bullseye, bookworm] + - name: Ubuntu + versions: [focal, jammy, noble] + - name: EL + versions: ["8", "9"] + galaxy_tags: [gitea, git, scm] +dependencies: [] diff --git a/tasks/main.yml b/tasks/main.yml new file mode 100644 index 0000000..4b00b01 --- /dev/null +++ b/tasks/main.yml @@ -0,0 +1,110 @@ +--- +- name: Set architecture fact + ansible.builtin.set_fact: + _gitea_arch: "{{ {'x86_64': 'amd64', 'aarch64': 'arm64', 'armv7l': 'arm-6'}.get(ansible_architecture, 'amd64') }}" + +- name: Get Gitea release info from GitHub + ansible.builtin.uri: + url: >- + {{ 'https://api.github.com/repos/go-gitea/gitea/releases/latest' + if gitea_version == '' + else 'https://api.github.com/repos/go-gitea/gitea/releases/tags/v' + gitea_version }} + headers: + Accept: "application/vnd.github.v3+json" + return_content: true + register: _gitea_release + +- name: Set version and download URL facts + ansible.builtin.set_fact: + _gitea_version_tag: "{{ _gitea_release.json.tag_name }}" + _gitea_download_url: >- + {{ _gitea_release.json.assets + | selectattr('name', 'search', 'gitea-.*linux-' + _gitea_arch + '$') + | map(attribute='browser_download_url') + | first }} + +- name: Read installed version + ansible.builtin.slurp: + src: "{{ gitea_install_dir }}/.gitea_version" + register: _gitea_installed_raw + ignore_errors: true + become: true + +- name: Set installed version fact + ansible.builtin.set_fact: + _gitea_installed_version: >- + {{ (_gitea_installed_raw.content | b64decode | trim) + if _gitea_installed_raw is not failed else '' }} + +- name: Install or upgrade Gitea binary + when: _gitea_installed_version != _gitea_version_tag + block: + - name: Download Gitea binary + ansible.builtin.get_url: + url: "{{ _gitea_download_url }}" + dest: "{{ gitea_install_dir }}/gitea" + mode: '0755' + owner: root + group: root + become: true + + - name: Write installed version file + ansible.builtin.copy: + content: "{{ _gitea_version_tag }}" + dest: "{{ gitea_install_dir }}/.gitea_version" + mode: '0644' + become: true + +- name: Create Gitea home directory structure + ansible.builtin.file: + path: "{{ item }}" + state: directory + owner: "{{ gitea_user }}" + group: "{{ gitea_group }}" + mode: '0750' + become: true + loop: + - "{{ gitea_home_dir }}" + - "{{ gitea_home_dir }}/custom" + - "{{ gitea_home_dir }}/data" + - "{{ gitea_home_dir }}/log" + +- name: Create Gitea config directory + ansible.builtin.file: + path: "{{ gitea_config_dir }}" + state: directory + owner: root + group: "{{ gitea_group }}" + mode: '0770' + become: true + +- name: Create Gitea systemd service + ansible.builtin.copy: + content: | + [Unit] + Description=Gitea Git Service + After=syslog.target network.target + + [Service] + RestartSec=2s + Type=simple + User={{ gitea_user }} + Group={{ gitea_group }} + WorkingDirectory={{ gitea_home_dir }} + Environment=USER={{ gitea_user }} HOME=/home/{{ gitea_user }} GITEA_WORK_DIR={{ gitea_home_dir }} + ExecStart={{ gitea_install_dir }}/gitea web --config {{ gitea_config_dir }}/app.ini + Restart=always + + [Install] + WantedBy=multi-user.target + dest: /etc/systemd/system/gitea.service + mode: '0644' + become: true + +- name: Enable and start Gitea service + ansible.builtin.systemd: + name: gitea + enabled: "{{ gitea_service_enabled }}" + state: "{{ gitea_service_state }}" + daemon_reload: true + become: true