Add workflow to comment on PRs when released (#1772)
This commit is contained in:
parent
ef96a31671
commit
4807eb5a80
1 changed files with 149 additions and 0 deletions
149
.github/workflows/comment-on-release.yml
vendored
Normal file
149
.github/workflows/comment-on-release.yml
vendored
Normal file
|
|
@ -0,0 +1,149 @@
|
||||||
|
name: Comment on PRs in Release
|
||||||
|
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types: [published]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
pull-requests: write
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
comment-on-prs:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Get previous release
|
||||||
|
id: previous_release
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
const currentTag = '${{ github.event.release.tag_name }}';
|
||||||
|
|
||||||
|
// Get all releases
|
||||||
|
const { data: releases } = await github.rest.repos.listReleases({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
per_page: 100
|
||||||
|
});
|
||||||
|
|
||||||
|
// Find current release index
|
||||||
|
const currentIndex = releases.findIndex(r => r.tag_name === currentTag);
|
||||||
|
|
||||||
|
if (currentIndex === -1) {
|
||||||
|
console.log('Current release not found in list');
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get previous release (next in the list since they're sorted by date desc)
|
||||||
|
const previousRelease = releases[currentIndex + 1];
|
||||||
|
|
||||||
|
if (!previousRelease) {
|
||||||
|
console.log('No previous release found, this might be the first release');
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`Found previous release: ${previousRelease.tag_name}`);
|
||||||
|
|
||||||
|
return previousRelease.tag_name;
|
||||||
|
|
||||||
|
- name: Get merged PRs between releases
|
||||||
|
id: get_prs
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
const currentTag = '${{ github.event.release.tag_name }}';
|
||||||
|
const previousTag = ${{ steps.previous_release.outputs.result }};
|
||||||
|
|
||||||
|
if (!previousTag) {
|
||||||
|
console.log('No previous release found, skipping');
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`Finding PRs between ${previousTag} and ${currentTag}`);
|
||||||
|
|
||||||
|
// Get commits between previous and current release
|
||||||
|
const comparison = await github.rest.repos.compareCommits({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
base: previousTag,
|
||||||
|
head: currentTag
|
||||||
|
});
|
||||||
|
|
||||||
|
const commits = comparison.data.commits;
|
||||||
|
console.log(`Found ${commits.length} commits`);
|
||||||
|
|
||||||
|
// Get PRs associated with each commit using GitHub API
|
||||||
|
const prNumbers = new Set();
|
||||||
|
|
||||||
|
for (const commit of commits) {
|
||||||
|
try {
|
||||||
|
const { data: prs } = await github.rest.repos.listPullRequestsAssociatedWithCommit({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
commit_sha: commit.sha
|
||||||
|
});
|
||||||
|
|
||||||
|
for (const pr of prs) {
|
||||||
|
if (pr.merged_at) {
|
||||||
|
prNumbers.add(pr.number);
|
||||||
|
console.log(`Found merged PR: #${pr.number}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.log(`Failed to get PRs for commit ${commit.sha}: ${error.message}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`Found ${prNumbers.size} merged PRs`);
|
||||||
|
return Array.from(prNumbers);
|
||||||
|
|
||||||
|
- name: Comment on PRs
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
const prNumbers = ${{ steps.get_prs.outputs.result }};
|
||||||
|
const releaseTag = '${{ github.event.release.tag_name }}';
|
||||||
|
const releaseUrl = '${{ github.event.release.html_url }}';
|
||||||
|
|
||||||
|
const comment = `This pull request is included in [${releaseTag}](${releaseUrl})`;
|
||||||
|
|
||||||
|
let commentedCount = 0;
|
||||||
|
|
||||||
|
for (const prNumber of prNumbers) {
|
||||||
|
try {
|
||||||
|
// Check if we've already commented on this PR for this release
|
||||||
|
const { data: comments } = await github.rest.issues.listComments({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
issue_number: prNumber,
|
||||||
|
per_page: 100
|
||||||
|
});
|
||||||
|
|
||||||
|
const alreadyCommented = comments.some(c =>
|
||||||
|
c.user.type === 'Bot' && c.body.includes(releaseTag)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (alreadyCommented) {
|
||||||
|
console.log(`Skipping PR #${prNumber} - already commented for ${releaseTag}`);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
await github.rest.issues.createComment({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
issue_number: prNumber,
|
||||||
|
body: comment
|
||||||
|
});
|
||||||
|
commentedCount++;
|
||||||
|
console.log(`Successfully commented on PR #${prNumber}`);
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`Failed to comment on PR #${prNumber}:`, error.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`Commented on ${commentedCount} of ${prNumbers.length} PRs`);
|
||||||
Loading…
Reference in a new issue