From a222f877889cab7fd3cd1271125d920c354623d6 Mon Sep 17 00:00:00 2001 From: Jerome Prinet Date: Fri, 29 Sep 2023 14:20:36 +0200 Subject: [PATCH] Add pull-request number as action input to support non pull_request contexts --- README.md | 2 ++ action.yml | 2 ++ dist/index.js | 37 +++++++++++++++++---------- src/addEmptyCommit.ts | 2 +- src/graphql.ts | 7 +++-- src/persistence/persistence.ts | 2 +- src/pullRerunRunner.ts | 3 ++- src/pullrequest/pullRequestComment.ts | 7 +++-- src/pullrequest/pullRequestLock.ts | 4 +-- src/pullrequest/signatureComment.ts | 5 ++-- src/setupClaCheck.ts | 5 ++-- src/shared/getInputs.ts | 5 ++++ 12 files changed, 50 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 3c75d920..17b7fb45 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,7 @@ jobs: #custom-allsigned-prcomment: 'pull request comment when all contributors has signed, defaults to **CLA Assistant Lite bot** All Contributors have signed the CLA.' #lock-pullrequest-aftermerge: false - if you don't want this bot to automatically lock the pull request after merging (default - true) #use-dco-flag: true - If you are using DCO instead of CLA + #pr-number: pull request number - Required only if the job was not triggered with a pull_request event ``` @@ -138,6 +139,7 @@ This PAT should have repo scope and is only required if you have configured to s | `custom-pr-sign-comment` | _optional_ | The signature to be committed in order to sign the CLA. | I have read the Developer Terms Document and I hereby accept the Terms | | `custom-allsigned-prcomment` | _optional_ | pull request comment when everyone has signed | All Contributors have signed the CLA. | | `lock-pullrequest-aftermerge` | _optional_ | Boolean input for locking the pull request after merging. Default is set to `true`. It is highly recommended to lock the Pull Request after merging so that the Contributors won't be able to revoke their signature comments after merge | false | +| `pr-number` | _optional_ | pull request number (required when the workflow event is not pull_request / pull_request_target). | 42 | ## Contributors diff --git a/action.yml b/action.yml index 6ea0466b..4b8c632e 100644 --- a/action.yml +++ b/action.yml @@ -38,6 +38,8 @@ inputs: lock-pullrequest-aftermerge: description: "Will lock the pull request after merge so that the signature the contributors cannot revoke their signature comments after merge" default: "true" + pr-number: + description: "pull request number (required when the workflow event is not pull_request / pull_request_target)" runs: using: "node16" main: 'dist/index.js' diff --git a/dist/index.js b/dist/index.js index 6ac87be9..1e4a6a96 100644 --- a/dist/index.js +++ b/dist/index.js @@ -682,6 +682,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge Object.defineProperty(exports, "__esModule", { value: true }); const octokit_1 = __webpack_require__(28); const github_1 = __webpack_require__(469); +const getInputs_1 = __webpack_require__(555); function getCommitters() { return __awaiter(this, void 0, void 0, function* () { try { @@ -727,7 +728,7 @@ function getCommitters() { }`.replace(/ /g, ''), { owner: github_1.context.repo.owner, name: github_1.context.repo.repo, - number: github_1.context.issue.number, + number: (0, getInputs_1.getPrNumber)(github_1.context.issue.number), cursor: '' }); response.repository.pullRequest.commits.edges.forEach(edge => { @@ -735,7 +736,7 @@ function getCommitters() { let user = { name: committer.login || committer.name, id: committer.databaseId || '', - pullRequestNo: github_1.context.issue.number + pullRequestNo: (0, getInputs_1.getPrNumber)(github_1.context.issue.number) }; if (committers.length === 0 || committers.map((c) => { return c.name; @@ -1648,10 +1649,11 @@ exports.lockPullRequest = void 0; const octokit_1 = __webpack_require__(28); const core = __importStar(__webpack_require__(470)); const github_1 = __webpack_require__(469); +const getInputs_1 = __webpack_require__(555); function lockPullRequest() { return __awaiter(this, void 0, void 0, function* () { core.info('Locking the Pull Request to safe guard the Pull Request CLA Signatures'); - const pullRequestNo = github_1.context.issue.number; + const pullRequestNo = (0, getInputs_1.getPrNumber)(github_1.context.issue.number); try { yield octokit_1.octokit.issues.lock({ owner: github_1.context.repo.owner, @@ -1903,7 +1905,7 @@ exports.createFile = createFile; function updateFile(sha, claFileContent, reactedCommitters) { return __awaiter(this, void 0, void 0, function* () { const octokitInstance = isRemoteRepoOrOrgConfigured() ? (0, octokit_1.getPATOctokit)() : (0, octokit_1.getDefaultOctokitClient)(); - const pullRequestNo = github_1.context.issue.number; + const pullRequestNo = input.getPrNumber(github_1.context.issue.number); const owner = github_1.context.issue.owner; const repo = github_1.context.issue.repo; claFileContent === null || claFileContent === void 0 ? void 0 : claFileContent.signedContributors.push(...reactedCommitters.newSigned); @@ -2088,7 +2090,7 @@ function dco(signed, committerMap) { `; if (committersCount > 1 && committerMap && committerMap.signed && committerMap.notSigned) { text += `**${committerMap.signed.length}** out of **${committerMap.signed.length + committerMap.notSigned.length}** committers have signed the DCO.`; - committerMap.signed.forEach(signedCommitter => { text += `
:white_check_mark: @${signedCommitter.name}`; }); + committerMap.signed.forEach(signedCommitter => { text += `
:white_check_mark: (${signedCommitter.name})[https://github.com/${signedCommitter.name}]`; }); committerMap.notSigned.forEach(unsignedCommitter => { text += `
:x: @${unsignedCommitter.name}`; }); @@ -2122,7 +2124,7 @@ function cla(signed, committerMap) { `; if (committersCount > 1 && committerMap && committerMap.signed && committerMap.notSigned) { text += `**${committerMap.signed.length}** out of **${committerMap.signed.length + committerMap.notSigned.length}** committers have signed the CLA.`; - committerMap.signed.forEach(signedCommitter => { text += `
:white_check_mark: @${signedCommitter.name}`; }); + committerMap.signed.forEach(signedCommitter => { text += `
:white_check_mark: (${signedCommitter.name})[https://github.com/${signedCommitter.name}]`; }); committerMap.notSigned.forEach(unsignedCommitter => { text += `
:x: @${unsignedCommitter.name}`; }); @@ -2213,6 +2215,7 @@ const github_1 = __webpack_require__(469); const persistence_1 = __webpack_require__(362); const pullRerunRunner_1 = __webpack_require__(633); const core = __importStar(__webpack_require__(470)); +const getInputs_1 = __webpack_require__(555); function setupClaCheck() { return __awaiter(this, void 0, void 0, function* () { let committerMap = getInitialCommittersMap(); @@ -2233,7 +2236,7 @@ function setupClaCheck() { return (0, pullRerunRunner_1.reRunLastWorkFlowIfRequired)(); } else { - core.setFailed(`Committers of Pull Request number ${github_1.context.issue.number} have to sign the CLA 📝`); + core.setFailed(`Committers of Pull Request number ${(0, getInputs_1.getPrNumber)(github_1.context.issue.number)} have to sign the CLA 📝`); } } catch (err) { @@ -2277,7 +2280,7 @@ function createClaFileAndPRComment(committers, committerMap) { const initialContentBinary = Buffer.from(initialContentString).toString('base64'); yield (0, persistence_1.createFile)(initialContentBinary).catch(error => core.setFailed(`Error occurred when creating the signed contributors file: ${error.message || error}. Make sure the branch where signatures are stored is NOT protected.`)); yield (0, pullRequestComment_1.default)(committerMap, committers); - throw new Error(`Committers of pull request ${github_1.context.issue.number} have to sign the CLA`); + throw new Error(`Committers of pull request ${(0, getInputs_1.getPrNumber)(github_1.context.issue.number)} have to sign the CLA`); }); } function prepareCommiterMap(committers, claFileContent) { @@ -2379,13 +2382,14 @@ Object.defineProperty(exports, "__esModule", { value: true }); const octokit_1 = __webpack_require__(28); const github_1 = __webpack_require__(469); const getInputs_1 = __webpack_require__(555); +const getInputs_2 = __webpack_require__(555); function signatureWithPRComment(committerMap, committers) { return __awaiter(this, void 0, void 0, function* () { let repoId = github_1.context.payload.repository.id; let prResponse = yield octokit_1.octokit.issues.listComments({ owner: github_1.context.repo.owner, repo: github_1.context.repo.repo, - issue_number: github_1.context.issue.number + issue_number: (0, getInputs_2.getPrNumber)(github_1.context.issue.number) }); let listOfPRComments = []; let filteredListOfPRComments = []; @@ -2397,7 +2401,7 @@ function signatureWithPRComment(committerMap, committers) { body: prComment.body.trim().toLowerCase(), created_at: prComment.created_at, repoId: repoId, - pullRequestNo: github_1.context.issue.number + pullRequestNo: (0, getInputs_2.getPrNumber)(github_1.context.issue.number) }); }); listOfPRComments.map(comment => { @@ -4494,7 +4498,7 @@ var __importStar = (this && this.__importStar) || function (mod) { return result; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.lockPullRequestAfterMerge = exports.getCustomPrSignComment = exports.getUseDcoFlag = exports.getCustomAllSignedPrComment = exports.getCustomNotSignedPrComment = exports.getCreateFileCommitMessage = exports.getSignedCommitMessage = exports.getEmptyCommitFlag = exports.getAllowListItem = exports.getBranch = exports.getPathToDocument = exports.getPathToSignatures = exports.getRemoteOrgName = exports.getRemoteRepoName = void 0; +exports.getPrNumber = exports.lockPullRequestAfterMerge = exports.getCustomPrSignComment = exports.getUseDcoFlag = exports.getCustomAllSignedPrComment = exports.getCustomNotSignedPrComment = exports.getCreateFileCommitMessage = exports.getSignedCommitMessage = exports.getEmptyCommitFlag = exports.getAllowListItem = exports.getBranch = exports.getPathToDocument = exports.getPathToSignatures = exports.getRemoteOrgName = exports.getRemoteRepoName = void 0; const core = __importStar(__webpack_require__(470)); const getRemoteRepoName = () => { return core.getInput('remote-repository-name', { required: false }); @@ -4528,6 +4532,10 @@ const getCustomPrSignComment = () => core.getInput('custom-pr-sign-comment', { r exports.getCustomPrSignComment = getCustomPrSignComment; const lockPullRequestAfterMerge = () => core.getInput('lock-pullrequest-aftermerge', { required: false }); exports.lockPullRequestAfterMerge = lockPullRequestAfterMerge; +const getPrNumber = (prNumberFromContext) => prNumberFromContext ? + prNumberFromContext : + Number(core.getInput('pr-number', { required: false })); +exports.getPrNumber = getPrNumber; /***/ }), @@ -22039,6 +22047,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.reRunLastWorkFlowIfRequired = void 0; const github_1 = __webpack_require__(469); const octokit_1 = __webpack_require__(28); +const getInputs_1 = __webpack_require__(555); const core = __importStar(__webpack_require__(470)); // Note: why this re-run of the last failed CLA workflow status check is explained this issue https://github.com/cla-assistant/github-action/issues/39 function reRunLastWorkFlowIfRequired() { @@ -22066,7 +22075,7 @@ function getBranchOfPullRequest() { const pullRequest = yield octokit_1.octokit.pulls.get({ owner: github_1.context.repo.owner, repo: github_1.context.repo.repo, - pull_number: github_1.context.issue.number + pull_number: (0, getInputs_1.getPrNumber)(github_1.context.issue.number) }); return pullRequest.data.head.ref; }); @@ -23015,7 +23024,7 @@ function createComment(signed, committerMap) { yield octokit_1.octokit.issues.createComment({ owner: github_1.context.repo.owner, repo: github_1.context.repo.repo, - issue_number: github_1.context.issue.number, + issue_number: (0, getInputs_1.getPrNumber)(github_1.context.issue.number), body: (0, pullRequestCommentContent_1.commentContent)(signed, committerMap) }).catch(error => { throw new Error(`Error occured when creating a pull request comment: ${error.message}`); }); }); @@ -23033,7 +23042,7 @@ function updateComment(signed, committerMap, claBotComment) { function getComment() { return __awaiter(this, void 0, void 0, function* () { try { - const response = yield octokit_1.octokit.issues.listComments({ owner: github_1.context.repo.owner, repo: github_1.context.repo.repo, issue_number: github_1.context.issue.number }); + const response = yield octokit_1.octokit.issues.listComments({ owner: github_1.context.repo.owner, repo: github_1.context.repo.repo, issue_number: (0, getInputs_1.getPrNumber)(github_1.context.issue.number) }); //TODO: check the below regex // using a `string` true or false purposely as github action input cannot have a boolean value if ((0, getInputs_1.getUseDcoFlag)() === 'true') { diff --git a/src/addEmptyCommit.ts b/src/addEmptyCommit.ts index 01d41d2a..5481a930 100644 --- a/src/addEmptyCommit.ts +++ b/src/addEmptyCommit.ts @@ -20,7 +20,7 @@ export async function addEmptyCommit() { const pullRequestResponse = await octokit.pulls.get({ owner: context.repo.owner, repo: context.repo.repo, - pull_number: context.payload.issue!.number + pull_number: input.getPrNumber(context.payload.issue!.number) }) const baseCommit = await octokit.git.getCommit({ diff --git a/src/graphql.ts b/src/graphql.ts index 21b8f253..6b927043 100644 --- a/src/graphql.ts +++ b/src/graphql.ts @@ -1,8 +1,7 @@ import { octokit } from './octokit' import { context } from '@actions/github' import { CommittersDetails } from './interfaces' - - +import { getPrNumber } from './shared/getInputs' export default async function getCommitters(): Promise { try { @@ -48,7 +47,7 @@ export default async function getCommitters(): Promise { }`.replace(/ /g, ''), { owner: context.repo.owner, name: context.repo.repo, - number: context.issue.number, + number: getPrNumber(context.issue.number), cursor: '' }) response.repository.pullRequest.commits.edges.forEach(edge => { @@ -56,7 +55,7 @@ export default async function getCommitters(): Promise { let user = { name: committer.login || committer.name, id: committer.databaseId || '', - pullRequestNo: context.issue.number + pullRequestNo: getPrNumber(context.issue.number) } if (committers.length === 0 || committers.map((c) => { return c.name diff --git a/src/persistence/persistence.ts b/src/persistence/persistence.ts index f5a08e48..086b4509 100644 --- a/src/persistence/persistence.ts +++ b/src/persistence/persistence.ts @@ -43,7 +43,7 @@ export async function updateFile( const octokitInstance: InstanceType = isRemoteRepoOrOrgConfigured() ? getPATOctokit() : getDefaultOctokitClient() - const pullRequestNo = context.issue.number + const pullRequestNo = input.getPrNumber(context.issue.number) const owner = context.issue.owner const repo = context.issue.repo diff --git a/src/pullRerunRunner.ts b/src/pullRerunRunner.ts index 234c94e5..da937747 100644 --- a/src/pullRerunRunner.ts +++ b/src/pullRerunRunner.ts @@ -1,5 +1,6 @@ import { context } from '@actions/github' import { octokit } from './octokit' +import { getPrNumber } from './shared/getInputs' import * as core from '@actions/core' @@ -31,7 +32,7 @@ async function getBranchOfPullRequest(): Promise { const pullRequest = await octokit.pulls.get({ owner: context.repo.owner, repo: context.repo.repo, - pull_number: context.issue.number + pull_number: getPrNumber(context.issue.number) }) return pullRequest.data.head.ref diff --git a/src/pullrequest/pullRequestComment.ts b/src/pullrequest/pullRequestComment.ts index 55e7cc57..76cd9552 100644 --- a/src/pullrequest/pullRequestComment.ts +++ b/src/pullrequest/pullRequestComment.ts @@ -6,8 +6,7 @@ import { CommitterMap, CommittersDetails } from '../interfaces' -import { getUseDcoFlag } from '../shared/getInputs' - +import { getUseDcoFlag, getPrNumber } from '../shared/getInputs' export default async function prCommentSetup(committerMap: CommitterMap, committers: CommittersDetails[]) { @@ -41,7 +40,7 @@ async function createComment(signed: boolean, committerMap: CommitterMap): Promi await octokit.issues.createComment({ owner: context.repo.owner, repo: context.repo.repo, - issue_number: context.issue.number, + issue_number: getPrNumber(context.issue.number), body: commentContent(signed, committerMap) }).catch(error => { throw new Error(`Error occured when creating a pull request comment: ${error.message}`) }) } @@ -57,7 +56,7 @@ async function updateComment(signed: boolean, committerMap: CommitterMap, claBot async function getComment() { try { - const response = await octokit.issues.listComments({ owner: context.repo.owner, repo: context.repo.repo, issue_number: context.issue.number }) + const response = await octokit.issues.listComments({ owner: context.repo.owner, repo: context.repo.repo, issue_number: getPrNumber(context.issue.number) }) //TODO: check the below regex // using a `string` true or false purposely as github action input cannot have a boolean value diff --git a/src/pullrequest/pullRequestLock.ts b/src/pullrequest/pullRequestLock.ts index 28a58d3a..1c2a76fd 100644 --- a/src/pullrequest/pullRequestLock.ts +++ b/src/pullrequest/pullRequestLock.ts @@ -1,10 +1,10 @@ import { octokit } from '../octokit' import * as core from '@actions/core' import { context } from '@actions/github' - +import { getPrNumber } from '../shared/getInputs' export async function lockPullRequest() { core.info('Locking the Pull Request to safe guard the Pull Request CLA Signatures') - const pullRequestNo: number = context.issue.number + const pullRequestNo: number = getPrNumber(context.issue.number) try { await octokit.issues.lock( { diff --git a/src/pullrequest/signatureComment.ts b/src/pullrequest/signatureComment.ts index 5e6d8423..41352a88 100644 --- a/src/pullrequest/signatureComment.ts +++ b/src/pullrequest/signatureComment.ts @@ -4,6 +4,7 @@ import { CommitterMap, CommittersDetails, ReactedCommitterMap } from '../interfa import { getUseDcoFlag, getCustomPrSignComment } from '../shared/getInputs' import * as core from '@actions/core' +import { getPrNumber } from '../shared/getInputs' export default async function signatureWithPRComment(committerMap: CommitterMap, committers): Promise { @@ -11,7 +12,7 @@ export default async function signatureWithPRComment(committerMap: CommitterMap, let prResponse = await octokit.issues.listComments({ owner: context.repo.owner, repo: context.repo.repo, - issue_number: context.issue.number + issue_number: getPrNumber(context.issue.number) }) let listOfPRComments = [] as CommittersDetails[] let filteredListOfPRComments = [] as CommittersDetails[] @@ -24,7 +25,7 @@ export default async function signatureWithPRComment(committerMap: CommitterMap, body: prComment.body.trim().toLowerCase(), created_at: prComment.created_at, repoId: repoId, - pullRequestNo: context.issue.number + pullRequestNo: getPrNumber(context.issue.number) }) }) listOfPRComments.map(comment => { diff --git a/src/setupClaCheck.ts b/src/setupClaCheck.ts index dc47d920..1795fabc 100644 --- a/src/setupClaCheck.ts +++ b/src/setupClaCheck.ts @@ -15,6 +15,7 @@ import { } from './persistence/persistence' import { reRunLastWorkFlowIfRequired } from './pullRerunRunner' import * as core from '@actions/core' +import { getPrNumber } from './shared/getInputs' export async function setupClaCheck() { let committerMap = getInitialCommittersMap() @@ -48,7 +49,7 @@ export async function setupClaCheck() { return reRunLastWorkFlowIfRequired() } else { core.setFailed( - `Committers of Pull Request number ${context.issue.number} have to sign the CLA 📝` + `Committers of Pull Request number ${getPrNumber(context.issue.number)} have to sign the CLA 📝` ) } } catch (err) { @@ -106,7 +107,7 @@ async function createClaFileAndPRComment( ) await prCommentSetup(committerMap, committers) throw new Error( - `Committers of pull request ${context.issue.number} have to sign the CLA` + `Committers of pull request ${getPrNumber(context.issue.number)} have to sign the CLA` ) } diff --git a/src/shared/getInputs.ts b/src/shared/getInputs.ts index cce93e19..9146da33 100644 --- a/src/shared/getInputs.ts +++ b/src/shared/getInputs.ts @@ -43,3 +43,8 @@ export const getCustomPrSignComment = (): string => export const lockPullRequestAfterMerge = (): string => core.getInput('lock-pullrequest-aftermerge', { required: false }) + +export const getPrNumber = (prNumberFromContext: number): number => + prNumberFromContext ? + prNumberFromContext : + Number(core.getInput('pr-number', { required: false }))