From 01517fcf06f8185cf214487d9d0ba300182e2cdf Mon Sep 17 00:00:00 2001 From: Ganga4060 Date: Thu, 13 Nov 2025 07:32:24 +0000 Subject: [PATCH 1/3] feat: added fallback for finding pr number --- .github/workflows/export_cloud_build_logs.yml | 45 ++++++++++++------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/.github/workflows/export_cloud_build_logs.yml b/.github/workflows/export_cloud_build_logs.yml index b05e8d36..f320d40c 100644 --- a/.github/workflows/export_cloud_build_logs.yml +++ b/.github/workflows/export_cloud_build_logs.yml @@ -47,32 +47,45 @@ jobs: 'langchain-python-sdk-pr-', 'llamaindex-python-sdk-pr-', ]; - const prList = context.payload.check_suite.pull_requests; - if (!prList || prList.length === 0) { - core.info('No PR found for this check suite. Skipping.'); - core.setOutput('failure_detected', 'false'); - return; - } - const pr_number = prList[0].number; - core.setOutput('pr_number', pr_number.toString()); - const { owner, repo } = context.repo; - const sha = context.payload.check_suite.head_sha; - const { data: checks } = await github.rest.checks.listForRef({ owner, repo, ref: sha, per_page: 100 }); + let pr_number = undefined; + const { owner, repo } = context.repo; + const sha = context.payload.check_suite.head_sha; + if (context.payload.check_suite && context.payload.check_suite.pull_requests && context.payload.check_suite.pull_requests.length > 0) { + pr_number = context.payload.check_suite.pull_requests[0].number; + } + if (!pr_number) { + const { data: prs } = await github.rest.pulls.list({ + owner, + repo, + state: 'open', + per_page: 100 + }); + const match = prs.find(pr => pr.head && pr.head.sha === sha); + if (match) { + pr_number = match.number; + } + } + if (!pr_number) { + core.info('No PR found for this check suite or commit. Skipping.'); + core.setOutput('failure_detected', 'false'); + return; + } + core.setOutput('pr_number', pr_number.toString()); + const { data: checks } = await github.rest.checks.listForRef({ owner, repo, ref: sha, per_page: 100 }); const failed = checks.check_runs.filter( - c => + c => prefixes.some(prefix => c.name.startsWith(prefix)) && c.status === 'completed' && c.conclusion === 'failure' ); if (failed.length === 0) { - core.info('No failed Cloud Build checks detected.'); - core.setOutput('failure_detected', 'false'); - return; + core.info('No failed Cloud Build checks detected.'); + core.setOutput('failure_detected', 'false'); + return; } core.info(`Detected ${failed.length} failed build(s).`); core.setOutput('failure_detected', 'true'); core.setOutput('failed_checks', JSON.stringify(failed.map(f => ({ name: f.name, id: f.id, html_url: f.html_url, details_url: f.details_url, external_id: f.external_id || '' })))); - process-failed-builds: needs: detect-build-failure From 5ca8ad9954a49d2bb14b66edb92390b23e82cf79 Mon Sep 17 00:00:00 2001 From: Ganga4060 Date: Thu, 20 Nov 2025 07:27:24 +0000 Subject: [PATCH 2/3] fix: PR detection with pagination --- .github/workflows/export_cloud_build_logs.yml | 32 +++++++++++++------ 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/.github/workflows/export_cloud_build_logs.yml b/.github/workflows/export_cloud_build_logs.yml index f320d40c..cf84d2e4 100644 --- a/.github/workflows/export_cloud_build_logs.yml +++ b/.github/workflows/export_cloud_build_logs.yml @@ -47,22 +47,34 @@ jobs: 'langchain-python-sdk-pr-', 'llamaindex-python-sdk-pr-', ]; - let pr_number = undefined; + let pr_number = undefined; const { owner, repo } = context.repo; const sha = context.payload.check_suite.head_sha; if (context.payload.check_suite && context.payload.check_suite.pull_requests && context.payload.check_suite.pull_requests.length > 0) { pr_number = context.payload.check_suite.pull_requests[0].number; } + //paginate through all open PRs to find matching head SHA if (!pr_number) { - const { data: prs } = await github.rest.pulls.list({ - owner, - repo, - state: 'open', - per_page: 100 - }); - const match = prs.find(pr => pr.head && pr.head.sha === sha); - if (match) { - pr_number = match.number; + let page = 1; + let found = false; + while (!found) { + const { data: prs } = await github.rest.pulls.list({ + owner, + repo, + state: 'open', + per_page: 100, + page + }); + if (!prs || prs.length === 0) { + break; + } + const match = prs.find(pr => pr.head && pr.head.sha === sha); + if (match) { + pr_number = match.number; + found = true; + } else { + page++; + } } } if (!pr_number) { From 23dbfe9f6fb2531cefd182df8ca15deb0f1216a2 Mon Sep 17 00:00:00 2001 From: Ganga4060 Date: Mon, 24 Nov 2025 11:42:32 +0000 Subject: [PATCH 3/3] Update export cloud build logs workflow --- .github/workflows/export_cloud_build_logs.yml | 82 +++++++++---------- 1 file changed, 37 insertions(+), 45 deletions(-) diff --git a/.github/workflows/export_cloud_build_logs.yml b/.github/workflows/export_cloud_build_logs.yml index cf84d2e4..0a443840 100644 --- a/.github/workflows/export_cloud_build_logs.yml +++ b/.github/workflows/export_cloud_build_logs.yml @@ -34,11 +34,34 @@ jobs: outputs: failure_detected: ${{ steps.detect_failures.outputs.failure_detected }} failed_checks: ${{ steps.detect_failures.outputs.failed_checks }} - pr_number: ${{ steps.detect_failures.outputs.pr_number }} + pr_number: ${{ steps.detect_pr_number.outputs.pr_number }} steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install GitHub CLI + run: sudo apt-get update && sudo apt-get install -y gh + + - name: Detect PR number using gh CLI + id: detect_pr_number + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + PR_NUMBER=$(gh pr list --search "${{ github.event.check_suite.head_sha }}" --state open --json number --jq '.[0].number') + if [ -z "$PR_NUMBER" ]; then + echo "No associated PR found." + echo "failure_detected=false" >> $GITHUB_OUTPUT + exit 0 + else + echo "PR Number is $PR_NUMBER" + echo "pr_number=$PR_NUMBER" >> $GITHUB_OUTPUT + fi + - name: Detect all failed Cloud Build checks id: detect_failures - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + uses: actions/github-script@v8 + env: + PR_NUMBER: ${{ steps.detect_pr_number.outputs.pr_number }} with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | @@ -47,57 +70,27 @@ jobs: 'langchain-python-sdk-pr-', 'llamaindex-python-sdk-pr-', ]; - let pr_number = undefined; - const { owner, repo } = context.repo; - const sha = context.payload.check_suite.head_sha; - if (context.payload.check_suite && context.payload.check_suite.pull_requests && context.payload.check_suite.pull_requests.length > 0) { - pr_number = context.payload.check_suite.pull_requests[0].number; - } - //paginate through all open PRs to find matching head SHA - if (!pr_number) { - let page = 1; - let found = false; - while (!found) { - const { data: prs } = await github.rest.pulls.list({ - owner, - repo, - state: 'open', - per_page: 100, - page - }); - if (!prs || prs.length === 0) { - break; - } - const match = prs.find(pr => pr.head && pr.head.sha === sha); - if (match) { - pr_number = match.number; - found = true; - } else { - page++; - } - } - } - if (!pr_number) { - core.info('No PR found for this check suite or commit. Skipping.'); - core.setOutput('failure_detected', 'false'); - return; - } - core.setOutput('pr_number', pr_number.toString()); - const { data: checks } = await github.rest.checks.listForRef({ owner, repo, ref: sha, per_page: 100 }); + const pr_number = process.env.PR_NUMBER; + if (!pr_number) { + core.setOutput('failure_detected', 'false'); + return; + } + const { owner, repo } = context.repo; + const sha = context.payload.check_suite.head_sha; + const { data: checks } = await github.rest.checks.listForRef({ owner, repo, ref: sha, per_page: 100 }); const failed = checks.check_runs.filter( - c => + c => prefixes.some(prefix => c.name.startsWith(prefix)) && c.status === 'completed' && c.conclusion === 'failure' ); if (failed.length === 0) { - core.info('No failed Cloud Build checks detected.'); - core.setOutput('failure_detected', 'false'); - return; + core.setOutput('failure_detected', 'false'); + return; } - core.info(`Detected ${failed.length} failed build(s).`); core.setOutput('failure_detected', 'true'); core.setOutput('failed_checks', JSON.stringify(failed.map(f => ({ name: f.name, id: f.id, html_url: f.html_url, details_url: f.details_url, external_id: f.external_id || '' })))); + core.setOutput('pr_number', pr_number); process-failed-builds: needs: detect-build-failure @@ -204,4 +197,3 @@ jobs: } else { core.info('No failures found and no existing comment to delete.'); } -