diff --git a/ansible/forgejo.yml b/ansible/forgejo.yml index 1838999..f5f0eb3 100644 --- a/ansible/forgejo.yml +++ b/ansible/forgejo.yml @@ -156,6 +156,8 @@ owner: "{{ forgejo_user_uid }}" group: "{{ forgejo_user_gid }}" mode: '0755' + tags: + - update_script - name: Set up cron job for Forgejo auto-update cron: diff --git a/ansible/templates/update-forgejo.sh.j2 b/ansible/templates/update-forgejo.sh.j2 index 5201399..9a1185b 100644 --- a/ansible/templates/update-forgejo.sh.j2 +++ b/ansible/templates/update-forgejo.sh.j2 @@ -6,7 +6,6 @@ set -e LOG_FILE="{{ forgejo_data_dir }}/logs/update.log" COMPOSE_FILE="{{ forgejo_data_dir }}/docker-compose.yml" -CURRENT_VERSION=$(docker inspect --format='{% raw %}{{.Config.Image}}{% endraw %}' forgejo | awk -F':' '{print $2}') # Create log directory if it doesn't exist mkdir -p "{{ forgejo_data_dir }}/logs" @@ -46,28 +45,43 @@ backup_forgejo() { # Get the latest Forgejo version get_latest_version() { - log "Checking for the latest Forgejo version..." - - # Fetch the latest version from the Forgejo API - LATEST_VERSION=$(curl -s https://codeberg.org/api/v1/repos/forgejo/forgejo/releases/latest | grep -o '\"tag_name\":\"[^\"]*' | cut -d'\"' -f4 | sed 's/^v//') - - if [ -z "$LATEST_VERSION" ]; then - log "ERROR: Failed to retrieve the latest version. Exiting." - exit 1 - fi - - log "Latest version: $LATEST_VERSION" - log "Current version: $CURRENT_VERSION" - - # Return the latest version - echo "$LATEST_VERSION" + # Redirect log output to stderr so it doesn't get captured + log "Checking for the latest Forgejo version..." >&2 + + local response + local latest_version + + response=$(curl -s --max-time 10 https://codeberg.org/api/v1/repos/forgejo/forgejo/releases/latest) + + # Check if response contains expected field (also redirect to stderr) + if ! echo "$response" | jq -e '.tag_name' > /dev/null; then + log "ERROR: Invalid response from Codeberg API." >&2 + log "Response was: $response" >&2 + exit 1 + fi + + latest_version=$(echo "$response" | jq -r '.tag_name' | sed 's/^v//') + + if [ -z "$latest_version" ]; then + log "ERROR: Failed to retrieve the latest version from Codeberg API." >&2 + exit 1 + fi + + # Only output the version number + echo "$latest_version" +} + +# Get current version +get_current_version() { + docker inspect --format='{% raw %}{{.Config.Image}}{% endraw %}' forgejo | cut -d':' -f2 } # Update Forgejo to the latest version update_forgejo() { local latest_version=$1 + local image_name="codeberg.org/forgejo/forgejo" - log "Starting Forgejo update process..." + log "Current image: $image_name:$(get_current_version)" # Check if Forgejo is running if ! is_forgejo_running; then @@ -79,20 +93,22 @@ update_forgejo() { backup_forgejo # Pull the latest image - log "Pulling the latest Forgejo image..." - docker pull "codeberg.org/forgejo/forgejo:$latest_version" + log "Pulling the latest Forgejo image... $image_name:$latest_version" + docker pull "$image_name:$latest_version" # Update the docker-compose file with the new version log "Updating docker-compose.yml with the new version..." - sed -i "s/codeberg.org\/forgejo\/forgejo:[0-9]*\.[0-9]*\.[0-9]*/codeberg.org\/forgejo\/forgejo:$latest_version/g" "$COMPOSE_FILE" + sed -i "s|codeberg.org/forgejo/forgejo:[0-9.]*\+*|$image_name:$latest_version|g" "$COMPOSE_FILE" # Restart Forgejo with the new version log "Restarting Forgejo with the new version..." cd "{{ forgejo_data_dir }}" && docker-compose down && docker-compose up -d + # Wait for container to restart and verify + sleep 15 + # Verify the update - sleep 10 - NEW_VERSION=$(docker inspect --format='{% raw %}{{.Config.Image}}{% endraw %}' forgejo | awk -F':' '{print $2}') + NEW_VERSION=$(docker inspect --format='{% raw %}{{.Config.Image}}{% endraw %}' forgejo | cut -d':' -f2) if [ "$NEW_VERSION" = "$latest_version" ]; then log "Forgejo successfully updated to version $latest_version" @@ -106,9 +122,13 @@ update_forgejo() { # Main execution log "=== Forgejo Auto-Update Script Started ===" -# Get the latest version +# Get versions +CURRENT_VERSION=$(get_current_version) LATEST_VERSION=$(get_latest_version) +log "Current version: $CURRENT_VERSION" +log "Latest version: $LATEST_VERSION" + # Compare versions and update if needed if [ "$CURRENT_VERSION" != "$LATEST_VERSION" ]; then log "A new version is available. Updating from $CURRENT_VERSION to $LATEST_VERSION..."