diff --git a/.github/workflows/pr-playwright-comment.yaml b/.github/workflows/pr-playwright-comment.yaml deleted file mode 100644 index 554b5c3b8d..0000000000 --- a/.github/workflows/pr-playwright-comment.yaml +++ /dev/null @@ -1,163 +0,0 @@ -name: PR Playwright Comment - -on: - workflow_run: - workflows: ['Tests CI'] - types: [requested, completed] - -env: - DATE_FORMAT: '+%m/%d/%Y, %I:%M:%S %p' - -jobs: - comment-summary: - runs-on: ubuntu-latest - if: github.repository == 'Comfy-Org/ComfyUI_frontend' && github.event.workflow_run.event == 'pull_request' - permissions: - pull-requests: write - actions: read - steps: - - name: Get PR number - id: pr - uses: actions/github-script@v7 - with: - script: | - const { data: pullRequests } = await github.rest.pulls.list({ - owner: context.repo.owner, - repo: context.repo.repo, - state: 'open', - head: `${context.repo.owner}:${context.payload.workflow_run.head_branch}`, - }); - - if (pullRequests.length === 0) { - console.log('No open PR found for this branch'); - return null; - } - - return pullRequests[0].number; - - - name: Log when no PR found - if: steps.pr.outputs.result == 'null' - run: | - echo "โš ๏ธ No open PR found for branch: ${{ github.event.workflow_run.head_branch }}" - echo "Workflow run ID: ${{ github.event.workflow_run.id }}" - echo "Repository: ${{ github.event.workflow_run.repository.full_name }}" - echo "Event: ${{ github.event.workflow_run.event }}" - - - name: Generate comment body for start - if: steps.pr.outputs.result != 'null' && github.event.action == 'requested' - id: comment-body-start - run: | - echo "" > comment.md - echo "## ๐ŸŽญ Playwright Test Results" >> comment.md - echo "" >> comment.md - echo "comfy-loading-gif **Tests are starting...** " >> comment.md - echo "" >> comment.md - echo "โฐ Started at: ${{ steps.completion-time.outputs.time }} UTC" >> comment.md - echo "" >> comment.md - echo "### ๐Ÿš€ Running Tests" >> comment.md - echo "- ๐Ÿงช **chromium**: Running tests..." >> comment.md - echo "- ๐Ÿงช **chromium-0.5x**: Running tests..." >> comment.md - echo "- ๐Ÿงช **chromium-2x**: Running tests..." >> comment.md - echo "- ๐Ÿงช **mobile-chrome**: Running tests..." >> comment.md - echo "" >> comment.md - echo "---" >> comment.md - echo "โฑ๏ธ Please wait while tests are running across all browsers..." >> comment.md - - - name: Download all deployment info - if: steps.pr.outputs.result != 'null' && github.event.action == 'completed' - uses: actions/download-artifact@v4 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - run-id: ${{ github.event.workflow_run.id }} - pattern: deployment-info-* - merge-multiple: true - path: deployment-info - - - name: Get completion time - id: completion-time - run: echo "time=$(date -u '${{ env.DATE_FORMAT }}')" >> $GITHUB_OUTPUT - - - name: Generate comment body for completion - if: steps.pr.outputs.result != 'null' && github.event.action == 'completed' - id: comment-body-completed - run: | - echo "" > comment.md - echo "## ๐ŸŽญ Playwright Test Results" >> comment.md - echo "" >> comment.md - - # Check if all tests passed - ALL_PASSED=true - for file in deployment-info/*.txt; do - if [ -f "$file" ]; then - browser=$(basename "$file" .txt) - info=$(cat "$file") - exit_code=$(echo "$info" | cut -d'|' -f2) - if [ "$exit_code" != "0" ]; then - ALL_PASSED=false - break - fi - fi - done - - if [ "$ALL_PASSED" = "true" ]; then - echo "โœ… **All tests passed across all browsers!**" >> comment.md - else - echo "โŒ **Some tests failed!**" >> comment.md - fi - - echo "" >> comment.md - echo "โฐ Completed at: ${{ steps.completion-time.outputs.time }} UTC" >> comment.md - echo "" >> comment.md - echo "### ๐Ÿ“Š Test Reports by Browser" >> comment.md - - for file in deployment-info/*.txt; do - if [ -f "$file" ]; then - browser=$(basename "$file" .txt) - info=$(cat "$file") - exit_code=$(echo "$info" | cut -d'|' -f2) - url=$(echo "$info" | cut -d'|' -f3) - - # Validate URLs before using them in comments - sanitized_url=$(echo "$url" | grep -E '^https://[a-z0-9.-]+\.pages\.dev(/.*)?$' || echo "INVALID_URL") - if [ "$sanitized_url" = "INVALID_URL" ]; then - echo "Invalid deployment URL detected: $url" - url="#" # Use safe fallback - fi - - if [ "$exit_code" = "0" ]; then - status="โœ…" - else - status="โŒ" - fi - - echo "- $status **$browser**: [View Report]($url)" >> comment.md - fi - done - - echo "" >> comment.md - echo "---" >> comment.md - if [ "$ALL_PASSED" = "true" ]; then - echo "๐ŸŽ‰ Your tests are passing across all browsers!" >> comment.md - else - echo "โš ๏ธ Please check the test reports for details on failures." >> comment.md - fi - - - name: Comment PR - Tests Started - if: steps.pr.outputs.result != 'null' && github.event.action == 'requested' - uses: edumserrano/find-create-or-update-comment@82880b65c8a3a6e4c70aa05a204995b6c9696f53 # v3.0.0 - with: - issue-number: ${{ steps.pr.outputs.result }} - body-includes: '' - comment-author: 'github-actions[bot]' - edit-mode: replace - body-path: comment.md - - - name: Comment PR - Tests Complete - if: steps.pr.outputs.result != 'null' && github.event.action == 'completed' - uses: edumserrano/find-create-or-update-comment@82880b65c8a3a6e4c70aa05a204995b6c9696f53 # v3.0.0 - with: - issue-number: ${{ steps.pr.outputs.result }} - body-includes: '' - comment-author: 'github-actions[bot]' - edit-mode: replace - body-path: comment.md diff --git a/.github/workflows/pr-playwright-deploy.yaml b/.github/workflows/pr-playwright-deploy.yaml index 53db00ff35..2f6020bf9f 100644 --- a/.github/workflows/pr-playwright-deploy.yaml +++ b/.github/workflows/pr-playwright-deploy.yaml @@ -1,14 +1,17 @@ -name: PR Playwright Deploy +name: PR Playwright Deploy and Comment on: workflow_run: workflows: ["Tests CI"] - types: [completed] + types: [requested, completed] + +env: + DATE_FORMAT: '+%m/%d/%Y, %I:%M:%S %p' jobs: deploy-reports: runs-on: ubuntu-latest - if: github.repository == 'Comfy-Org/ComfyUI_frontend' && github.event.workflow_run.event == 'pull_request' + if: github.repository == 'Comfy-Org/ComfyUI_frontend' && github.event.workflow_run.event == 'pull_request' && github.event.action == 'completed' permissions: actions: read strategy: @@ -34,6 +37,8 @@ jobs: } const pr = pullRequests[0]; + console.log(`โœ… Found PR #${pr.number} for branch: ${context.payload.workflow_run.head_branch}`); + console.log(`PR number is: ${pr.number}`); const branchName = context.payload.workflow_run.head_branch; const sanitizedBranch = branchName.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/--+/g, '-').replace(/^-|-$/g, ''); @@ -75,14 +80,38 @@ jobs: RETRY_COUNT=0 MAX_RETRIES=3 SUCCESS=false + DEPLOYMENT_URL="" while [ $RETRY_COUNT -lt $MAX_RETRIES ] && [ $SUCCESS = false ]; do RETRY_COUNT=$((RETRY_COUNT + 1)) echo "Deployment attempt $RETRY_COUNT of $MAX_RETRIES..." - if npx wrangler pages deploy playwright-report --project-name=${{ steps.project-name.outputs.name }} --branch=${{ steps.project-name.outputs.branch }}; then + # Capture wrangler output to extract deployment URL + OUTPUT=$(npx wrangler pages deploy playwright-report --project-name=${{ steps.project-name.outputs.name }} --branch=${{ steps.project-name.outputs.branch }} 2>&1) + EXIT_CODE=$? + + echo "$OUTPUT" + + if [ $EXIT_CODE -eq 0 ]; then SUCCESS=true echo "Deployment successful on attempt $RETRY_COUNT" + # Extract the deployment URL from wrangler output + # Look for the URL in various formats that wrangler might output + DEPLOYMENT_URL=$(echo "$OUTPUT" | grep -oE 'https://[a-z0-9.-]+\.pages\.dev(/[^[:space:]]*)?$' | head -1) + if [ -z "$DEPLOYMENT_URL" ]; then + # Try another pattern if the first one fails + DEPLOYMENT_URL=$(echo "$OUTPUT" | grep -oE 'https://[^[:space:]]+\.pages\.dev' | head -1) + fi + if [ -n "$DEPLOYMENT_URL" ]; then + echo "Deployment URL: $DEPLOYMENT_URL" + echo "url=$DEPLOYMENT_URL" >> $GITHUB_OUTPUT + else + echo "Warning: Could not extract deployment URL from wrangler output" + # Construct expected URL as fallback + FALLBACK_URL="https://${{ steps.project-name.outputs.name }}-${{ steps.project-name.outputs.branch }}.pages.dev" + echo "Using fallback URL: $FALLBACK_URL" + echo "url=$FALLBACK_URL" >> $GITHUB_OUTPUT + fi else echo "Deployment failed on attempt $RETRY_COUNT" if [ $RETRY_COUNT -lt $MAX_RETRIES ]; then @@ -98,4 +127,210 @@ jobs: fi env: CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} - CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} \ No newline at end of file + CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + + - name: Save deployment info + if: fromJSON(steps.pr-info.outputs.result).number != null && always() + run: | + # Read test exit code from the artifact + TEST_EXIT_CODE="1" + if [ -f "playwright-report/test-exit-code.txt" ]; then + TEST_EXIT_CODE=$(cat playwright-report/test-exit-code.txt) + fi + + # Use deployment URL if available, otherwise use a fallback + URL="${{ steps.cloudflare-deploy.outputs.url }}" + if [ -z "$URL" ] || [ "${{ steps.cloudflare-deploy.outcome }}" != "success" ]; then + URL="https://${{ steps.project-name.outputs.name }}-${{ steps.project-name.outputs.branch }}.pages.dev" + fi + + echo "${{ matrix.browser }}|$TEST_EXIT_CODE|$URL" > deployment-info.txt + echo "Saved deployment info: ${{ matrix.browser }}|$TEST_EXIT_CODE|$URL" + + - name: Upload deployment info + if: fromJSON(steps.pr-info.outputs.result).number != null && always() + uses: actions/upload-artifact@v4 + with: + name: deployment-info-${{ matrix.browser }} + path: deployment-info.txt + retention-days: 1 + + comment-tests-starting: + runs-on: ubuntu-latest + if: github.repository == 'Comfy-Org/ComfyUI_frontend' && github.event.workflow_run.event == 'pull_request' && github.event.action == 'requested' + permissions: + pull-requests: write + actions: read + steps: + - name: Get PR number + id: pr + uses: actions/github-script@v7 + with: + script: | + const { data: pullRequests } = await github.rest.pulls.list({ + owner: context.repo.owner, + repo: context.repo.repo, + state: 'open', + head: `${context.repo.owner}:${context.payload.workflow_run.head_branch}`, + }); + + if (pullRequests.length === 0) { + console.log('No open PR found for this branch'); + return null; + } + + const prNumber = pullRequests[0].number; + console.log(`โœ… Found PR #${prNumber} for branch: ${context.payload.workflow_run.head_branch}`); + return prNumber; + + - name: Get completion time + id: completion-time + run: echo "time=$(date -u '${{ env.DATE_FORMAT }}')" >> $GITHUB_OUTPUT + + - name: Generate comment body for start + if: steps.pr.outputs.result != 'null' + id: comment-body-start + run: | + echo "" > comment.md + echo "## ๐ŸŽญ Playwright Test Results" >> comment.md + echo "" >> comment.md + echo "comfy-loading-gif **Tests are starting...** " >> comment.md + echo "" >> comment.md + echo "โฐ Started at: ${{ steps.completion-time.outputs.time }} UTC" >> comment.md + echo "" >> comment.md + echo "### ๐Ÿš€ Running Tests" >> comment.md + echo "- ๐Ÿงช **chromium**: Running tests..." >> comment.md + echo "- ๐Ÿงช **chromium-0.5x**: Running tests..." >> comment.md + echo "- ๐Ÿงช **chromium-2x**: Running tests..." >> comment.md + echo "- ๐Ÿงช **mobile-chrome**: Running tests..." >> comment.md + echo "" >> comment.md + echo "---" >> comment.md + echo "โฑ๏ธ Please wait while tests are running across all browsers..." >> comment.md + + - name: Comment PR - Tests Started + if: steps.pr.outputs.result != 'null' + uses: edumserrano/find-create-or-update-comment@82880b65c8a3a6e4c70aa05a204995b6c9696f53 # v3.0.0 + with: + issue-number: ${{ steps.pr.outputs.result }} + body-includes: '' + comment-author: 'github-actions[bot]' + edit-mode: replace + body-path: comment.md + + comment-tests-completed: + runs-on: ubuntu-latest + needs: deploy-reports + if: github.repository == 'Comfy-Org/ComfyUI_frontend' && github.event.workflow_run.event == 'pull_request' && github.event.action == 'completed' && always() + permissions: + pull-requests: write + actions: read + steps: + - name: Get PR number + id: pr + uses: actions/github-script@v7 + with: + script: | + const { data: pullRequests } = await github.rest.pulls.list({ + owner: context.repo.owner, + repo: context.repo.repo, + state: 'open', + head: `${context.repo.owner}:${context.payload.workflow_run.head_branch}`, + }); + + if (pullRequests.length === 0) { + console.log('No open PR found for this branch'); + return null; + } + + const prNumber = pullRequests[0].number; + console.log(`โœ… Found PR #${prNumber} for branch: ${context.payload.workflow_run.head_branch}`); + return prNumber; + + - name: Download all deployment info + if: steps.pr.outputs.result != 'null' + uses: actions/download-artifact@v4 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + run-id: ${{ github.event.workflow_run.id }} + pattern: deployment-info-* + merge-multiple: true + path: deployment-info + + - name: Get completion time + id: completion-time + run: echo "time=$(date -u '${{ env.DATE_FORMAT }}')" >> $GITHUB_OUTPUT + + - name: Generate comment body for completion + if: steps.pr.outputs.result != 'null' + id: comment-body-completed + run: | + echo "" > comment.md + echo "## ๐ŸŽญ Playwright Test Results" >> comment.md + echo "" >> comment.md + + # Check if all tests passed + ALL_PASSED=true + for file in deployment-info/*.txt; do + if [ -f "$file" ]; then + browser=$(basename "$file" .txt) + info=$(cat "$file") + exit_code=$(echo "$info" | cut -d'|' -f2) + if [ "$exit_code" != "0" ]; then + ALL_PASSED=false + break + fi + fi + done + + if [ "$ALL_PASSED" = "true" ]; then + echo "โœ… **All tests passed across all browsers!**" >> comment.md + else + echo "โŒ **Some tests failed!**" >> comment.md + fi + + echo "" >> comment.md + echo "โฐ Completed at: ${{ steps.completion-time.outputs.time }} UTC" >> comment.md + echo "" >> comment.md + echo "### ๐Ÿ“Š Test Reports by Browser" >> comment.md + + for file in deployment-info/*.txt; do + if [ -f "$file" ]; then + browser=$(basename "$file" .txt) + info=$(cat "$file") + exit_code=$(echo "$info" | cut -d'|' -f2) + url=$(echo "$info" | cut -d'|' -f3) + + # Validate URLs before using them in comments + sanitized_url=$(echo "$url" | grep -E '^https://[a-z0-9.-]+\.pages\.dev(/.*)?$' || echo "INVALID_URL") + if [ "$sanitized_url" = "INVALID_URL" ]; then + echo "Invalid deployment URL detected: $url" + url="#" # Use safe fallback + fi + + if [ "$exit_code" = "0" ]; then + status="โœ…" + else + status="โŒ" + fi + + echo "- $status **$browser**: [View Report]($url)" >> comment.md + fi + done + + echo "" >> comment.md + echo "---" >> comment.md + if [ "$ALL_PASSED" = "true" ]; then + echo "๐ŸŽ‰ Your tests are passing across all browsers!" >> comment.md + else + echo "โš ๏ธ Please check the test reports for details on failures." >> comment.md + fi + + - name: Comment PR - Tests Complete + if: steps.pr.outputs.result != 'null' + uses: edumserrano/find-create-or-update-comment@82880b65c8a3a6e4c70aa05a204995b6c9696f53 # v3.0.0 + with: + issue-number: ${{ steps.pr.outputs.result }} + body-includes: '' + comment-author: 'github-actions[bot]' + edit-mode: replace + body-path: comment.md \ No newline at end of file diff --git a/.github/workflows/test-ui.yaml b/.github/workflows/test-ui.yaml index 99b3727ce4..881810e5d2 100644 --- a/.github/workflows/test-ui.yaml +++ b/.github/workflows/test-ui.yaml @@ -139,11 +139,20 @@ jobs: id: playwright run: npx playwright test --project=${{ matrix.browser }} --reporter=html working-directory: ComfyUI_frontend + continue-on-error: true + + - name: Save test exit code + if: always() + run: | + echo "${{ steps.playwright.outcome == 'success' && '0' || '1' }}" > test-exit-code.txt + echo "Test outcome: ${{ steps.playwright.outcome }}" - uses: actions/upload-artifact@v4 if: always() # note: use always() to allow results to be upload/report even tests failed. with: name: playwright-report-${{ matrix.browser }} - path: ComfyUI_frontend/playwright-report/ + path: | + ComfyUI_frontend/playwright-report/ + test-exit-code.txt retention-days: 30