--- # 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: 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 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: Stop Forgejo service community.docker.docker_compose_v2: project_src: "{{ forgejo_base_path }}" 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 }}" 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 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 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. ========================================