forgejo-deploy/roles/forgejo/tasks/main.yml

327 lines
8.3 KiB
YAML

---
# Tâches principales pour le déploiement de Forgejo
- name: Installer les dépendances système
apt:
name:
- git
- wget
- curl
- sqlite3
- build-essential
- tar
- acl
- ca-certificates
- gnupg
- rsync
state: present
update_cache: yes
tags: [install, dependencies]
- name: Créer le répertoire pour les clés APT
file:
path: /usr/share/keyrings
state: directory
mode: '0755'
tags: [install, dependencies]
- name: Télécharger la clé GPG NodeSource
get_url:
url: https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key
dest: /tmp/nodesource.gpg.key
mode: '0644'
tags: [install, dependencies]
- name: Déarmer la clé GPG et l'installer
shell: |
cat /tmp/nodesource.gpg.key | gpg --dearmor -o /usr/share/keyrings/nodesource.gpg
chmod 644 /usr/share/keyrings/nodesource.gpg
args:
creates: /usr/share/keyrings/nodesource.gpg
tags: [install, dependencies]
- name: Ajouter le dépôt NodeSource pour Node.js 20.x
apt_repository:
repo: "deb [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main"
state: present
filename: nodesource
tags: [install, dependencies]
- name: Installer Node.js
apt:
name: nodejs
state: present
update_cache: yes
tags: [install, dependencies]
- name: Vérifier l'installation de Node.js et npm
shell: |
echo "Node: $(node --version)"
echo "npm: $(npm --version)"
register: node_npm_version
changed_when: false
tags: [install, dependencies]
- name: Afficher les versions Node.js et npm
debug:
msg: "{{ node_npm_version.stdout_lines }}"
tags: [install, dependencies]
- name: Vérifier si Go est installé et sa version
shell: |
if command -v go &> /dev/null; then
version=$(go version | awk '{print $3}' | sed 's/go//')
if [ ! -z "$version" ]; then
# Extraire la version majeure.mineure
major_minor=$(echo $version | cut -d. -f1,2)
# Vérifier si >= 1.21
if awk "BEGIN {exit !($major_minor >= 1.21)}"; then
echo "ok"
else
echo "old"
fi
else
echo "none"
fi
else
echo "none"
fi
register: go_status
changed_when: false
tags: [install, build]
- name: Définir la version de Go requise
set_fact:
go_required_version: "1.22.2"
tags: [install, build]
- name: Afficher le statut de Go
debug:
msg: "Statut Go : {{ go_status.stdout }}"
tags: [install, build]
- name: Installer ou mettre à jour Go
block:
- name: Supprimer l'ancienne installation de Go
file:
path: /usr/local/go
state: absent
- name: Télécharger Go {{ go_required_version }}
get_url:
url: "https://go.dev/dl/go{{ go_required_version }}.linux-amd64.tar.gz"
dest: "/tmp/go{{ go_required_version }}.linux-amd64.tar.gz"
mode: '0644'
- name: Extraire Go
unarchive:
src: "/tmp/go{{ go_required_version }}.linux-amd64.tar.gz"
dest: /usr/local
remote_src: yes
- name: Nettoyer le tarball
file:
path: "/tmp/go{{ go_required_version }}.linux-amd64.tar.gz"
state: absent
- name: Configurer le PATH pour Go
copy:
content: |
export PATH=$PATH:/usr/local/go/bin
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
dest: /etc/profile.d/go.sh
mode: '0755'
when: go_status.stdout != "ok"
tags: [install, build]
- name: Vérifier l'installation de Go
command: /usr/local/go/bin/go version
register: go_final_version
changed_when: false
tags: [install, build]
- name: Afficher la version de Go installée
debug:
msg: "✓ Go installé: {{ go_final_version.stdout }}"
tags: [install, build]
- name: Créer le groupe système pour Forgejo
group:
name: "{{ forgejo_group }}"
system: yes
state: present
tags: [install]
- name: Créer l'utilisateur système pour Forgejo
user:
name: "{{ forgejo_user }}"
group: "{{ forgejo_group }}"
system: yes
home: "{{ forgejo_home }}"
shell: /bin/bash
create_home: yes
state: present
tags: [install]
- name: Créer les répertoires nécessaires
file:
path: "{{ item }}"
state: directory
owner: "{{ forgejo_user }}"
group: "{{ forgejo_group }}"
mode: '0755'
loop:
- "{{ forgejo_home }}"
- "{{ forgejo_data_dir }}"
- "{{ forgejo_custom_dir }}"
- "{{ forgejo_custom_dir }}/conf"
- "{{ forgejo_log_dir }}"
- "{{ forgejo_data_dir }}/repositories"
- "{{ forgejo_data_dir }}/actions"
tags: [install]
- name: Supprimer le répertoire source existant (si présent)
file:
path: "{{ forgejo_home }}/src"
state: absent
when: ansible_check_mode == false
tags: [install, build]
- name: Cloner le dépôt Forgejo depuis les sources
git:
repo: 'https://codeberg.org/forgejo/forgejo.git'
dest: "{{ forgejo_home }}/src"
version: "v{{ forgejo_version }}"
force: yes
tags: [install, build]
- name: Changer le propriétaire du code source
file:
path: "{{ forgejo_home }}/src"
owner: "{{ forgejo_user }}"
group: "{{ forgejo_group }}"
recurse: yes
tags: [install, build]
- name: Configurer Git safe.directory pour l'utilisateur git
become_user: "{{ forgejo_user }}"
command: git config --global --add safe.directory {{ forgejo_home }}/src
args:
creates: /home/{{ forgejo_user }}/.gitconfig
tags: [install, build]
- name: Vérifier que Node.js est accessible
command: which node
register: node_path
failed_when: node_path.rc != 0
changed_when: false
tags: [install, build]
- name: Vérifier que npm est accessible
command: which npm
register: npm_path
failed_when: npm_path.rc != 0
changed_when: false
tags: [install, build]
- name: Afficher les chemins Node.js et npm
debug:
msg:
- "Node.js: {{ node_path.stdout }}"
- "npm: {{ npm_path.stdout }}"
tags: [install, build]
- name: Compiler Forgejo depuis les sources
shell: |
cd {{ forgejo_home }}/src
export PATH=/usr/local/go/bin:/usr/bin:$PATH
export NODE_PATH=/usr/lib/node_modules
TAGS="bindata sqlite sqlite_unlock_notify" make build
become_user: "{{ forgejo_user }}"
environment:
GOPATH: "{{ forgejo_home }}/go"
PATH: "/usr/local/go/bin:/usr/bin:{{ ansible_env.PATH }}"
NODE_PATH: "/usr/lib/node_modules"
tags: [install, build]
- name: Vérifier quel binaire a été créé
find:
paths: "{{ forgejo_home }}/src"
patterns:
- "forgejo"
- "gitea"
file_type: file
register: binary_files
tags: [install, build]
- name: Afficher les binaires trouvés
debug:
msg: "Binaires trouvés: {{ binary_files.files | map(attribute='path') | list }}"
tags: [install, build]
- name: Déterminer le nom du binaire
set_fact:
source_binary: "{{ binary_files.files[0].path if binary_files.files | length > 0 else '' }}"
tags: [install, build]
- name: Échouer si aucun binaire trouvé
fail:
msg: "Aucun binaire Forgejo/Gitea trouvé dans {{ forgejo_home }}/src"
when: source_binary == ""
tags: [install, build]
- name: Copier le binaire Forgejo
copy:
src: "{{ source_binary }}"
dest: "{{ forgejo_home }}/forgejo"
remote_src: yes
owner: "{{ forgejo_user }}"
group: "{{ forgejo_group }}"
mode: '0755'
tags: [install, build]
- name: Créer le fichier de configuration app.ini
template:
src: app.ini.j2
dest: "{{ forgejo_custom_dir }}/conf/app.ini"
owner: "{{ forgejo_user }}"
group: "{{ forgejo_group }}"
mode: '0640'
notify: restart forgejo
tags: [config]
- name: Créer le service systemd
template:
src: forgejo.service.j2
dest: /etc/systemd/system/forgejo.service
mode: '0644'
notify:
- reload systemd
- restart forgejo
tags: [install, service]
- name: Activer et démarrer le service Forgejo
systemd:
name: forgejo
enabled: yes
state: started
daemon_reload: yes
tags: [install, service]
- name: Attendre que Forgejo soit prêt
wait_for:
port: "{{ forgejo_port }}"
timeout: 60
tags: [install]
- name: Configurer Forgejo Actions (CI/CD)
include_tasks: actions.yml
when: forgejo_enable_actions | bool
tags: [ci, actions]
- name: Créer un runner Forgejo pour CI/CD
include_tasks: runner.yml
when: forgejo_enable_actions | bool
tags: [ci, runner]