| /** |
| * @license |
| * Copyright 2021 Google LLC. All Rights Reserved. |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * ============================================================================= |
| */ |
| |
| /** Extracts PR from commit message and creates a GitHub Issue on Rollback of PR |
| Created issue is assigned to original PR owner and reviewer. |
| |
| @param {!object} |
| github enables querying for PR and also create issue using rest endpoint |
| context has the commit message details in the payload |
| @return {string} Returns the issue number and title |
| */ |
| module.exports = async ({github, context}) => { |
| const rollback_commit = context.payload.head_commit.id; |
| const pr_match_groups = context.payload.head_commit.message.match(/\Rollback of PR #(\d+).*/) || []; |
| if (pr_match_groups.length != 2) { |
| console.log(`PR Number not found in ${context.payload.head_commit.message}`); |
| throw "Error extracting PR Number from commit message"; |
| } |
| const pr_number = parseInt(pr_match_groups[1]); |
| const owner = context.payload.repository.owner.name; |
| const repo = context.payload.repository.name; |
| console.log(`Original PR: ${pr_number} and Rollback Commit: ${rollback_commit}`); |
| // Get the Original PR Details |
| const pr_resp = await github.rest.pulls.get({ |
| owner, |
| repo, |
| pull_number: pr_number |
| }); |
| if (pr_resp.status != 200 || pr_resp.data.state != 'closed') { |
| console.log(`PR:{pr_number} is not found or closed. Not a valid condition to create an issue.`); |
| console.log(pr_resp); |
| throw `PR:{pr_number} needs to be valid and closed (merged)`; |
| } |
| const pr_title = pr_resp.data.title; |
| // Assign to PR owner and reviewers |
| const assignees = pr_resp.data.assignees.concat(pr_resp.data.requested_reviewers); |
| let assignee_logins = assignees.map(x => x.login); |
| assignee_logins.push(pr_resp.data.user.login); |
| console.log(assignee_logins); |
| // Create an new GH Issue and reference the Original PR |
| const resp = await github.rest.issues.create({ |
| owner, |
| repo, |
| assignees: assignee_logins, |
| title: `Issue created for Rollback of PR #${pr_number}: ${pr_title}`, |
| body: `Merged PR #${pr_number} is rolled back in ${rollback_commit}. |
| Please follow up with the reviewer and close this issue once its resolved.` |
| }); |
| return `Issue created: ${resp.data.number} with Title: ${resp.data.title}`; |
| }; |