Skip to content

# 33 - Make more robust Release notes comment logic #4

# 33 - Make more robust Release notes comment logic

# 33 - Make more robust Release notes comment logic #4

name: Copy Release Notes to Related Issues
on:
pull_request:
types: [closed]
branches: [ master ]
jobs:
copy_release_notes:
if: github.event.pull_request.merged == true
runs-on: ubuntu-latest
steps:
- name: Fetch PR Comments
id: get-comments
uses: actions/github-script@v7
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
const prNumber = context.payload.pull_request.number;
const repoName = context.repo.repo;
const repoOwner = context.repo.owner;
const releaseNotesRegex = /release notes/i;
const comments = await github.rest.issues.listComments({
owner: repoOwner,
repo: repoName,
issue_number: prNumber,
});
const releaseNoteComment = comments.data.find(comment => releaseNotesRegex.test(comment.body));
const releaseNoteBody = releaseNoteComment ? releaseNoteComment.body : '';
console.log(`Release Note Body: ${releaseNoteBody}`);
core.setOutput('releaseNoteBody', releaseNoteBody);
- name: Print Extracted releaseNoteBody
run: |
echo "Extracted Release Note Body:"
echo "${{ steps.get-comments.outputs.releaseNoteBody }}"
echo "RELEASE_NOTE_BODY<<EOF" >> $GITHUB_ENV
echo "${{ steps.get-comments.outputs.releaseNoteBody }}" >> $GITHUB_ENV
echo "EOF" >> $GITHUB_ENV
- name: Parse PR Description for Related Issues
id: find-issues
uses: actions/github-script@v7
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
const description = context.payload.pull_request.body;
const issueNumbers = [];
const regexPattern = /([Cc]los(e|es|ed)|[Ff]ix(es|ed)?|[Rr]esolv(e|es|ed))\s*#\s*([0-9]+)/g;
let match;
while ((match = regexPattern.exec(description)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (match.index === regexPattern.lastIndex) {
regexPattern.lastIndex++;
}
// The actual issue number is in the last group of the match
const issueNumber = match[match.length - 1];
if (issueNumber) {
issueNumbers.push(issueNumber);
}
}
core.setOutput('issueNumbers', issueNumbers.join(', '));
- name: Print Extracted Issue Numbers
run: |
echo "Extracted Issue Numbers: ${{ steps.find-issues.outputs.issueNumbers }}"
echo "ISSUE_NUMBERS=${{ steps.find-issues.outputs.issueNumbers }}" >> $GITHUB_ENV
- name: Post Comment to Issues
if: ${{ steps.get-comments.outputs.releaseNoteBody }} && ${{ steps.find-issues.outputs.issueNumbers }}
uses: actions/github-script@v7
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
const issueNumbers = process.env.ISSUE_NUMBERS;
const commentBody = process.env.RELEASE_NOTE_BODY;
const repoName = context.repo.repo;
const repoOwner = context.repo.owner;
for (const issueNumber of issueNumbers.split(', ')) {
if (issueNumber && commentBody) {
await github.rest.issues.createComment({
owner: repoOwner,
repo: repoName,
issue_number: issueNumber,
body: commentBody
});
}
}