Skip to content

Commit 8b08d20

Browse files
xwang233claude
andauthored
Fix auto-merge CI trigger and remove label after PR close/merge (#5571)
## Summary Fix GitHub CI trigger issue and clean up the `enable-auto-merge` label when PRs are closed or merged. ## Changes - Fix CI trigger issue that prevented auto-merge from detecting nvfuser-ci completion - Add `cleanup-label` job that removes label on any PR close event - Add label removal in auto-merge job after successful merge - Update auto-merge job condition to exclude `closed` events ## Why Both Label Removal Paths Are Needed - **Auto-merge path**: Removes label when this workflow merges the PR - **Cleanup-label path**: Removes label when PR is manually merged/closed - Due to GITHUB_TOKEN protection, the cleanup-label job won't trigger when auto-merge closes a PR, so both are necessary ## Benefits - Auto-merge now properly triggers when nvfuser-ci completes - Prevents stale label if merged PRs are reopened - Cleans up label regardless of merge method (auto vs manual) - More efficient: cleanup-label only runs for PRs with the label 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude <[email protected]>
1 parent 9d2893c commit 8b08d20

File tree

3 files changed

+112
-7
lines changed

3 files changed

+112
-7
lines changed

.github/workflows/auto-merge.yml

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ on:
1414
check_run:
1515
types:
1616
- completed
17-
status: {}
17+
repository_dispatch:
18+
types:
19+
- nvfuser-ci-success
1820

1921
jobs:
2022
auto-merge:
@@ -32,7 +34,7 @@ jobs:
3234
(github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'enable-auto-merge')) ||
3335
(github.event_name == 'pull_request_review' && github.event.review.state == 'approved' && contains(github.event.pull_request.labels.*.name, 'enable-auto-merge')) ||
3436
(github.event_name == 'check_run' && github.event.check_run.conclusion == 'success' && github.event.check_run.pull_requests[0] != null) ||
35-
(github.event_name == 'status' && github.event.state == 'success' && github.event.context == 'nvfuser-ci')
37+
(github.event_name == 'repository_dispatch' && github.event.action == 'nvfuser-ci-success')
3638
3739
steps:
3840
- name: Get PR details
@@ -43,13 +45,27 @@ jobs:
4345
let pr;
4446
if (context.payload.pull_request) {
4547
pr = context.payload.pull_request;
48+
} else if (context.eventName === 'repository_dispatch') {
49+
// For repository_dispatch events, get PR number from client_payload
50+
const pr_number = context.payload.client_payload.pr_number;
51+
if (!pr_number) {
52+
core.info('No PR number in repository_dispatch payload');
53+
return { should_skip: true };
54+
}
55+
56+
const { data } = await github.rest.pulls.get({
57+
owner: context.repo.owner,
58+
repo: context.repo.repo,
59+
pull_number: pr_number,
60+
});
61+
pr = data;
4662
} else {
47-
// For status/check_run events, we need to find the PR
63+
// For check_run events, we need to find the PR
4864
const prs = await github.rest.pulls.list({
4965
owner: context.repo.owner,
5066
repo: context.repo.repo,
5167
state: 'open',
52-
head: `${context.repo.owner}:${context.payload.check_run?.head_branch || context.payload.branches?.[0]?.name}`,
68+
head: `${context.repo.owner}:${context.payload.check_run?.head_branch}`,
5369
});
5470
5571
if (prs.data.length === 0) {
@@ -391,16 +407,31 @@ jobs:
391407
});
392408
393409
core.info(`✅ Successfully merged PR #${pr_number}`);
410+
411+
// Remove the label after successful merge to prevent stale state
412+
try {
413+
await github.rest.issues.removeLabel({
414+
owner: context.repo.owner,
415+
repo: context.repo.repo,
416+
issue_number: pr_number,
417+
name: 'enable-auto-merge',
418+
});
419+
core.info('Removed enable-auto-merge label');
420+
} catch (labelError) {
421+
// Label might already be removed, ignore error
422+
core.info(`Could not remove label (may already be removed): ${labelError.message}`);
423+
}
394424
} catch (error) {
395425
core.setFailed(`Failed to merge PR: ${error.message}`);
396426
397427
// Notify maintainers about the merge failure
398428
try {
429+
const runUrl = `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`;
399430
await github.rest.issues.createComment({
400431
owner: context.repo.owner,
401432
repo: context.repo.repo,
402433
issue_number: pr_number,
403-
body: `⚠️ Auto-merge failed. Please review and merge manually. cc @xwang233`,
434+
body: `⚠️ Auto-merge failed. Please review and merge manually.\n\nWorkflow run: ${runUrl}\n\ncc @xwang233`,
404435
});
405436
core.info('Posted merge failure notification comment');
406437
} catch (commentError) {
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# SPDX-FileCopyrightText: Copyright (c) 2023-present NVIDIA CORPORATION & AFFILIATES.
2+
# All rights reserved.
3+
# SPDX-License-Identifier: BSD-3-Clause
4+
5+
# Remove enable-auto-merge label when PR is closed/merged
6+
name: Cleanup auto-merge label
7+
on:
8+
pull_request:
9+
types:
10+
- closed
11+
12+
jobs:
13+
cleanup-label:
14+
name: Remove auto-merge label on PR close
15+
runs-on: ubuntu-latest
16+
timeout-minutes: 5
17+
permissions:
18+
pull-requests: write
19+
20+
# Only run when a PR with the enable-auto-merge label is closed
21+
if: contains(github.event.pull_request.labels.*.name, 'enable-auto-merge')
22+
23+
steps:
24+
- name: Remove enable-auto-merge label
25+
uses: actions/github-script@v7
26+
with:
27+
script: |
28+
const pr_number = context.payload.pull_request.number;
29+
30+
try {
31+
await github.rest.issues.removeLabel({
32+
owner: context.repo.owner,
33+
repo: context.repo.repo,
34+
issue_number: pr_number,
35+
name: 'enable-auto-merge',
36+
});
37+
core.info(`Removed enable-auto-merge label from PR #${pr_number}`);
38+
} catch (error) {
39+
// Label might have been removed already, log but don't fail
40+
core.info(`Could not remove label: ${error.message}`);
41+
}

.github/workflows/upload-ci-logs-v2.yml

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,17 @@ on:
2424
required: true
2525
pr_number:
2626
description: 'pr number'
27-
required: false
27+
required: true
2828

29-
run-name: PR status ${{ inputs.pr_number || github.run_id }} - ${{ inputs.commit_sha }} - ${{ inputs.context }}
29+
run-name: PR status ${{ inputs.pr_number }} - ${{ inputs.commit_sha }} - ${{ inputs.context }}
3030
jobs:
3131
status_update:
3232
name: Update commit status
3333
runs-on: ubuntu-latest
3434
permissions:
3535
statuses: write
36+
contents: write
37+
pull-requests: read
3638
steps:
3739
- name: Set status
3840
run: |
@@ -47,3 +49,34 @@ jobs:
4749
\"description\":\"${{ inputs.descr }}\", \
4850
\"context\":\"${{ inputs.context }}\" \
4951
}"
52+
53+
- name: Trigger auto-merge check
54+
if: inputs.context == 'nvfuser-ci' && inputs.state == 'success'
55+
uses: actions/github-script@v7
56+
with:
57+
script: |
58+
// Check if PR has enable-auto-merge label
59+
const { data: pr } = await github.rest.pulls.get({
60+
owner: context.repo.owner,
61+
repo: context.repo.repo,
62+
pull_number: ${{ inputs.pr_number }},
63+
});
64+
65+
const hasLabel = pr.labels.some(label => label.name === 'enable-auto-merge');
66+
if (!hasLabel) {
67+
core.info('PR does not have enable-auto-merge label, skipping auto-merge trigger');
68+
return;
69+
}
70+
71+
// Dispatch event to trigger auto-merge workflow
72+
await github.rest.repos.createDispatchEvent({
73+
owner: context.repo.owner,
74+
repo: context.repo.repo,
75+
event_type: 'nvfuser-ci-success',
76+
client_payload: {
77+
pr_number: ${{ inputs.pr_number }},
78+
commit_sha: '${{ inputs.commit_sha }}'
79+
}
80+
});
81+
82+
core.info(`Triggered auto-merge check for PR #${{ inputs.pr_number }}`);

0 commit comments

Comments
 (0)