blob: eca20953f8484adad41f390347407339bdd573a0 [file] [log] [blame]
/**
* @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}`;
};