Update WhatsApp Version 99 #99
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Update WhatsApp Version | |
| on: | |
| schedule: | |
| # Run daily at 09:00 UTC (optimized timing after WhatsApp deploys) | |
| - cron: '0 9 * * *' | |
| workflow_dispatch: | |
| inputs: | |
| force: | |
| description: 'Force create PR even if version unchanged (useful for re-triggering)' | |
| required: false | |
| default: 'false' | |
| type: boolean | |
| # Dynamic run name with version | |
| run-name: "Update WhatsApp Version ${{ github.run_number }}" | |
| permissions: | |
| contents: write | |
| pull-requests: write | |
| actions: write | |
| jobs: | |
| update-version: | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 10 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Setup Node and Corepack | |
| uses: actions/setup-node@v4 | |
| 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 | |
| # IMPORTANT: Order matters! More specific rules first, then general ones | |
| git config --global url."https://github.com/".insteadOf "ssh://git@github.com/" | |
| git config --global url."https://github.com/".insteadOf "git@github.com:" | |
| # Configure authentication (last so it doesn't interfere with SSH -> HTTPS conversion) | |
| git config --global url."https://x-access-token:${GITHUB_TOKEN}@github.com/".insteadOf "https://github.com/" | |
| # Verify git config applied correctly | |
| echo "β Git URL rewrites configured for HTTPS" | |
| git config --global --get-regexp url | |
| - name: Restore Yarn Cache | |
| uses: actions/cache@v4 | |
| id: yarn-cache | |
| with: | |
| path: | | |
| node_modules | |
| .yarn/cache | |
| .yarn/install-state.gz | |
| key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} | |
| restore-keys: | | |
| ${{ runner.os }}-yarn- | |
| - name: Install packages | |
| run: yarn install --immutable | |
| - name: Update WhatsApp Web Version | |
| id: update_version | |
| run: | | |
| # Run the update script, capture exit code | |
| # Exit codes: 0=success, 1=error, 2=fetch failed (fallback used) | |
| set +e | |
| yarn update:version | |
| EXIT_CODE=$? | |
| set -e | |
| echo "exit_code=$EXIT_CODE" >> $GITHUB_OUTPUT | |
| # Read and output the updated version | |
| VERSION=$(cat src/Defaults/baileys-version.json | grep -oP '"version":\s*\[\s*\K[0-9,\s]+' | tr -d ' ') | |
| VERSION_STRING=$(echo $VERSION | sed 's/,/./g') | |
| echo "version=$VERSION_STRING" >> $GITHUB_OUTPUT | |
| echo "π± WhatsApp Version: $VERSION_STRING" | |
| # Only fail on fatal errors (exit code 1) | |
| if [ $EXIT_CODE -eq 1 ]; then | |
| echo "::error::Script failed with fatal error" | |
| exit 1 | |
| fi | |
| # Exit code 2 means fetch failed but fallback was used - this is a warning | |
| if [ $EXIT_CODE -eq 2 ]; then | |
| echo "::warning::Could not fetch latest version from WhatsApp servers" | |
| fi | |
| - name: Check for changes | |
| id: check_changes | |
| run: | | |
| FORCE="${{ inputs.force }}" | |
| if git diff --quiet; then | |
| echo "has_changes=false" >> $GITHUB_OUTPUT | |
| if [ "$FORCE" == "true" ]; then | |
| echo "force_mode=true" >> $GITHUB_OUTPUT | |
| echo "::notice::Force mode enabled - will create PR even without changes" | |
| else | |
| echo "force_mode=false" >> $GITHUB_OUTPUT | |
| fi | |
| else | |
| echo "has_changes=true" >> $GITHUB_OUTPUT | |
| echo "force_mode=false" >> $GITHUB_OUTPUT | |
| fi | |
| - name: Create Pull Request | |
| id: create_pr | |
| if: steps.check_changes.outputs.has_changes == 'true' || steps.check_changes.outputs.force_mode == 'true' | |
| env: | |
| GH_TOKEN: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }} | |
| run: | | |
| BRANCH_NAME="update-version/stable" | |
| FORCE="${{ inputs.force }}" | |
| VERSION="${{ steps.update_version.outputs.version }}" | |
| # Configure git | |
| git config user.name "github-actions[bot]" | |
| git config user.email "github-actions[bot]@users.noreply.github.com" | |
| # Check if branch exists and delete it | |
| git push origin --delete "$BRANCH_NAME" 2>/dev/null || true | |
| # Create new branch | |
| git checkout -b "$BRANCH_NAME" | |
| # Only add the single source of truth file | |
| git add src/Defaults/baileys-version.json | |
| # Create commit (allow empty if force mode) | |
| if [ "$FORCE" == "true" ] && git diff --cached --quiet; then | |
| git commit --allow-empty -m "chore: force WhatsApp Web version check" | |
| else | |
| git commit -m "chore: update WhatsApp Web version to v$VERSION" | |
| fi | |
| git push origin "$BRANCH_NAME" | |
| # Create PR using GitHub CLI with version in title | |
| PR_TITLE="chore: update WhatsApp Web version to v$VERSION" | |
| PR_BODY="Automated WhatsApp Web version update. | |
| This PR updates the WhatsApp Web client revision to the latest version fetched from \`web.whatsapp.com\`. | |
| **Version:** \`$VERSION\` | |
| **Single source of truth:** | |
| - \`src/Defaults/baileys-version.json\` (other files import from here) | |
| **Update frequency:** Daily at 09:00 UTC" | |
| if [ "$FORCE" == "true" ]; then | |
| PR_BODY="$PR_BODY | |
| > **Note:** This PR was created with force mode enabled." | |
| fi | |
| # Create PR (compatible with older gh CLI versions) | |
| set +e | |
| PR_URL=$(gh pr create \ | |
| --title "$PR_TITLE" \ | |
| --body "$PR_BODY" \ | |
| --base master \ | |
| --head "$BRANCH_NAME" 2>&1) | |
| PR_CREATE_EXIT=$? | |
| set -e | |
| if [ $PR_CREATE_EXIT -eq 0 ]; then | |
| echo "β PR created successfully: $PR_URL" | |
| # Extract PR number from URL | |
| PR_NUMBER=$(echo "$PR_URL" | grep -oP '\d+$') | |
| echo "π PR Number: #$PR_NUMBER" | |
| # Save PR number for next step | |
| echo "pr_number=$PR_NUMBER" >> $GITHUB_OUTPUT | |
| else | |
| # PR creation failed - could be duplicate or other error | |
| echo "β οΈ Could not create PR. Checking if PR already exists..." | |
| # Check for existing PR (without --json for compatibility) | |
| EXISTING_PR=$(gh pr list --head "$BRANCH_NAME" --state open 2>/dev/null | head -1) | |
| if [ -n "$EXISTING_PR" ]; then | |
| echo "βΉοΈ PR already exists for branch $BRANCH_NAME" | |
| echo "$EXISTING_PR" | |
| # Extract PR number from existing PR | |
| PR_NUMBER=$(echo "$EXISTING_PR" | grep -oP '^\d+') | |
| if [ -n "$PR_NUMBER" ]; then | |
| echo "π Existing PR Number: #$PR_NUMBER" | |
| # Save PR number for auto-merge step | |
| echo "pr_number=$PR_NUMBER" >> $GITHUB_OUTPUT | |
| fi | |
| else | |
| echo "β PR creation failed with error:" | |
| echo "$PR_URL" | |
| fi | |
| fi | |
| - name: Auto-merge PR | |
| if: steps.create_pr.outputs.pr_number != '' | |
| env: | |
| GH_TOKEN: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }} | |
| run: | | |
| PR_NUMBER="${{ steps.create_pr.outputs.pr_number }}" | |
| echo "π Attempting to merge PR #$PR_NUMBER via squash..." | |
| # Check PR status | |
| set +e | |
| PR_STATE=$(gh pr view "$PR_NUMBER" --repo "${{ github.repository }}" --json state --jq '.state' 2>&1) | |
| PR_VIEW_EXIT=$? | |
| set -e | |
| if [ $PR_VIEW_EXIT -ne 0 ] || [ -z "$PR_STATE" ]; then | |
| echo "β οΈ Could not retrieve PR state, attempting merge anyway..." | |
| else | |
| echo "π PR State: $PR_STATE" | |
| if [ "$PR_STATE" != "OPEN" ]; then | |
| echo "β οΈ PR is not open (state: $PR_STATE), skipping merge" | |
| exit 0 | |
| fi | |
| fi | |
| # Brief wait for GitHub to compute PR mergeability | |
| sleep 5 | |
| # Check if PR is mergeable | |
| set +e | |
| MERGEABLE=$(gh pr view "$PR_NUMBER" --repo "${{ github.repository }}" --json mergeable --jq '.mergeable' 2>&1) | |
| set -e | |
| echo "π Mergeable: $MERGEABLE" | |
| # Attempt merge with error handling | |
| 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 merged successfully" | |
| echo "$MERGE_OUTPUT" | |
| else | |
| echo "::warning::Standard merge failed for PR #$PR_NUMBER" | |
| echo "::group::Merge Error Output" | |
| echo "$MERGE_OUTPUT" | |
| echo "::endgroup::" | |
| # Try with admin flag (bypasses branch protection if user has admin rights) | |
| 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 merged successfully with admin override" | |
| echo "$ADMIN_OUTPUT" | |
| else | |
| echo "::error::Failed to merge PR #$PR_NUMBER 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 was created but requires manual merge: https://github.com/${{ github.repository }}/pull/$PR_NUMBER" | |
| # Don't exit with error to avoid blocking the workflow | |
| exit 0 | |
| fi | |
| fi | |
| - name: Summary | |
| run: | | |
| echo "### WhatsApp Version Update" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| EXIT_CODE="${{ steps.update_version.outputs.exit_code }}" | |
| HAS_CHANGES="${{ steps.check_changes.outputs.has_changes }}" | |
| FORCE_MODE="${{ steps.check_changes.outputs.force_mode }}" | |
| VERSION="${{ steps.update_version.outputs.version }}" | |
| echo "**Version:** \`$VERSION\`" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| if [ "$EXIT_CODE" == "2" ]; then | |
| echo "β οΈ Warning: Could not fetch latest version from WhatsApp servers" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| fi | |
| if [ "$HAS_CHANGES" == "true" ]; then | |
| echo "β New version detected and PR created" >> $GITHUB_STEP_SUMMARY | |
| elif [ "$FORCE_MODE" == "true" ]; then | |
| echo "π Force mode: PR created (no version change)" >> $GITHUB_STEP_SUMMARY | |
| else | |
| echo "βΉοΈ Already up to date" >> $GITHUB_STEP_SUMMARY | |
| fi |