/** * @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}`; };