From 050983c34557f2b6512d74b4255df225ca0aeb32 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 23 Mar 2025 20:54:06 -0400 Subject: [PATCH 01/11] Improve auto-update script with better error handling and version extraction --- ansible/templates/update-forgejo.sh.j2 | 44 ++++++++++++++++++-------- 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/ansible/templates/update-forgejo.sh.j2 b/ansible/templates/update-forgejo.sh.j2 index 5201399..98d691e 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" @@ -48,19 +47,32 @@ backup_forgejo() { 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//') + # Fetch the latest version from the Forgejo API with error handling + local latest_version + latest_version=$(curl -s --max-time 10 https://codeberg.org/api/v1/repos/forgejo/forgejo/releases/latest | \ + grep -o '"tag_name":"v[0-9.]*' | \ + sed 's/"tag_name":"v//' || true) - if [ -z "$LATEST_VERSION" ]; then - log "ERROR: Failed to retrieve the latest version. Exiting." + if [ -z "$latest_version" ]; then + log "ERROR: Failed to retrieve the latest version from Codeberg API." exit 1 fi - log "Latest version: $LATEST_VERSION" - log "Current version: $CURRENT_VERSION" + echo "$latest_version" +} + +# Get current Forgejo version +get_current_version() { + local current_version + current_version=$(docker inspect --format='{% raw %}{{.Config.Image}}{% endraw %}' forgejo | \ + awk -F':' '{print $2}' || true) - # Return the latest version - echo "$LATEST_VERSION" + if [ -z "$current_version" ]; then + log "ERROR: Failed to retrieve the current Forgejo version." + exit 1 + fi + + echo "$current_version" } # Update Forgejo to the latest version @@ -84,15 +96,17 @@ update_forgejo() { # 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.]*\+*/codeberg.org\/forgejo\/forgejo:$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=$(get_current_version) if [ "$NEW_VERSION" = "$latest_version" ]; then log "Forgejo successfully updated to version $latest_version" @@ -106,9 +120,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..." From def06475cff37e3f9ac0a7aaf855c69c36d3392b Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 23 Mar 2025 20:55:17 -0400 Subject: [PATCH 02/11] Add tag for update script deployment --- ansible/forgejo.yml | 2 ++ 1 file changed, 2 insertions(+) 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: From 5841012a5ab186230848532bf06c5de751513136 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 23 Mar 2025 20:56:32 -0400 Subject: [PATCH 03/11] Fix version extraction regex in update script --- ansible/templates/update-forgejo.sh.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ansible/templates/update-forgejo.sh.j2 b/ansible/templates/update-forgejo.sh.j2 index 98d691e..52df1ae 100644 --- a/ansible/templates/update-forgejo.sh.j2 +++ b/ansible/templates/update-forgejo.sh.j2 @@ -51,7 +51,7 @@ get_latest_version() { local latest_version latest_version=$(curl -s --max-time 10 https://codeberg.org/api/v1/repos/forgejo/forgejo/releases/latest | \ grep -o '"tag_name":"v[0-9.]*' | \ - sed 's/"tag_name":"v//' || true) + sed -E 's/"tag_name":"v//g' || true) if [ -z "$latest_version" ]; then log "ERROR: Failed to retrieve the latest version from Codeberg API." From 8147fcaf908ba09a9d0565a4aae95e79bce4b72e Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 23 Mar 2025 20:57:42 -0400 Subject: [PATCH 04/11] Improve image pulling and docker-compose update in auto-update script --- ansible/templates/update-forgejo.sh.j2 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ansible/templates/update-forgejo.sh.j2 b/ansible/templates/update-forgejo.sh.j2 index 52df1ae..36d7144 100644 --- a/ansible/templates/update-forgejo.sh.j2 +++ b/ansible/templates/update-forgejo.sh.j2 @@ -78,6 +78,7 @@ get_current_version() { # Update Forgejo to the latest version update_forgejo() { local latest_version=$1 + local image_name="codeberg.org/forgejo/forgejo" log "Starting Forgejo update process..." @@ -92,11 +93,11 @@ update_forgejo() { # Pull the latest image log "Pulling the latest Forgejo image..." - docker pull "codeberg.org/forgejo/forgejo:$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.]*\+*/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..." From 5941e13389a3811528e169253ec6aeea633df770 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 23 Mar 2025 20:59:02 -0400 Subject: [PATCH 05/11] Enhance image version detection and update logic in auto-update script --- ansible/templates/update-forgejo.sh.j2 | 32 ++++++++++++++------------ 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/ansible/templates/update-forgejo.sh.j2 b/ansible/templates/update-forgejo.sh.j2 index 36d7144..5e3caaf 100644 --- a/ansible/templates/update-forgejo.sh.j2 +++ b/ansible/templates/update-forgejo.sh.j2 @@ -61,26 +61,27 @@ get_latest_version() { echo "$latest_version" } -# Get current Forgejo version -get_current_version() { - local current_version - current_version=$(docker inspect --format='{% raw %}{{.Config.Image}}{% endraw %}' forgejo | \ - awk -F':' '{print $2}' || true) +# Get current Forgejo version and image +get_current_image_details() { + local current_image + current_image=$(docker inspect --format='{% raw %}{{.Config.Image}}{% endraw %}' forgejo || true) - if [ -z "$current_version" ]; then - log "ERROR: Failed to retrieve the current Forgejo version." + if [ -z "$current_image" ]; then + log "ERROR: Failed to retrieve the current Forgejo image." exit 1 fi - echo "$current_version" + echo "$current_image" } # Update Forgejo to the latest version update_forgejo() { local latest_version=$1 - local image_name="codeberg.org/forgejo/forgejo" + local current_image=$(get_current_image_details) + local image_name=$(echo "$current_image" | cut -d':' -f1) - log "Starting Forgejo update process..." + log "Current image: $current_image" + log "Image name: $image_name" # Check if Forgejo is running if ! is_forgejo_running; then @@ -97,7 +98,7 @@ update_forgejo() { # 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.]*\+*|$image_name:$latest_version|g" "$COMPOSE_FILE" + sed -i "s|$image_name:[0-9.]*\+*|$image_name:$latest_version|g" "$COMPOSE_FILE" # Restart Forgejo with the new version log "Restarting Forgejo with the new version..." @@ -107,12 +108,12 @@ update_forgejo() { sleep 15 # Verify the update - NEW_VERSION=$(get_current_version) + NEW_IMAGE=$(get_current_image_details) - if [ "$NEW_VERSION" = "$latest_version" ]; then + if [[ "$NEW_IMAGE" == *":$latest_version" ]]; then log "Forgejo successfully updated to version $latest_version" else - log "ERROR: Update verification failed. Current version: $NEW_VERSION, Expected: $latest_version" + log "ERROR: Update verification failed. Current image: $NEW_IMAGE, Expected version: $latest_version" log "Please check the container logs for more information." exit 1 fi @@ -122,8 +123,9 @@ update_forgejo() { log "=== Forgejo Auto-Update Script Started ===" # Get versions -CURRENT_VERSION=$(get_current_version) +CURRENT_IMAGE=$(get_current_image_details) LATEST_VERSION=$(get_latest_version) +CURRENT_VERSION=$(echo "$CURRENT_IMAGE" | cut -d':' -f2) log "Current version: $CURRENT_VERSION" log "Latest version: $LATEST_VERSION" From 6d4987e06725fc70c1e1b8346cc5508fcd2da054 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 23 Mar 2025 21:11:51 -0400 Subject: [PATCH 06/11] Hardcode image name to codeberg.org/forgejo/forgejo in auto-update script --- ansible/templates/update-forgejo.sh.j2 | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/ansible/templates/update-forgejo.sh.j2 b/ansible/templates/update-forgejo.sh.j2 index 5e3caaf..89111bf 100644 --- a/ansible/templates/update-forgejo.sh.j2 +++ b/ansible/templates/update-forgejo.sh.j2 @@ -77,11 +77,9 @@ get_current_image_details() { # Update Forgejo to the latest version update_forgejo() { local latest_version=$1 - local current_image=$(get_current_image_details) - local image_name=$(echo "$current_image" | cut -d':' -f1) + local image_name="codeberg.org/forgejo/forgejo" - log "Current image: $current_image" - log "Image name: $image_name" + log "Current image: $image_name:$(get_current_version)" # Check if Forgejo is running if ! is_forgejo_running; then @@ -93,12 +91,12 @@ update_forgejo() { backup_forgejo # Pull the latest image - log "Pulling the latest Forgejo image..." + 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|$image_name:[0-9.]*\+*|$image_name:$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..." @@ -108,24 +106,28 @@ update_forgejo() { sleep 15 # Verify the update - NEW_IMAGE=$(get_current_image_details) + NEW_VERSION=$(docker inspect --format='{% raw %}{{.Config.Image}}{% endraw %}' forgejo | cut -d':' -f2) - if [[ "$NEW_IMAGE" == *":$latest_version" ]]; then + if [ "$NEW_VERSION" = "$latest_version" ]; then log "Forgejo successfully updated to version $latest_version" else - log "ERROR: Update verification failed. Current image: $NEW_IMAGE, Expected version: $latest_version" + log "ERROR: Update verification failed. Current version: $NEW_VERSION, Expected: $latest_version" log "Please check the container logs for more information." exit 1 fi } +# Get current version +get_current_version() { + docker inspect --format='{% raw %}{{.Config.Image}}{% endraw %}' forgejo | cut -d':' -f2 +} + # Main execution log "=== Forgejo Auto-Update Script Started ===" # Get versions -CURRENT_IMAGE=$(get_current_image_details) +CURRENT_VERSION=$(get_current_version) LATEST_VERSION=$(get_latest_version) -CURRENT_VERSION=$(echo "$CURRENT_IMAGE" | cut -d':' -f2) log "Current version: $CURRENT_VERSION" log "Latest version: $LATEST_VERSION" From 783cb17e406c83ce898cfcd924421fad830dc08a Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 23 Mar 2025 21:20:40 -0400 Subject: [PATCH 07/11] Fix version extraction in get_latest_version function --- ansible/templates/update-forgejo.sh.j2 | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/ansible/templates/update-forgejo.sh.j2 b/ansible/templates/update-forgejo.sh.j2 index 89111bf..f51283a 100644 --- a/ansible/templates/update-forgejo.sh.j2 +++ b/ansible/templates/update-forgejo.sh.j2 @@ -51,7 +51,7 @@ get_latest_version() { local latest_version latest_version=$(curl -s --max-time 10 https://codeberg.org/api/v1/repos/forgejo/forgejo/releases/latest | \ grep -o '"tag_name":"v[0-9.]*' | \ - sed -E 's/"tag_name":"v//g' || true) + sed -E 's/"tag_name":"v//g') if [ -z "$latest_version" ]; then log "ERROR: Failed to retrieve the latest version from Codeberg API." @@ -61,17 +61,9 @@ get_latest_version() { echo "$latest_version" } -# Get current Forgejo version and image -get_current_image_details() { - local current_image - current_image=$(docker inspect --format='{% raw %}{{.Config.Image}}{% endraw %}' forgejo || true) - - if [ -z "$current_image" ]; then - log "ERROR: Failed to retrieve the current Forgejo image." - exit 1 - fi - - echo "$current_image" +# Get current version +get_current_version() { + docker inspect --format='{% raw %}{{.Config.Image}}{% endraw %}' forgejo | cut -d':' -f2 } # Update Forgejo to the latest version @@ -117,11 +109,6 @@ update_forgejo() { fi } -# Get current version -get_current_version() { - docker inspect --format='{% raw %}{{.Config.Image}}{% endraw %}' forgejo | cut -d':' -f2 -} - # Main execution log "=== Forgejo Auto-Update Script Started ===" From 5a27df49ea29f67f665a80c55df5b720dc2f05b1 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 23 Mar 2025 21:22:13 -0400 Subject: [PATCH 08/11] Improve version extraction with better error logging in auto-update script --- ansible/templates/update-forgejo.sh.j2 | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/ansible/templates/update-forgejo.sh.j2 b/ansible/templates/update-forgejo.sh.j2 index f51283a..32952cc 100644 --- a/ansible/templates/update-forgejo.sh.j2 +++ b/ansible/templates/update-forgejo.sh.j2 @@ -48,13 +48,16 @@ get_latest_version() { log "Checking for the latest Forgejo version..." # Fetch the latest version from the Forgejo API with error handling + local api_response + api_response=$(curl -s --max-time 10 https://codeberg.org/api/v1/repos/forgejo/forgejo/releases/latest) + + # Extract version using grep and sed local latest_version - latest_version=$(curl -s --max-time 10 https://codeberg.org/api/v1/repos/forgejo/forgejo/releases/latest | \ - grep -o '"tag_name":"v[0-9.]*' | \ - sed -E 's/"tag_name":"v//g') + latest_version=$(echo "$api_response" | grep -o '"tag_name":"v[0-9.]*' | sed -E 's/"tag_name":"v//g') if [ -z "$latest_version" ]; then log "ERROR: Failed to retrieve the latest version from Codeberg API." + log "API Response: $api_response" exit 1 fi From 121bdf1b002f2424eec5dc2351b5abe3c27d1ca4 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 23 Mar 2025 21:24:33 -0400 Subject: [PATCH 09/11] Enhance version extraction with improved regex and logging --- ansible/templates/update-forgejo.sh.j2 | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/ansible/templates/update-forgejo.sh.j2 b/ansible/templates/update-forgejo.sh.j2 index 32952cc..713b2e1 100644 --- a/ansible/templates/update-forgejo.sh.j2 +++ b/ansible/templates/update-forgejo.sh.j2 @@ -51,16 +51,19 @@ get_latest_version() { local api_response api_response=$(curl -s --max-time 10 https://codeberg.org/api/v1/repos/forgejo/forgejo/releases/latest) + # Log the full API response for debugging + log "API Response: $api_response" + # Extract version using grep and sed local latest_version - latest_version=$(echo "$api_response" | grep -o '"tag_name":"v[0-9.]*' | sed -E 's/"tag_name":"v//g') + latest_version=$(echo "$api_response" | grep -oP '(?<="tag_name":"v)[0-9.]+') if [ -z "$latest_version" ]; then - log "ERROR: Failed to retrieve the latest version from Codeberg API." - log "API Response: $api_response" + log "ERROR: Failed to extract version from API response." exit 1 fi + log "Extracted latest version: $latest_version" echo "$latest_version" } From 5f554a5b76f47aa44154c5e21d5c0510ed72d2c0 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 23 Mar 2025 21:28:37 -0400 Subject: [PATCH 10/11] Use jq for version extraction in auto-update script --- ansible/templates/update-forgejo.sh.j2 | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/ansible/templates/update-forgejo.sh.j2 b/ansible/templates/update-forgejo.sh.j2 index 713b2e1..fe90dec 100644 --- a/ansible/templates/update-forgejo.sh.j2 +++ b/ansible/templates/update-forgejo.sh.j2 @@ -48,22 +48,16 @@ get_latest_version() { log "Checking for the latest Forgejo version..." # Fetch the latest version from the Forgejo API with error handling - local api_response - api_response=$(curl -s --max-time 10 https://codeberg.org/api/v1/repos/forgejo/forgejo/releases/latest) - - # Log the full API response for debugging - log "API Response: $api_response" - - # Extract version using grep and sed local latest_version - latest_version=$(echo "$api_response" | grep -oP '(?<="tag_name":"v)[0-9.]+') + latest_version=$(curl -s --max-time 10 https://codeberg.org/api/v1/repos/forgejo/forgejo/releases/latest | \ + jq -r '.tag_name' | \ + sed 's/^v//') if [ -z "$latest_version" ]; then - log "ERROR: Failed to extract version from API response." + log "ERROR: Failed to retrieve the latest version from Codeberg API." exit 1 fi - log "Extracted latest version: $latest_version" echo "$latest_version" } From a29fa93e1e42e0d494327ca18e643086fd14ccb3 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 23 Mar 2025 21:44:43 -0400 Subject: [PATCH 11/11] Improve version extraction with stderr logging in get_latest_version --- ansible/templates/update-forgejo.sh.j2 | 38 ++++++++++++++++---------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/ansible/templates/update-forgejo.sh.j2 b/ansible/templates/update-forgejo.sh.j2 index fe90dec..9a1185b 100644 --- a/ansible/templates/update-forgejo.sh.j2 +++ b/ansible/templates/update-forgejo.sh.j2 @@ -45,20 +45,30 @@ 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 with error handling - local latest_version - latest_version=$(curl -s --max-time 10 https://codeberg.org/api/v1/repos/forgejo/forgejo/releases/latest | \ - jq -r '.tag_name' | \ - sed 's/^v//') - - if [ -z "$latest_version" ]; then - log "ERROR: Failed to retrieve the latest version from Codeberg API." - exit 1 - fi - - 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