From e41970ed219d55ec279af54af2e5a2ad1aec6495 Mon Sep 17 00:00:00 2001 From: Shreya Keshive Date: Tue, 3 Feb 2026 15:47:54 -0500 Subject: [PATCH] init --- .../release-patch-0-from-comment.yml | 74 +++++++++++++------ .../workflows/release-patch-1-create-pr.yml | 24 +++--- .github/workflows/release-patch-3-release.yml | 14 ++-- 3 files changed, 72 insertions(+), 40 deletions(-) diff --git a/.github/workflows/release-patch-0-from-comment.yml b/.github/workflows/release-patch-0-from-comment.yml index d73ba82abd..974012ca69 100644 --- a/.github/workflows/release-patch-0-from-comment.yml +++ b/.github/workflows/release-patch-0-from-comment.yml @@ -28,22 +28,59 @@ jobs: permission: 'write' issue-type: 'pull-request' - - name: 'Get PR Status' - id: 'pr_status' + - name: 'Get Commits' + id: 'get_commits' if: "startsWith(github.event.comment.body, '/patch')" env: GH_TOKEN: '${{ secrets.GITHUB_TOKEN }}' + COMMENT_BODY: '${{ github.event.comment.body }}' + CURRENT_PR: '${{ github.event.issue.number }}' run: | - gh pr view "${{ github.event.issue.number }}" --json mergeCommit,state > pr_status.json - echo "MERGE_COMMIT_SHA=$(jq -r .mergeCommit.oid pr_status.json)" >> "$GITHUB_OUTPUT" - echo "STATE=$(jq -r .state pr_status.json)" >> "$GITHUB_OUTPUT" + # Find all PR numbers in the comment body (e.g., #123, owner/repo#456) + # The regex handles both formats and extracts just the number + comment_prs=$(echo "$COMMENT_BODY" | grep -oP '(?:\S+/)?\S+#\K\d+') + + # Combine with the current PR number, ensuring no duplicates + all_prs=$(echo -e "${CURRENT_PR}\n${comment_prs}" | sort -u) + + echo "Found PRs to patch: ${all_prs}" + + commit_shas=() + unmerged_prs=() + merged_prs=() + + for pr in $all_prs; do + echo "Checking status of PR #${pr}..." + # Get PR status (state and merge commit) + pr_status=$(gh pr view "$pr" --json mergeCommit,state) + state=$(echo "$pr_status" | jq -r .state) + + if [[ "$state" != "MERGED" ]]; then + unmerged_prs+=("$pr") + else + commit_sha=$(echo "$pr_status" | jq -r .mergeCommit.oid) + commit_shas+=("$commit_sha") + merged_prs+=("$pr") + fi + done + + if [[ ${#unmerged_prs[@]} -gt 0 ]]; then + echo "ALL_MERGED=false" >> "$GITHUB_OUTPUT" + echo "UNMERGED_PRS=$(IFS=,; echo "${unmerged_prs[*]}")" >> "$GITHUB_OUTPUT" + else + echo "ALL_MERGED=true" >> "$GITHUB_OUTPUT" + echo "COMMITS=$(IFS=,; echo "${commit_shas[*]}")" >> "$GITHUB_OUTPUT" + echo "PR_NUMBERS=$(IFS=,; echo "${merged_prs[*]}")" >> "$GITHUB_OUTPUT" + fi - name: 'Dispatch if Merged' - if: "steps.pr_status.outputs.STATE == 'MERGED'" + if: "steps.get_commits.outputs.ALL_MERGED == 'true'" id: 'dispatch_patch' uses: 'actions/github-script@00f12e3e20659f42342b1c0226afda7f7c042325' env: COMMENT_BODY: '${{ github.event.comment.body }}' + COMMITS: '${{ steps.get_commits.outputs.COMMITS }}' + PR_NUMBERS: '${{ steps.get_commits.outputs.PR_NUMBERS }}' with: github-token: '${{ secrets.GITHUB_TOKEN }}' script: | @@ -60,17 +97,10 @@ jobs: // /patch preview if (commentBody.trim() === '/patch' || commentBody.trim() === '/patch both') { channels = ['stable', 'preview']; - } else if (commentBody.trim() === '/patch stable') { + } else if (commentBody.includes('stable')) { channels = ['stable']; - } else if (commentBody.trim() === '/patch preview') { + } else if (commentBody.includes('preview')) { channels = ['preview']; - } else { - // Fallback parsing for legacy formats - if (commentBody.includes('channel=preview')) { - channels = ['preview']; - } else if (commentBody.includes('--channel preview')) { - channels = ['preview']; - } } console.log('Detected channels:', channels); @@ -87,9 +117,9 @@ jobs: workflow_id: 'release-patch-1-create-pr.yml', ref: 'main', inputs: { - commit: '${{ steps.pr_status.outputs.MERGE_COMMIT_SHA }}', + commits: process.env.COMMITS, channel: channel, - original_pr: '${{ github.event.issue.number }}', + original_prs: process.env.PR_NUMBERS, environment: 'prod' } }); @@ -123,13 +153,13 @@ jobs: } - name: 'Comment on Failure' - if: "startsWith(github.event.comment.body, '/patch') && steps.pr_status.outputs.STATE != 'MERGED'" + if: "startsWith(github.event.comment.body, '/patch') && steps.get_commits.outputs.ALL_MERGED == 'false'" uses: 'peter-evans/create-or-update-comment@67dcc547d311b736a8e6c5c236542148a47adc3d' with: token: '${{ secrets.GITHUB_TOKEN }}' issue-number: '${{ github.event.issue.number }}' body: | - :x: The `/patch` command failed. This pull request must be merged before a patch can be created. + :x: The `/patch` command failed. The following pull request(s) must be merged before a patch can be created: #${{ steps.get_commits.outputs.UNMERGED_PRS }} - name: 'Final Status Comment - Success' if: "always() && startsWith(github.event.comment.body, '/patch') && steps.dispatch_patch.outcome == 'success' && steps.dispatch_patch.outputs.dispatched_run_urls" @@ -142,7 +172,8 @@ jobs: **📋 Details:** - **Channels**: `${{ steps.dispatch_patch.outputs.dispatched_channels }}` - - **Commit**: `${{ steps.pr_status.outputs.MERGE_COMMIT_SHA }}` + - **PRs**: `${{ steps.get_commits.outputs.PR_NUMBERS }}` + - **Commits**: `${{ steps.get_commits.outputs.COMMITS }}` - **Workflows Created**: ${{ steps.dispatch_patch.outputs.dispatched_run_count }} **🔗 Track Progress:** @@ -160,7 +191,8 @@ jobs: **📋 Details:** - **Channels**: `${{ steps.dispatch_patch.outputs.dispatched_channels }}` - - **Commit**: `${{ steps.pr_status.outputs.MERGE_COMMIT_SHA }}` + - **PRs**: `${{ steps.get_commits.outputs.PR_NUMBERS }}` + - **Commits**: `${{ steps.get_commits.outputs.COMMITS }}` - **Workflows Created**: ${{ steps.dispatch_patch.outputs.dispatched_run_count }} **🔗 Track Progress:** diff --git a/.github/workflows/release-patch-1-create-pr.yml b/.github/workflows/release-patch-1-create-pr.yml index d19fc8e8b4..50762948be 100644 --- a/.github/workflows/release-patch-1-create-pr.yml +++ b/.github/workflows/release-patch-1-create-pr.yml @@ -1,13 +1,13 @@ name: 'Release: Patch (1) Create PR' run-name: >- - Release Patch (1) Create PR | S:${{ inputs.channel }} | C:${{ inputs.commit }} ${{ inputs.original_pr && format('| PR:#{0}', inputs.original_pr) || '' }} + Release Patch (1) Create PR | S:${{ inputs.channel }} | C:${{ inputs.commits }} ${{ inputs.original_prs && format('| PRs:#{0}', inputs.original_prs) || '' }} on: workflow_dispatch: inputs: - commit: - description: 'The commit SHA to cherry-pick for the patch.' + commits: + description: 'The commit SHAs to cherry-pick for the patch (comma-separated).' required: true type: 'string' channel: @@ -27,8 +27,8 @@ on: required: false type: 'string' default: 'main' - original_pr: - description: 'The original PR number to comment back on.' + original_prs: + description: 'The original PR numbers to comment back on (comma-separated).' required: false type: 'string' environment: @@ -85,9 +85,9 @@ jobs: GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}' GH_TOKEN: '${{ secrets.GEMINI_CLI_ROBOT_GITHUB_PAT }}' CLI_PACKAGE_NAME: '${{ vars.CLI_PACKAGE_NAME }}' - PATCH_COMMIT: '${{ github.event.inputs.commit }}' + PATCH_COMMITS: '${{ github.event.inputs.commits }}' PATCH_CHANNEL: '${{ github.event.inputs.channel }}' - ORIGINAL_PR: '${{ github.event.inputs.original_pr }}' + ORIGINAL_PRS: '${{ github.event.inputs.original_prs }}' DRY_RUN: '${{ github.event.inputs.dry_run }}' continue-on-error: true run: | @@ -95,9 +95,9 @@ jobs: { node scripts/releasing/create-patch-pr.js \ --cli-package-name="${CLI_PACKAGE_NAME}" \ - --commit="${PATCH_COMMIT}" \ + --commits="${PATCH_COMMITS}" \ --channel="${PATCH_CHANNEL}" \ - --pullRequestNumber="${ORIGINAL_PR}" \ + --pullRequestNumbers="${ORIGINAL_PRS}" \ --dry-run="${DRY_RUN}" } 2>&1 | tee >( echo "LOG_CONTENT<> "$GITHUB_ENV" @@ -107,12 +107,12 @@ jobs: echo "EXIT_CODE=${PIPESTATUS[0]}" >> "$GITHUB_OUTPUT" - name: 'Comment on Original PR' - if: 'always() && inputs.original_pr' + if: 'always() && inputs.original_prs' env: GH_TOKEN: '${{ secrets.GITHUB_TOKEN }}' - ORIGINAL_PR: '${{ github.event.inputs.original_pr }}' + ORIGINAL_PRS: '${{ github.event.inputs.original_prs }}' EXIT_CODE: '${{ steps.create_patch.outputs.EXIT_CODE }}' - COMMIT: '${{ github.event.inputs.commit }}' + COMMITS: '${{ github.event.inputs.commits }}' CHANNEL: '${{ github.event.inputs.channel }}' REPOSITORY: '${{ github.repository }}' GITHUB_RUN_ID: '${{ github.run_id }}' diff --git a/.github/workflows/release-patch-3-release.yml b/.github/workflows/release-patch-3-release.yml index 19241b7396..0c2ccac0f7 100644 --- a/.github/workflows/release-patch-3-release.yml +++ b/.github/workflows/release-patch-3-release.yml @@ -1,7 +1,7 @@ name: 'Release: Patch (3) Release' run-name: >- - Release Patch (3) Release | T:${{ inputs.type }} | R:${{ inputs.release_ref }} ${{ inputs.original_pr && format('| PR:#{0}', inputs.original_pr) || '' }} + Release Patch (3) Release | T:${{ inputs.type }} | R:${{ inputs.release_ref }} ${{ inputs.original_prs && format('| PRs:#{0}', inputs.original_prs) || '' }} on: workflow_dispatch: @@ -27,8 +27,8 @@ on: description: 'The branch, tag, or SHA to release from.' required: true type: 'string' - original_pr: - description: 'The original PR number to comment back on.' + original_prs: + description: 'The original PR numbers to comment back on.' required: false type: 'string' environment: @@ -208,10 +208,10 @@ jobs: --label 'release-failure,priority/p0' - name: 'Comment Success on Original PR' - if: '${{ success() && github.event.inputs.original_pr }}' + if: '${{ success() && github.event.inputs.original_prs }}' env: GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}' - ORIGINAL_PR: '${{ github.event.inputs.original_pr }}' + ORIGINAL_PRS: '${{ github.event.inputs.original_prs }}' SUCCESS: 'true' RELEASE_VERSION: '${{ steps.patch_version.outputs.RELEASE_VERSION }}' RELEASE_TAG: '${{ steps.patch_version.outputs.RELEASE_TAG }}' @@ -225,10 +225,10 @@ jobs: node scripts/releasing/patch-comment.js - name: 'Comment Failure on Original PR' - if: '${{ failure() && github.event.inputs.original_pr }}' + if: '${{ failure() && github.event.inputs.original_prs }}' env: GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}' - ORIGINAL_PR: '${{ github.event.inputs.original_pr }}' + ORIGINAL_PRS: '${{ github.event.inputs.original_prs }}' SUCCESS: 'false' RELEASE_VERSION: '${{ steps.patch_version.outputs.RELEASE_VERSION }}' RELEASE_TAG: '${{ steps.patch_version.outputs.RELEASE_TAG }}'