#!/bin/bash set -e echo "Validating Renovate configuration..." renovate-config-validator echo "Running Renovate E2E (no dry-run)..." # Capture output but also stream it to stdout for debugging set +e renovate > renovate-e2e-output.log 2>&1 RENOVATE_EXIT_CODE=$? set -e cat renovate-e2e-output.log if [ $RENOVATE_EXIT_CODE -ne 0 ]; then echo "Error: Renovate command failed with exit code $RENOVATE_EXIT_CODE" exit 1 fi # Assertions echo "Checking for successful run..." if ! grep -q "Repository finished" renovate-e2e-output.log; then echo "Error: Renovate run did not finish successfully." exit 1 fi echo "Checking for errors..." if grep -q "ERROR" renovate-e2e-output.log; then echo "Error: Renovate log contains errors." exit 1 fi echo "E2E Test passed!" rm renovate-e2e-output.log # API Verification and Cleanup GITEA_API_URL="https://gitea.kovagoadi.hu/api/v1" REPO_OWNER="renovate-test" REPO_NAME="test" # Function to clean up PRs and reset repo cleanup() { echo "Cleaning up..." # 1. Delete all Open PRs echo "Deleting Open PRs..." PRS=$(curl -s -H "Authorization: token $RENOVATE_TOKEN" "$GITEA_API_URL/repos/$REPO_OWNER/$REPO_NAME/pulls?state=open") PR_INDEXES=$(echo "$PRS" | jq -r '.[].number') for INDEX in $PR_INDEXES; do if [ "$INDEX" != "null" ]; then echo "Deleting PR #$INDEX..." curl -s -X DELETE -H "Authorization: token $RENOVATE_TOKEN" "$GITEA_API_URL/repos/$REPO_OWNER/$REPO_NAME/issues/$INDEX" fi done # 2. Delete "Configure Renovate" PR (Closed/Merged) echo "Deleting 'Configure Renovate' PR..." # Fetch closed PRs to find the onboarding one CLOSED_PRS=$(curl -s -H "Authorization: token $RENOVATE_TOKEN" "$GITEA_API_URL/repos/$REPO_OWNER/$REPO_NAME/pulls?state=closed") ONBOARDING_PR_INDEX=$(echo "$CLOSED_PRS" | jq -r '.[] | select(.title | contains("Configure Renovate")) | .number') if [ -n "$ONBOARDING_PR_INDEX" ] && [ "$ONBOARDING_PR_INDEX" != "null" ]; then echo "Deleting Onboarding PR #$ONBOARDING_PR_INDEX..." curl -s -X DELETE -H "Authorization: token $RENOVATE_TOKEN" "$GITEA_API_URL/repos/$REPO_OWNER/$REPO_NAME/issues/$ONBOARDING_PR_INDEX" fi # 3. Delete "Dependency Dashboard" Issue echo "Deleting 'Dependency Dashboard' Issue..." ISSUES=$(curl -s -H "Authorization: token $RENOVATE_TOKEN" "$GITEA_API_URL/repos/$REPO_OWNER/$REPO_NAME/issues?state=open") DASHBOARD_INDEX=$(echo "$ISSUES" | jq -r '.[] | select(.title | contains("Dependency Dashboard")) | .number') if [ -n "$DASHBOARD_INDEX" ] && [ "$DASHBOARD_INDEX" != "null" ]; then echo "Deleting Dashboard Issue #$DASHBOARD_INDEX..." curl -s -X DELETE -H "Authorization: token $RENOVATE_TOKEN" "$GITEA_API_URL/repos/$REPO_OWNER/$REPO_NAME/issues/$DASHBOARD_INDEX" fi # 4. Delete Renovate Branches echo "Deleting Renovate Branches..." BRANCHES=$(curl -s -H "Authorization: token $RENOVATE_TOKEN" "$GITEA_API_URL/repos/$REPO_OWNER/$REPO_NAME/branches") RENOVATE_BRANCHES=$(echo "$BRANCHES" | jq -r '.[].name | select(startswith("renovate/"))') for BRANCH in $RENOVATE_BRANCHES; do if [ -n "$BRANCH" ]; then echo "Deleting branch $BRANCH..." # URL encode branch name (slash needs to be %2F, but curl might handle it or we need to be careful) # Gitea API: DELETE /repos/{owner}/{repo}/branches/{branch} # Simple bash URL encoding for slash ENCODED_BRANCH=${BRANCH//\//%2F} curl -s -X DELETE -H "Authorization: token $RENOVATE_TOKEN" "$GITEA_API_URL/repos/$REPO_OWNER/$REPO_NAME/branches/$ENCODED_BRANCH" fi done # 5. Delete renovate.json from main branch to reset state (if exists) FILE_INFO=$(curl -s -H "Authorization: token $RENOVATE_TOKEN" "$GITEA_API_URL/repos/$REPO_OWNER/$REPO_NAME/contents/renovate.json?ref=main") FILE_SHA=$(echo "$FILE_INFO" | jq -r '.sha') if [ "$FILE_SHA" != "null" ] && [ -n "$FILE_SHA" ]; then echo "Deleting renovate.json to reset repository state..." curl -s -X DELETE -H "Authorization: token $RENOVATE_TOKEN" \ -H "Content-Type: application/json" \ -d "{\"message\": \"Cleanup: Delete renovate.json\", \"sha\": \"$FILE_SHA\", \"branch\": \"main\"}" \ "$GITEA_API_URL/repos/$REPO_OWNER/$REPO_NAME/contents/renovate.json" fi } # Register cleanup to run on exit trap cleanup EXIT # --- Step 1: Initial Run (Onboarding) --- echo "Running Renovate E2E (Run 1: Onboarding)..." set +e renovate --pr-hourly-limit=0 > renovate-e2e-output.log 2>&1 RENOVATE_EXIT_CODE=$? set -e cat renovate-e2e-output.log if [ $RENOVATE_EXIT_CODE -ne 0 ]; then echo "Error: Renovate command failed." exit 1 fi # Check for Onboarding PR PRS=$(curl -s -H "Authorization: token $RENOVATE_TOKEN" "$GITEA_API_URL/repos/$REPO_OWNER/$REPO_NAME/pulls?state=open") ONBOARDING_PR_NUM=$(echo "$PRS" | jq -r '.[] | select(.title | contains("Configure Renovate")) | .number') if [ -n "$ONBOARDING_PR_NUM" ] && [ "$ONBOARDING_PR_NUM" != "null" ]; then echo "Onboarding PR found (#$ONBOARDING_PR_NUM). Merging it to enable updates..." # Merge Onboarding PR MERGE_RESP=$(curl -s -X POST -H "Authorization: token $RENOVATE_TOKEN" \ -H "Content-Type: application/json" \ -d "{\"Do\": \"merge\"}" \ "$GITEA_API_URL/repos/$REPO_OWNER/$REPO_NAME/pulls/$ONBOARDING_PR_NUM/merge") # Check if merge was successful (simple check) if echo "$MERGE_RESP" | grep -q "Pull request has been merged"; then echo "Onboarding PR merged successfully." else # Fallback: check status code or response echo "Merge response: $MERGE_RESP" fi # --- Step 2: Second Run (Updates) --- echo "Running Renovate E2E (Run 2: Updates)..." set +e renovate --pr-hourly-limit=0 > renovate-e2e-output-2.log 2>&1 RENOVATE_EXIT_CODE=$? set -e cat renovate-e2e-output-2.log if [ $RENOVATE_EXIT_CODE -ne 0 ]; then echo "Error: Renovate command (Run 2) failed." exit 1 fi else echo "No Onboarding PR found. Assuming repo is already onboarded or config exists." fi echo "Verifying Update PRs and Content..." # Fetch PRs again PRS=$(curl -s -H "Authorization: token $RENOVATE_TOKEN" "$GITEA_API_URL/repos/$REPO_OWNER/$REPO_NAME/pulls?state=open") # Verify Nginx PR NGINX_PR_NUM=$(echo "$PRS" | jq -r '.[] | select(.title | contains("Update nginx Docker tag")) | .number') if [ -n "$NGINX_PR_NUM" ] && [ "$NGINX_PR_NUM" != "null" ]; then echo "API Verification: Nginx PR found (#$NGINX_PR_NUM)." # Verify Content DIFF=$(curl -s -H "Authorization: token $RENOVATE_TOKEN" "$GITEA_API_URL/repos/$REPO_OWNER/$REPO_NAME/pulls/$NGINX_PR_NUM.diff") if echo "$DIFF" | grep -q "nginx:1.29.3"; then echo "Content Verification: Nginx version update found in diff." else echo "Content Verification Failed: Nginx version update NOT found in diff." exit 1 fi else echo "API Verification Failed: Nginx PR not found." exit 1 fi # Verify Actions/Checkout PR ACTIONS_PR_NUM=$(echo "$PRS" | jq -r '.[] | select(.title | contains("Update actions/checkout action")) | .number') if [ -n "$ACTIONS_PR_NUM" ] && [ "$ACTIONS_PR_NUM" != "null" ]; then echo "API Verification: Actions/Checkout PR found (#$ACTIONS_PR_NUM)." # Verify Content DIFF=$(curl -s -H "Authorization: token $RENOVATE_TOKEN" "$GITEA_API_URL/repos/$REPO_OWNER/$REPO_NAME/pulls/$ACTIONS_PR_NUM.diff") if echo "$DIFF" | grep -q "actions/checkout@v6"; then echo "Content Verification: Actions/Checkout version update found in diff." else echo "Content Verification Failed: Actions/Checkout version update NOT found in diff." exit 1 fi else echo "API Verification Failed: Actions/Checkout PR not found." exit 1 fi # Verify Dependency Dashboard Issue echo "Verifying Dependency Dashboard..." ISSUES=$(curl -s -H "Authorization: token $RENOVATE_TOKEN" "$GITEA_API_URL/repos/$REPO_OWNER/$REPO_NAME/issues?state=open") DASHBOARD_NUM=$(echo "$ISSUES" | jq -r '.[] | select(.title | contains("Dependency Dashboard")) | .number') if [ -n "$DASHBOARD_NUM" ] && [ "$DASHBOARD_NUM" != "null" ]; then echo "API Verification: Dependency Dashboard found (#$DASHBOARD_NUM)." else echo "API Verification Failed: Dependency Dashboard NOT found." exit 1 fi echo "API & Content Verification passed!"