forgejo-autohebergement/ansible/playbooks/update.yml
Horacio Duran c09bf58ea7 Backport fixes from version in production
Per file detail:
backup.yml
      - Added role defaults loading with proper precedence (inventory > vars > defaults)
      - Fixed pg_dump permissions: now dumps to /tmp first, then moves to backup directory
update.yml
      - Added role defaults loading with proper precedence
      - Fixed docker exec commands to use --user {{ forgejo_user }}
      - Added monitoring compose file detection and handling
restore.yml
      - Added role defaults loading with proper precedence
      - Added monitoring compose file detection and handling
      - Fixed docker exec for doctor command to use --user {{ forgejo_user }}
Makefile
       - Updated .PHONY with new targets
       - Replaced auto-generated help with structured categorized help
       - Added backup-cron and backup-cron-s3 targets for non-interactive backups
       - Added cron job example in help output
2026-01-15 22:26:27 +01:00

152 lines
5.1 KiB
YAML

---
# Update Forgejo to latest version
# This playbook safely updates Forgejo with automatic backup
- name: Update Forgejo
hosts: forgejo
become: yes
gather_facts: yes
vars_files:
- vars/main.yml
- vars/secrets.yml
vars:
backup_before_update: true
skip_backup: false # Override with --extra-vars "skip_backup=true"
pre_tasks:
- name: Load role defaults as fallback
ansible.builtin.include_vars:
file: ../roles/forgejo/defaults/main.yml
name: role_defaults
- name: Apply all role defaults for undefined variables
ansible.builtin.set_fact:
"{{ item.key }}": "{{ vars[item.key] | default(item.value) }}"
loop: "{{ role_defaults | dict2items }}"
loop_control:
label: "{{ item.key }}"
- name: Display update information
ansible.builtin.debug:
msg: |
Updating Forgejo from {{ forgejo_version }}
Backup will be created: {{ backup_before_update and not skip_backup }}
- name: Check current Forgejo version
ansible.builtin.command:
cmd: docker exec --user {{ forgejo_user }} forgejo forgejo --version
register: current_version
changed_when: false
failed_when: false
- name: Display current version
ansible.builtin.debug:
msg: "Current version: {{ current_version.stdout if current_version.rc == 0 else 'Unable to determine' }}"
tasks:
- name: Create pre-update backup
when: backup_before_update and not skip_backup
block:
- name: Run backup script
ansible.builtin.command:
cmd: /usr/local/bin/forgejo_backup.sh
register: backup_result
- name: Display backup result
ansible.builtin.debug:
msg: "Backup completed: {{ backup_result.stdout_lines[-1] if backup_result.stdout_lines else 'No output' }}"
- name: Check if monitoring compose file exists
ansible.builtin.stat:
path: "{{ forgejo_base_path }}/docker-compose.monitoring.yml"
register: monitoring_compose
- name: Stop Forgejo service
community.docker.docker_compose_v2:
project_src: "{{ forgejo_base_path }}"
files: "{{ ['docker-compose.yml', 'docker-compose.monitoring.yml'] if monitoring_compose.stat.exists else ['docker-compose.yml'] }}"
state: stopped
- name: Pull latest Forgejo image
community.docker.docker_image:
name: "{{ forgejo_docker_image }}:{{ forgejo_version }}"
source: pull
force_source: yes
- name: Update Docker Compose file if needed
ansible.builtin.template:
src: ../roles/forgejo/templates/docker-compose.yml.j2
dest: "{{ forgejo_base_path }}/docker-compose.yml"
owner: "{{ forgejo_user }}"
group: "{{ forgejo_group }}"
mode: '0640'
- name: Start Forgejo service
community.docker.docker_compose_v2:
project_src: "{{ forgejo_base_path }}"
files: "{{ ['docker-compose.yml', 'docker-compose.monitoring.yml'] if monitoring_compose.stat.exists else ['docker-compose.yml'] }}"
state: present
pull: always
- name: Wait for Forgejo to be ready
ansible.builtin.uri:
url: "http://localhost:{{ forgejo_http_port }}"
status_code: 200
register: health_check
until: health_check.status == 200
retries: 30
delay: 2
- name: Check updated version
ansible.builtin.command:
cmd: docker exec --user {{ forgejo_user }} forgejo forgejo --version
register: updated_version
changed_when: false
- name: Display updated version
ansible.builtin.debug:
msg: "Updated version: {{ updated_version.stdout }}"
- name: Run database migrations
ansible.builtin.command:
cmd: docker exec --user {{ forgejo_user }} forgejo forgejo migrate
register: migrate_result
changed_when: "'No migration needed' not in migrate_result.stdout"
- name: Display migration result
ansible.builtin.debug:
msg: "{{ migrate_result.stdout_lines }}"
post_tasks:
- name: Verify Forgejo health
ansible.builtin.uri:
url: "http://localhost:{{ forgejo_http_port }}/api/healthz"
status_code: 200
return_content: yes
register: health
- name: Display health status
ansible.builtin.debug:
msg: "Forgejo health check: {{ health.content }}"
- name: Update deployment info
ansible.builtin.lineinfile:
path: "{{ forgejo_base_path }}/DEPLOYMENT_INFO.txt"
regexp: '^Last Update:'
line: "Last Update: {{ ansible_date_time.iso8601 }} - {{ forgejo_version }}"
insertafter: '^Deployment Date:'
- name: Display completion message
ansible.builtin.debug:
msg: |
========================================
Forgejo Update Complete!
========================================
Previous version: {{ current_version.stdout if current_version.rc == 0 else 'Unknown' }}
Current version: {{ updated_version.stdout }}
The service is running and healthy.
========================================