diff --git a/.gitea/workflows/test.yaml b/.gitea/workflows/test.yaml new file mode 100644 index 0000000..fdcb5c6 --- /dev/null +++ b/.gitea/workflows/test.yaml @@ -0,0 +1,44 @@ +name: Test Renovate Config +on: + push: + branches: + - main + pull_request: + branches: + - main + +concurrency: + group: renovate-test-lock + cancel-in-progress: false + +jobs: + test-renovate: + runs-on: ubuntu-latest + container: ghcr.io/renovatebot/renovate:42.8.1 + steps: + - name: Checkout + uses: actions/checkout@v5.0.0 + + - name: Run Renovate Test Script + run: bash scripts/test-renovate.sh + env: + RENOVATE_CONFIG_FILE: "/workspace/kovagoadi.hu/Renovate/renovate-config.js" + LOG_LEVEL: "debug" + RENOVATE_TOKEN: ${{ secrets.RENOVATE_TEST_TOKEN }} + GITHUB_COM_TOKEN: ${{ secrets.RENOVATE_GITHUB_TOKEN }} + + e2e-renovate: + runs-on: ubuntu-latest + needs: test-renovate + container: ghcr.io/renovatebot/renovate:42.8.1 + steps: + - name: Checkout + uses: actions/checkout@v5.0.0 + + - name: Run Renovate E2E Script + run: bash scripts/e2e-renovate.sh + env: + RENOVATE_CONFIG_FILE: "/workspace/kovagoadi.hu/Renovate/renovate-config.js" + LOG_LEVEL: "debug" + RENOVATE_TOKEN: ${{ secrets.RENOVATE_TEST_TOKEN }} + GITHUB_COM_TOKEN: ${{ secrets.RENOVATE_GITHUB_TOKEN }} diff --git a/scripts/e2e-renovate.sh b/scripts/e2e-renovate.sh new file mode 100755 index 0000000..e0b6c59 --- /dev/null +++ b/scripts/e2e-renovate.sh @@ -0,0 +1,210 @@ +#!/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.27.5"; 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@v4"; 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!" diff --git a/scripts/test-renovate.sh b/scripts/test-renovate.sh new file mode 100755 index 0000000..ec4ebcc --- /dev/null +++ b/scripts/test-renovate.sh @@ -0,0 +1,131 @@ +#!/bin/bash +set -e + +# Configuration +GITEA_API_URL="https://gitea.kovagoadi.hu/api/v1" +REPO_OWNER="renovate-test" +REPO_NAME="test" +RENOVATE_CONFIG_FILE=${RENOVATE_CONFIG_FILE:-"/workspace/kovagoadi.hu/Renovate/renovate-config.js"} + +# Ensure RENOVATE_TOKEN is available +if [ -z "$RENOVATE_TOKEN" ]; then + echo "Error: RENOVATE_TOKEN is not set." + exit 1 +fi + +# Cleanup function +cleanup() { + echo "Cleaning up..." + # Delete renovate.json from main branch if it exists (to reset state) + 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 + rm -f renovate-output-pre.log renovate-output-post.log +} + +# Register cleanup to run on exit +trap cleanup EXIT + +echo "Validating Renovate configuration..." +renovate-config-validator + +# --- Phase 1: Pre-Onboarding Dry-Run --- +echo "Running Renovate dry-run (Phase 1: Pre-Onboarding)..." +# Ensure repo is clean first +cleanup + +set +e +renovate --dry-run=full > renovate-output-pre.log 2>&1 +RENOVATE_EXIT_CODE=$? +set -e +cat renovate-output-pre.log + +if [ $RENOVATE_EXIT_CODE -ne 0 ]; then + echo "Error: Renovate dry-run (Phase 1) failed." + exit 1 +fi + +echo "Checking for onboarding PR in Phase 1..." +if ! grep -q "Would create onboarding PR" renovate-output-pre.log; then + echo "Error: Expected 'Would create onboarding PR' not found in Phase 1 output." + exit 1 +fi +echo "Phase 1 Passed: Onboarding PR detected." + +# --- Phase 2: Onboarding Simulation --- +echo "Simulating Onboarding..." +# Content of renovate.json (base64 encoded for API if needed, but Gitea API takes content string) +# We'll use a simple config similar to the repo's renovate.json +CONTENT=$(cat < renovate-output-post.log 2>&1 +RENOVATE_EXIT_CODE=$? +set -e +cat renovate-output-post.log + +if [ $RENOVATE_EXIT_CODE -ne 0 ]; then + echo "Error: Renovate dry-run (Phase 3) failed." + exit 1 +fi + +# Specific assertions based on the test repo state (now onboarded) +echo "Checking for expected nginx update..." +if ! grep -q "renovate/nginx-" renovate-output-post.log; then + echo "Error: Expected 'renovate/nginx-' branch not found in Phase 3 output." + exit 1 +fi + +echo "Checking for nginx PR title..." +if ! grep -q "Update nginx Docker tag to" renovate-output-post.log; then + echo "Error: Expected PR title 'Update nginx Docker tag to...' not found." + exit 1 +fi + +echo "Checking for expected actions/checkout update..." +if ! grep -q "renovate/actions-checkout-" renovate-output-post.log; then + echo "Error: Expected 'renovate/actions-checkout-' branch not found in Phase 3 output." + exit 1 +fi + +echo "Checking for actions/checkout PR title..." +if ! grep -q "Update actions/checkout action to" renovate-output-post.log; then + echo "Error: Expected PR title 'Update actions/checkout action to...' not found." + exit 1 +fi + +echo "Phase 3 Passed: Update PRs detected." +echo "All Dry-Run Tests Passed!"