diff --git a/.github/workflows/chromatic.yaml b/.github/workflows/chromatic.yaml index ed2314e80..127186d68 100644 --- a/.github/workflows/chromatic.yaml +++ b/.github/workflows/chromatic.yaml @@ -12,9 +12,6 @@ jobs: runs-on: ubuntu-latest # Only run for PRs from version-bump-* branches or manual triggers if: github.event_name == 'workflow_dispatch' || startsWith(github.head_ref, 'version-bump-') - permissions: - pull-requests: write - issues: write steps: - name: Checkout code uses: actions/checkout@v4 @@ -32,29 +29,6 @@ jobs: node-version: '20' cache: 'pnpm' - - name: Get current time - id: current-time - run: echo "time=$(date -u '+%m/%d/%Y, %I:%M:%S %p')" >> $GITHUB_OUTPUT - - - name: Comment PR - Build Started - if: github.event_name == 'pull_request' - continue-on-error: true - uses: edumserrano/find-create-or-update-comment@v3 - with: - issue-number: ${{ github.event.pull_request.number }} - body-includes: '' - comment-author: 'github-actions[bot]' - edit-mode: append - body: | - - ## ๐ŸŽจ Storybook Build Status - - ๐Ÿ”„ **Building Storybook and running visual tests...** - - โณ Build started at: ${{ steps.current-time.outputs.time }} UTC - - --- - *This comment will be updated when the build completes* - name: Cache tool outputs uses: actions/cache@v4 @@ -81,37 +55,3 @@ jobs: autoAcceptChanges: 'main' # Auto-accept changes on main branch exitOnceUploaded: true # Don't wait for UI tests to complete - - name: Get completion time - id: completion-time - if: always() - run: echo "time=$(date -u '+%m/%d/%Y, %I:%M:%S %p')" >> $GITHUB_OUTPUT - - - name: Comment PR - Build Complete - if: github.event_name == 'pull_request' && always() - continue-on-error: true - uses: edumserrano/find-create-or-update-comment@v3 - with: - issue-number: ${{ github.event.pull_request.number }} - body-includes: '' - comment-author: 'github-actions[bot]' - edit-mode: replace - body: | - - ## ๐ŸŽจ Storybook Build Status - - ${{ steps.chromatic.outcome == 'success' && 'โœ…' || 'โŒ' }} **${{ steps.chromatic.outcome == 'success' && 'Build completed successfully!' || 'Build failed!' }}** - - โฐ Completed at: ${{ steps.completion-time.outputs.time }} UTC - - ### ๐Ÿ“Š Build Summary - - **Components**: ${{ steps.chromatic.outputs.componentCount || '0' }} - - **Stories**: ${{ steps.chromatic.outputs.testCount || '0' }} - - **Visual changes**: ${{ steps.chromatic.outputs.changeCount || '0' }} - - **Errors**: ${{ steps.chromatic.outputs.errorCount || '0' }} - - ### ๐Ÿ”— Links - ${{ steps.chromatic.outputs.buildUrl && format('- [๐Ÿ“ธ View Chromatic Build]({0})', steps.chromatic.outputs.buildUrl) || '' }} - ${{ steps.chromatic.outputs.storybookUrl && format('- [๐Ÿ“– Preview Storybook]({0})', steps.chromatic.outputs.storybookUrl) || '' }} - - --- - ${{ steps.chromatic.outcome == 'success' && '๐ŸŽ‰ Your Storybook is ready for review!' || 'โš ๏ธ Please check the workflow logs for error details.' }} diff --git a/.github/workflows/pr-playwright-comment.yaml b/.github/workflows/pr-playwright-comment.yaml new file mode 100644 index 000000000..d5cf93589 --- /dev/null +++ b/.github/workflows/pr-playwright-comment.yaml @@ -0,0 +1,163 @@ +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 "โณ **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 new file mode 100644 index 000000000..53db00ff3 --- /dev/null +++ b/.github/workflows/pr-playwright-deploy.yaml @@ -0,0 +1,101 @@ +name: PR Playwright Deploy + +on: + workflow_run: + workflows: ["Tests CI"] + types: [completed] + +jobs: + deploy-reports: + runs-on: ubuntu-latest + if: github.repository == 'Comfy-Org/ComfyUI_frontend' && github.event.workflow_run.event == 'pull_request' + permissions: + actions: read + strategy: + fail-fast: false + matrix: + browser: [chromium, chromium-2x, chromium-0.5x, mobile-chrome] + steps: + - name: Get PR info + id: pr-info + 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 { number: null, sanitized_branch: null }; + } + + const pr = pullRequests[0]; + const branchName = context.payload.workflow_run.head_branch; + const sanitizedBranch = branchName.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/--+/g, '-').replace(/^-|-$/g, ''); + + return { + number: pr.number, + sanitized_branch: sanitizedBranch + }; + + - name: Set project name + if: fromJSON(steps.pr-info.outputs.result).number != null + id: project-name + run: | + if [ "${{ matrix.browser }}" = "chromium-0.5x" ]; then + echo "name=comfyui-playwright-chromium-0-5x" >> $GITHUB_OUTPUT + else + echo "name=comfyui-playwright-${{ matrix.browser }}" >> $GITHUB_OUTPUT + fi + echo "branch=${{ fromJSON(steps.pr-info.outputs.result).sanitized_branch }}" >> $GITHUB_OUTPUT + + - name: Download playwright report + if: fromJSON(steps.pr-info.outputs.result).number != null + uses: actions/download-artifact@v4 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + run-id: ${{ github.event.workflow_run.id }} + name: playwright-report-${{ matrix.browser }} + path: playwright-report + + - name: Install Wrangler + if: fromJSON(steps.pr-info.outputs.result).number != null + run: npm install -g wrangler + + - name: Deploy to Cloudflare Pages (${{ matrix.browser }}) + if: fromJSON(steps.pr-info.outputs.result).number != null + id: cloudflare-deploy + continue-on-error: true + run: | + # Retry logic for wrangler deploy (3 attempts) + RETRY_COUNT=0 + MAX_RETRIES=3 + SUCCESS=false + + 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 + SUCCESS=true + echo "Deployment successful on attempt $RETRY_COUNT" + else + echo "Deployment failed on attempt $RETRY_COUNT" + if [ $RETRY_COUNT -lt $MAX_RETRIES ]; then + echo "Retrying in 10 seconds..." + sleep 10 + fi + fi + done + + if [ $SUCCESS = false ]; then + echo "All deployment attempts failed" + exit 1 + fi + env: + CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} + CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} \ No newline at end of file diff --git a/.github/workflows/pr-storybook-comment.yaml b/.github/workflows/pr-storybook-comment.yaml new file mode 100644 index 000000000..e8ce291d7 --- /dev/null +++ b/.github/workflows/pr-storybook-comment.yaml @@ -0,0 +1,108 @@ +name: PR Storybook Comment + +on: + workflow_run: + workflows: ['Chromatic'] + types: [requested, completed] + +jobs: + comment-storybook: + 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: Get workflow run details + if: steps.pr.outputs.result != 'null' && github.event.action == 'completed' + id: workflow-run + uses: actions/github-script@v7 + with: + script: | + const run = await github.rest.actions.getWorkflowRun({ + owner: context.repo.owner, + repo: context.repo.repo, + run_id: context.payload.workflow_run.id, + }); + + return { + conclusion: run.data.conclusion, + html_url: run.data.html_url + }; + + - name: Get completion time + id: completion-time + run: echo "time=$(date -u '+%m/%d/%Y, %I:%M:%S %p')" >> $GITHUB_OUTPUT + + - name: Comment PR - Storybook 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: | + + ## ๐ŸŽจ Storybook Build Status + + โณ **Build is starting...** + + โฐ Started at: ${{ steps.completion-time.outputs.time }} UTC + + ### ๐Ÿš€ Building Storybook + - ๐Ÿ“ฆ Installing dependencies... + - ๐Ÿ”ง Building Storybook components... + - ๐ŸŽจ Running Chromatic visual tests... + + --- + โฑ๏ธ Please wait while the Storybook build is in progress... + + - name: Comment PR - Storybook 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: | + + ## ๐ŸŽจ Storybook Build Status + + ${{ fromJSON(steps.workflow-run.outputs.result).conclusion == 'success' && 'โœ…' || 'โŒ' }} **${{ fromJSON(steps.workflow-run.outputs.result).conclusion == 'success' && 'Build completed successfully!' || 'Build failed!' }}** + + โฐ Completed at: ${{ steps.completion-time.outputs.time }} UTC + + ### ๐Ÿ”— Links + - [๐Ÿ“Š View Workflow Run](${{ fromJSON(steps.workflow-run.outputs.result).html_url }}) + + --- + ${{ fromJSON(steps.workflow-run.outputs.result).conclusion == 'success' && '๐ŸŽ‰ Your Storybook is ready for review!' || 'โš ๏ธ Please check the workflow logs for error details.' }} diff --git a/.github/workflows/test-ui.yaml b/.github/workflows/test-ui.yaml index 3838e98b0..99b3727ce 100644 --- a/.github/workflows/test-ui.yaml +++ b/.github/workflows/test-ui.yaml @@ -7,15 +7,11 @@ on: branches-ignore: [wip/*, draft/*, temp/*, vue-nodes-migration, sno-playwright-*] -env: - DATE_FORMAT: '+%m/%d/%Y, %I:%M:%S %p' - jobs: setup: runs-on: ubuntu-latest outputs: cache-key: ${{ steps.cache-key.outputs.key }} - sanitized-branch: ${{ steps.branch-info.outputs.sanitized }} steps: - name: Checkout ComfyUI uses: actions/checkout@v4 @@ -48,29 +44,6 @@ jobs: cache: 'pnpm' cache-dependency-path: 'ComfyUI_frontend/pnpm-lock.yaml' - - name: Get current time - id: current-time - run: echo "time=$(date -u '${{ env.DATE_FORMAT }}')" >> $GITHUB_OUTPUT - - - name: Comment PR - Tests Started - if: github.event_name == 'pull_request' - continue-on-error: true - uses: edumserrano/find-create-or-update-comment@v3 - with: - issue-number: ${{ github.event.pull_request.number }} - body-includes: '' - comment-author: 'github-actions[bot]' - edit-mode: append - body: | - - - --- - - comfy-loading-gif - [${{ steps.current-time.outputs.time }} UTC] Preparing browser tests across multiple browsers... - - --- - *This comment will be updated when tests complete* - name: Cache tool outputs uses: actions/cache@v4 @@ -94,14 +67,6 @@ jobs: id: cache-key run: echo "key=$(date +%s)" >> $GITHUB_OUTPUT - - name: Generate sanitized branch name - id: branch-info - run: | - # Get branch name and sanitize it for Cloudflare branch names - BRANCH_NAME="${{ github.head_ref || github.ref_name }}" - SANITIZED_BRANCH=$(echo "$BRANCH_NAME" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9-]/-/g' | sed 's/--*/-/g' | sed 's/^-\|-$//g') - echo "sanitized=${SANITIZED_BRANCH}" >> $GITHUB_OUTPUT - - name: Save cache uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 with: @@ -114,8 +79,6 @@ jobs: needs: setup runs-on: ubuntu-latest permissions: - pull-requests: write - issues: write contents: read strategy: fail-fast: false @@ -144,32 +107,6 @@ jobs: python-version: '3.10' cache: 'pip' - - name: Get current time - id: current-time - run: echo "time=$(date -u '${{ env.DATE_FORMAT }}')" >> $GITHUB_OUTPUT - - - name: Set project name - id: project-name - run: | - if [ "${{ matrix.browser }}" = "chromium-0.5x" ]; then - echo "name=comfyui-playwright-chromium-0-5x" >> $GITHUB_OUTPUT - else - echo "name=comfyui-playwright-${{ matrix.browser }}" >> $GITHUB_OUTPUT - fi - echo "branch=${{ needs.setup.outputs.sanitized-branch }}" >> $GITHUB_OUTPUT - - - name: Comment PR - Browser Test Started - if: github.event_name == 'pull_request' - continue-on-error: true - uses: edumserrano/find-create-or-update-comment@v3 - with: - issue-number: ${{ github.event.pull_request.number }} - body-includes: '' - comment-author: 'github-actions[bot]' - edit-mode: append - body: | - comfy-loading-gif - ${{ matrix.browser }}: Running tests... - name: Install requirements run: | @@ -198,9 +135,6 @@ jobs: run: npx playwright install chromium --with-deps working-directory: ComfyUI_frontend - - name: Install Wrangler - run: pnpm install -g wrangler - - name: Run Playwright tests (${{ matrix.browser }}) id: playwright run: npx playwright test --project=${{ matrix.browser }} --reporter=html @@ -213,181 +147,3 @@ jobs: path: ComfyUI_frontend/playwright-report/ retention-days: 30 - - name: Deploy to Cloudflare Pages (${{ matrix.browser }}) - id: cloudflare-deploy - if: always() - continue-on-error: true - run: | - # Retry logic for wrangler deploy (3 attempts) - RETRY_COUNT=0 - MAX_RETRIES=3 - SUCCESS=false - - 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 ComfyUI_frontend/playwright-report --project-name=${{ steps.project-name.outputs.name }} --branch=${{ steps.project-name.outputs.branch }}; then - SUCCESS=true - echo "Deployment successful on attempt $RETRY_COUNT" - else - echo "Deployment failed on attempt $RETRY_COUNT" - if [ $RETRY_COUNT -lt $MAX_RETRIES ]; then - echo "Retrying in 10 seconds..." - sleep 10 - fi - fi - done - - if [ $SUCCESS = false ]; then - echo "All deployment attempts failed" - exit 1 - fi - env: - CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} - CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} - - - name: Save deployment info for summary - if: always() - run: | - mkdir -p deployment-info - # Use step conclusion to determine test result - if [ "${{ steps.playwright.conclusion }}" = "success" ]; then - EXIT_CODE="0" - else - EXIT_CODE="1" - fi - DEPLOYMENT_URL="${{ steps.cloudflare-deploy.outputs.deployment-url || steps.cloudflare-deploy.outputs.url || format('https://{0}.{1}.pages.dev', steps.project-name.outputs.branch, steps.project-name.outputs.name) }}" - echo "${{ matrix.browser }}|${EXIT_CODE}|${DEPLOYMENT_URL}" > deployment-info/${{ matrix.browser }}.txt - - - name: Upload deployment info - if: always() - uses: actions/upload-artifact@v4 - with: - name: deployment-info-${{ matrix.browser }} - path: deployment-info/ - retention-days: 1 - - - name: Get completion time - id: completion-time - if: always() - run: echo "time=$(date -u '${{ env.DATE_FORMAT }}')" >> $GITHUB_OUTPUT - - - name: Comment PR - Browser Test Complete - if: always() && github.event_name == 'pull_request' - continue-on-error: true - uses: edumserrano/find-create-or-update-comment@v3 - with: - issue-number: ${{ github.event.pull_request.number }} - body-includes: '' - comment-author: 'github-actions[bot]' - edit-mode: append - body: | - ${{ steps.playwright.conclusion == 'success' && 'โœ…' || 'โŒ' }} **${{ matrix.browser }}**: ${{ steps.playwright.conclusion == 'success' && 'Tests passed!' || 'Tests failed!' }} [View Report](${{ steps.cloudflare-deploy.outputs.deployment-url || format('https://{0}.{1}.pages.dev', steps.project-name.outputs.branch, steps.project-name.outputs.name) }}) - - comment-summary: - needs: playwright-tests - runs-on: ubuntu-latest - if: always() && github.event_name == 'pull_request' - permissions: - pull-requests: write - steps: - - name: Download all deployment info - uses: actions/download-artifact@v4 - with: - 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 - id: comment-body - 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) - - 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 - continue-on-error: true - uses: edumserrano/find-create-or-update-comment@v3 - with: - issue-number: ${{ github.event.pull_request.number }} - body-includes: '' - comment-author: 'github-actions[bot]' - edit-mode: replace - body-path: comment.md - - - name: Check test results and fail if needed - run: | - # Check if all tests passed and fail the job if not - ALL_PASSED=true - for file in deployment-info/*.txt; do - if [ -f "$file" ]; then - 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" = "false" ]; then - echo "โŒ Tests failed in one or more browsers. Failing the CI job." - exit 1 - else - echo "โœ… All tests passed across all browsers!" - fi