name: Update WAProto on: schedule: - cron: '0 3 * * *' workflow_dispatch: # Dynamic run name with run number run-name: "Update WAProto #${{ github.run_number }}" permissions: contents: write pull-requests: write actions: write jobs: update-proto: runs-on: ubuntu-latest timeout-minutes: 10 steps: - uses: actions/checkout@v3 - name: Install Node uses: actions/setup-node@v3 with: node-version: 20.x - name: Enable Corepack and Set Yarn Version run: | corepack enable corepack prepare yarn@4.x --activate - name: Configure Git for HTTPS env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | # Force git to use HTTPS instead of SSH for GitHub repositories git config --global url."https://github.com/".insteadOf "ssh://git@github.com/" git config --global url."https://github.com/".insteadOf "git@github.com:" # Configure git to use GITHUB_TOKEN for authentication git config --global url."https://x-access-token:${GITHUB_TOKEN}@github.com/".insteadOf "https://github.com/" - name: Install packages run: | yarn install --immutable yarn --cwd proto-extract install --immutable - name: Update WAProto.proto id: wa_proto_info run: | yarn --cwd proto-extract start > wa-logs.txt WA_VERSION=$(cat wa-logs.txt | perl -n -e'/Current version\: (.+)/ && print $1') WA_JS_URL=$(cat wa-logs.txt | perl -n -e'/Found source JS URL\: (.+)/ && print $1') echo "wa_version=$WA_VERSION" >> $GITHUB_OUTPUT echo "wa_js_url=$WA_JS_URL" >> $GITHUB_OUTPUT # Display version prominently echo "📱 WhatsApp Proto Version: v$WA_VERSION" echo "🔗 Source JS URL: $WA_JS_URL" - name: GenerateStatics run: yarn gen:protobuf - name: Update baileys-version.json run: | WA_VERSION="${{steps.wa_proto_info.outputs.wa_version}}" WA_NUMBERS=$(echo $WA_VERSION | sed "s/\./, /g") echo "{\"version\": [$WA_NUMBERS]}" > src/Defaults/baileys-version.json # Confirm update echo "✅ Updated baileys-version.json to v$WA_VERSION" cat src/Defaults/baileys-version.json - name: Create Pull Request id: create_pr uses: peter-evans/create-pull-request@v5 with: commit-message: 'chore: update proto/version to v${{steps.wa_proto_info.outputs.wa_version}}' title: 'chore: update WhatsApp proto to v${{steps.wa_proto_info.outputs.wa_version}}' branch: 'update-proto/stable' delete-branch: true labels: 'update-proto' body: | ## đŸ“Ļ Automated WhatsApp Proto Update **Version:** `v${{steps.wa_proto_info.outputs.wa_version}}` **Source JS URL:** ${{steps.wa_proto_info.outputs.wa_js_url}} ### Changes - ✅ Updated `WAProto/*` (protobuf definitions) - ✅ Updated `src/Defaults/baileys-version.json` ### Update Frequency Daily at 03:00 UTC (00:00 BRT) add-paths: | WAProto/* src/Defaults/baileys-version.json - name: Enable Auto-merge if: steps.create_pr.outputs.pull-request-number != '' env: GH_TOKEN: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }} run: | PR_NUMBER="${{ steps.create_pr.outputs.pull-request-number }}" WA_VERSION="${{ steps.wa_proto_info.outputs.wa_version }}" echo "🔀 Enabling auto-merge for PR #$PR_NUMBER (v$WA_VERSION)..." # Enable auto-merge with squash method set +e AUTO_MERGE_OUTPUT=$(gh pr merge "$PR_NUMBER" \ --repo "${{ github.repository }}" \ --squash \ --auto \ --delete-branch 2>&1) AUTO_MERGE_EXIT=$? set -e if [ $AUTO_MERGE_EXIT -eq 0 ]; then echo "✅ Auto-merge enabled for PR #$PR_NUMBER (v$WA_VERSION)" echo "$AUTO_MERGE_OUTPUT" echo "âŗ PR will be merged automatically once all checks pass" else echo "::warning::Failed to enable auto-merge for PR #$PR_NUMBER (v$WA_VERSION)" echo "::group::Auto-merge Error Output" echo "$AUTO_MERGE_OUTPUT" echo "::endgroup::" # Fall back to waiting for checks and then merging echo "🔄 Falling back to wait-and-merge strategy..." # Wait for checks to start echo "âŗ Waiting 30 seconds for checks to start..." sleep 30 # Wait for checks to complete (max 5 minutes) echo "âŗ Waiting for checks to complete..." WAIT_COUNT=0 MAX_WAIT=60 # 60 * 5 seconds = 5 minutes while [ $WAIT_COUNT -lt $MAX_WAIT ]; do set +e CHECK_STATUS=$(gh pr checks "$PR_NUMBER" --repo "${{ github.repository }}" 2>&1) CHECK_EXIT=$? set -e if [ $CHECK_EXIT -eq 0 ]; then echo "📊 Current check status:" echo "$CHECK_STATUS" # Check if all checks passed if echo "$CHECK_STATUS" | grep -q "All checks have passed"; then echo "✅ All checks passed!" break fi # Check if any check failed if echo "$CHECK_STATUS" | grep -qE "(fail|failure|error)"; then echo "❌ Some checks failed, aborting merge" exit 1 fi fi WAIT_COUNT=$((WAIT_COUNT + 1)) echo "âŗ Waiting... ($WAIT_COUNT/$MAX_WAIT)" sleep 5 done if [ $WAIT_COUNT -ge $MAX_WAIT ]; then echo "::warning::Timeout waiting for checks to complete" echo "::warning::PR #$PR_NUMBER requires manual merge: https://github.com/${{ github.repository }}/pull/$PR_NUMBER" exit 0 fi # Try to merge now that checks passed echo "🔀 Attempting to merge PR #$PR_NUMBER..." set +e MERGE_OUTPUT=$(gh pr merge "$PR_NUMBER" \ --repo "${{ github.repository }}" \ --squash \ --delete-branch \ --yes 2>&1) MERGE_EXIT=$? set -e if [ $MERGE_EXIT -eq 0 ]; then echo "✅ PR #$PR_NUMBER (v$WA_VERSION) merged successfully" echo "$MERGE_OUTPUT" else echo "::error::Failed to merge PR #$PR_NUMBER (v$WA_VERSION)" echo "::group::Merge Error Output" echo "$MERGE_OUTPUT" echo "::endgroup::" # Try with admin flag echo "🔧 Attempting merge with admin override..." set +e ADMIN_OUTPUT=$(gh pr merge "$PR_NUMBER" \ --repo "${{ github.repository }}" \ --squash \ --delete-branch \ --admin 2>&1) ADMIN_EXIT=$? set -e if [ $ADMIN_EXIT -eq 0 ]; then echo "✅ PR #$PR_NUMBER (v$WA_VERSION) merged with admin override" echo "$ADMIN_OUTPUT" else echo "::error::Failed to merge even with admin override" echo "::group::Admin Merge Error Output" echo "$ADMIN_OUTPUT" echo "::endgroup::" echo "::warning::Consider configuring a Personal Access Token (PAT) with full repo permissions as GH_PAT secret" echo "::warning::PR #$PR_NUMBER requires manual merge: https://github.com/${{ github.repository }}/pull/$PR_NUMBER" exit 0 fi fi fi - name: Summary if: always() run: | echo "### đŸ“Ļ WAProto Update" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY WA_VERSION="${{ steps.wa_proto_info.outputs.wa_version }}" WA_JS_URL="${{ steps.wa_proto_info.outputs.wa_js_url }}" PR_NUMBER="${{ steps.create_pr.outputs.pull-request-number }}" echo "**Version:** \`v$WA_VERSION\`" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY if [ -n "$PR_NUMBER" ]; then echo "✅ **PR #$PR_NUMBER created with auto-merge enabled**" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "**Changes:**" >> $GITHUB_STEP_SUMMARY echo "- đŸ“Ļ Updated WAProto/* (protobuf definitions)" >> $GITHUB_STEP_SUMMARY echo "- 📝 Updated baileys-version.json" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "**Source:** [$WA_JS_URL]($WA_JS_URL)" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "🔀 PR will merge automatically once checks pass" >> $GITHUB_STEP_SUMMARY else echo "â„šī¸ No changes detected - already up to date" >> $GITHUB_STEP_SUMMARY fi