name: Update WhatsApp Version on: schedule: # Run daily at 06:00 UTC (when WhatsApp typically deploys updates) - cron: '0 6 * * *' workflow_dispatch: inputs: force: description: 'Force create PR even if version unchanged (useful for re-triggering)' required: false default: 'false' type: boolean permissions: contents: write pull-requests: write # Note: Auto-merge may require additional permissions depending on repository settings. # If auto-merge fails, consider using a Personal Access Token (PAT) or GitHub App token # with 'pull-requests: write' and 'contents: write' scopes. 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 # 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 }}" # 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" fi git push origin "$BRANCH_NAME" # Create PR using GitHub CLI PR_BODY="Automated WhatsApp Web version update. This PR updates the WhatsApp Web client revision to the latest version fetched from \`web.whatsapp.com\`. **Single source of truth:** - \`src/Defaults/baileys-version.json\` (other files import from here) **Update frequency:** Daily at 06: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 "chore: update WhatsApp Web version" \ --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 "🔀 Merging PR #$PR_NUMBER via squash..." # Brief wait for GitHub to compute PR mergeability sleep 5 gh pr merge "$PR_NUMBER" \ --repo "${{ github.repository }}" \ --squash \ --delete-branch \ --yes echo "✅ PR #$PR_NUMBER merged successfully" - 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 }}" 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