From 10d6af04882742d4bf6ac0681ad6c34c25c554e1 Mon Sep 17 00:00:00 2001 From: rory Date: Fri, 23 Jun 2023 13:19:57 -0700 Subject: [PATCH 1/4] Remove automated PR checks from deploy.yml --- .github/workflows/deploy.yml | 25 ++----------------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 606393ca5c12..65942e19a22c 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -5,28 +5,9 @@ on: branches: [staging, production] jobs: - validate: - runs-on: ubuntu-latest - outputs: - isAutomatedPullRequest: ${{ steps.isAutomatedPullRequest.outputs.IS_AUTOMERGE_PR }} - - steps: - - name: Get merged pull request - id: getMergedPullRequest - # TODO: Point back action actions-ecosystem after https://github.com/actions-ecosystem/action-get-merged-pull-request/pull/223 is merged - uses: roryabraham/action-get-merged-pull-request@7a7a194f6ff8f3eef58c822083695a97314ebec1 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - - - name: Check if merged pull request was an automatic version bump PR - id: isAutomatedPullRequest - run: echo "IS_AUTOMERGE_PR=${{ steps.getMergedPullRequest.outputs.author == 'OSBotify' }}" >> "$GITHUB_OUTPUT" - deployStaging: runs-on: ubuntu-latest - needs: validate - if: ${{ fromJSON(needs.validate.outputs.isAutomatedPullRequest) && github.ref == 'refs/heads/staging' }} - + if: github.ref == 'refs/heads/staging' steps: - name: Checkout staging branch uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 @@ -46,8 +27,7 @@ jobs: deployProduction: runs-on: ubuntu-latest - needs: validate - if: ${{ fromJSON(needs.validate.outputs.isAutomatedPullRequest) && github.ref == 'refs/heads/production' }} + if: github.ref == 'refs/heads/production' steps: - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 @@ -84,6 +64,5 @@ jobs: with: tag_name: ${{ env.PRODUCTION_VERSION }} body: ${{ steps.getReleaseBody.outputs.RELEASE_BODY }} - env: GITHUB_TOKEN: ${{ secrets.OS_BOTIFY_TOKEN }} From 9a4c8ae43cc17d3c06be6f38129424314ba796c3 Mon Sep 17 00:00:00 2001 From: rory Date: Fri, 23 Jun 2023 13:23:15 -0700 Subject: [PATCH 2/4] Remove IS_AUTOMATED from preDeploy --- .github/workflows/preDeploy.yml | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/.github/workflows/preDeploy.yml b/.github/workflows/preDeploy.yml index ef97788d3bef..5f830a22747f 100644 --- a/.github/workflows/preDeploy.yml +++ b/.github/workflows/preDeploy.yml @@ -30,7 +30,6 @@ jobs: needs: confirmPassingBuild outputs: MERGED_PR: ${{ steps.getMergedPullRequest.outputs.number }} - IS_AUTOMATED_PR: ${{ steps.isAutomatedPullRequest.outputs.IS_AUTOMATED_PR }} SHOULD_DEPLOY: ${{ steps.shouldDeploy.outputs.SHOULD_DEPLOY }} SHOULD_CP: ${{ steps.isStagingDeployLocked.outputs.IS_LOCKED && steps.hasCherryPickLabel.outputs.HAS_CP_LABEL }} @@ -47,22 +46,18 @@ jobs: with: GITHUB_TOKEN: ${{ github.token }} - - name: Check if merged pull request was an automated PR - id: isAutomatedPullRequest - run: echo "IS_AUTOMATED_PR=${{ github.actor == 'OSBotify' }}" >> "$GITHUB_OUTPUT" - - name: Check if merged pull request has `CP Staging` label id: hasCherryPickLabel run: echo "HAS_CP_LABEL=${{ contains(steps.getMergedPullRequest.outputs.labels, 'CP Staging') }}" >> "$GITHUB_OUTPUT" - name: Check if merged pull request should trigger a deploy id: shouldDeploy - run: echo "SHOULD_DEPLOY=${{ fromJSON(steps.hasCherryPickLabel.outputs.HAS_CP_LABEL) || (!fromJSON(steps.isStagingDeployLocked.outputs.IS_LOCKED) && !fromJSON(steps.isAutomatedPullRequest.outputs.IS_AUTOMATED_PR)) }}" >> "$GITHUB_OUTPUT" + run: echo "SHOULD_DEPLOY=${{ fromJSON(steps.hasCherryPickLabel.outputs.HAS_CP_LABEL) || (!fromJSON(steps.isStagingDeployLocked.outputs.IS_LOCKED) && github.actor != 'OSBotify') }}" >> "$GITHUB_OUTPUT" skipDeploy: runs-on: ubuntu-latest needs: chooseDeployActions - if: ${{ !fromJSON(needs.chooseDeployActions.outputs.SHOULD_DEPLOY) && !fromJSON(needs.chooseDeployActions.outputs.IS_AUTOMATED_PR) }} + if: ${{ !fromJSON(needs.chooseDeployActions.outputs.SHOULD_DEPLOY) && github.actor != 'OSBotify' }} steps: - name: Comment on deferred PR uses: actions-ecosystem/action-create-comment@cd098164398331c50e7dfdd0dfa1b564a1873fac From 1728f19c9543f5372291ae33d62e6ddef7369c92 Mon Sep 17 00:00:00 2001 From: rory Date: Fri, 23 Jun 2023 14:02:44 -0700 Subject: [PATCH 3/4] Remove automated PR filter from GithubUtils since it already exists in GitUtils --- .../actions/javascript/authorChecklist/index.js | 17 ++--------------- .../javascript/awaitStagingDeploys/index.js | 17 ++--------------- .../javascript/checkDeployBlockers/index.js | 17 ++--------------- .../createOrUpdateStagingDeploy/index.js | 17 ++--------------- .../getDeployPullRequestList/index.js | 17 ++--------------- .../javascript/getPullRequestDetails/index.js | 17 ++--------------- .../actions/javascript/getReleaseBody/index.js | 17 ++--------------- .../javascript/isStagingDeployLocked/index.js | 17 ++--------------- .../markPullRequestsAsDeployed/index.js | 17 ++--------------- .../javascript/postTestBuildComment/index.js | 17 ++--------------- .../javascript/reopenIssueWithComment/index.js | 17 ++--------------- .../javascript/reviewerChecklist/index.js | 17 ++--------------- .../javascript/triggerWorkflowAndWait/index.js | 17 ++--------------- .../javascript/verifySignedCommits/index.js | 17 ++--------------- .github/libs/GithubUtils.js | 17 ++--------------- 15 files changed, 30 insertions(+), 225 deletions(-) diff --git a/.github/actions/javascript/authorChecklist/index.js b/.github/actions/javascript/authorChecklist/index.js index f09d586b629c..7f9b05a286c3 100644 --- a/.github/actions/javascript/authorChecklist/index.js +++ b/.github/actions/javascript/authorChecklist/index.js @@ -340,9 +340,6 @@ class GithubUtils { ) { return this.fetchAllPullRequests(_.map(PRList, this.getPullRequestNumberFromURL)) .then((data) => { - const automatedPRs = _.pluck(_.filter(data, GithubUtils.isAutomatedPullRequest), 'html_url'); - console.log('Filtering out the following automated pull requests:', automatedPRs); - // The format of this map is following: // { // 'https://github.com/Expensify/App/pull/9641': [ 'PauloGasparSv', 'kidroca' ], @@ -366,7 +363,7 @@ class GithubUtils { console.log('Found the following NO QA PRs:', noQAPRs); const verifiedOrNoQAPRs = _.union(verifiedPRList, noQAPRs); - const sortedPRList = _.chain(PRList).difference(automatedPRs).difference(_.keys(internalQAPRMap)).unique().sortBy(GithubUtils.getPullRequestNumberFromURL).value(); + const sortedPRList = _.chain(PRList).difference(_.keys(internalQAPRMap)).unique().sortBy(GithubUtils.getPullRequestNumberFromURL).value(); const sortedDeployBlockers = _.sortBy(_.unique(deployBlockers), GithubUtils.getIssueOrPullRequestNumberFromURL); // Tag version and comparison URL @@ -423,7 +420,7 @@ class GithubUtils { issueBody += '\r\n\r\ncc @Expensify/applauseleads\r\n'; return issueBody; }) - .catch((err) => console.warn('Error generating StagingDeployCash issue body!', 'Automated PRs may not be properly filtered out. Continuing...', err)); + .catch((err) => console.warn('Error generating StagingDeployCash issue body! Continuing...', err)); } /** @@ -603,16 +600,6 @@ class GithubUtils { return Number.parseInt(matches[1], 10); } - /** - * Determine if a given pull request is an automated PR. - * - * @param {Object} pullRequest - * @returns {Boolean} - */ - static isAutomatedPullRequest(pullRequest) { - return _.isEqual(lodashGet(pullRequest, 'user.login', ''), CONST.OS_BOTIFY); - } - /** * Return the login of the actor who closed an issue or PR. If the issue is not closed, return an empty string. * diff --git a/.github/actions/javascript/awaitStagingDeploys/index.js b/.github/actions/javascript/awaitStagingDeploys/index.js index c2948688b83a..4ea17b8b29e5 100644 --- a/.github/actions/javascript/awaitStagingDeploys/index.js +++ b/.github/actions/javascript/awaitStagingDeploys/index.js @@ -378,9 +378,6 @@ class GithubUtils { ) { return this.fetchAllPullRequests(_.map(PRList, this.getPullRequestNumberFromURL)) .then((data) => { - const automatedPRs = _.pluck(_.filter(data, GithubUtils.isAutomatedPullRequest), 'html_url'); - console.log('Filtering out the following automated pull requests:', automatedPRs); - // The format of this map is following: // { // 'https://github.com/Expensify/App/pull/9641': [ 'PauloGasparSv', 'kidroca' ], @@ -404,7 +401,7 @@ class GithubUtils { console.log('Found the following NO QA PRs:', noQAPRs); const verifiedOrNoQAPRs = _.union(verifiedPRList, noQAPRs); - const sortedPRList = _.chain(PRList).difference(automatedPRs).difference(_.keys(internalQAPRMap)).unique().sortBy(GithubUtils.getPullRequestNumberFromURL).value(); + const sortedPRList = _.chain(PRList).difference(_.keys(internalQAPRMap)).unique().sortBy(GithubUtils.getPullRequestNumberFromURL).value(); const sortedDeployBlockers = _.sortBy(_.unique(deployBlockers), GithubUtils.getIssueOrPullRequestNumberFromURL); // Tag version and comparison URL @@ -461,7 +458,7 @@ class GithubUtils { issueBody += '\r\n\r\ncc @Expensify/applauseleads\r\n'; return issueBody; }) - .catch((err) => console.warn('Error generating StagingDeployCash issue body!', 'Automated PRs may not be properly filtered out. Continuing...', err)); + .catch((err) => console.warn('Error generating StagingDeployCash issue body! Continuing...', err)); } /** @@ -641,16 +638,6 @@ class GithubUtils { return Number.parseInt(matches[1], 10); } - /** - * Determine if a given pull request is an automated PR. - * - * @param {Object} pullRequest - * @returns {Boolean} - */ - static isAutomatedPullRequest(pullRequest) { - return _.isEqual(lodashGet(pullRequest, 'user.login', ''), CONST.OS_BOTIFY); - } - /** * Return the login of the actor who closed an issue or PR. If the issue is not closed, return an empty string. * diff --git a/.github/actions/javascript/checkDeployBlockers/index.js b/.github/actions/javascript/checkDeployBlockers/index.js index 80e39e8d1285..8b8a401ba592 100644 --- a/.github/actions/javascript/checkDeployBlockers/index.js +++ b/.github/actions/javascript/checkDeployBlockers/index.js @@ -345,9 +345,6 @@ class GithubUtils { ) { return this.fetchAllPullRequests(_.map(PRList, this.getPullRequestNumberFromURL)) .then((data) => { - const automatedPRs = _.pluck(_.filter(data, GithubUtils.isAutomatedPullRequest), 'html_url'); - console.log('Filtering out the following automated pull requests:', automatedPRs); - // The format of this map is following: // { // 'https://github.com/Expensify/App/pull/9641': [ 'PauloGasparSv', 'kidroca' ], @@ -371,7 +368,7 @@ class GithubUtils { console.log('Found the following NO QA PRs:', noQAPRs); const verifiedOrNoQAPRs = _.union(verifiedPRList, noQAPRs); - const sortedPRList = _.chain(PRList).difference(automatedPRs).difference(_.keys(internalQAPRMap)).unique().sortBy(GithubUtils.getPullRequestNumberFromURL).value(); + const sortedPRList = _.chain(PRList).difference(_.keys(internalQAPRMap)).unique().sortBy(GithubUtils.getPullRequestNumberFromURL).value(); const sortedDeployBlockers = _.sortBy(_.unique(deployBlockers), GithubUtils.getIssueOrPullRequestNumberFromURL); // Tag version and comparison URL @@ -428,7 +425,7 @@ class GithubUtils { issueBody += '\r\n\r\ncc @Expensify/applauseleads\r\n'; return issueBody; }) - .catch((err) => console.warn('Error generating StagingDeployCash issue body!', 'Automated PRs may not be properly filtered out. Continuing...', err)); + .catch((err) => console.warn('Error generating StagingDeployCash issue body! Continuing...', err)); } /** @@ -608,16 +605,6 @@ class GithubUtils { return Number.parseInt(matches[1], 10); } - /** - * Determine if a given pull request is an automated PR. - * - * @param {Object} pullRequest - * @returns {Boolean} - */ - static isAutomatedPullRequest(pullRequest) { - return _.isEqual(lodashGet(pullRequest, 'user.login', ''), CONST.OS_BOTIFY); - } - /** * Return the login of the actor who closed an issue or PR. If the issue is not closed, return an empty string. * diff --git a/.github/actions/javascript/createOrUpdateStagingDeploy/index.js b/.github/actions/javascript/createOrUpdateStagingDeploy/index.js index 058c1f261622..a6524bcf7d17 100644 --- a/.github/actions/javascript/createOrUpdateStagingDeploy/index.js +++ b/.github/actions/javascript/createOrUpdateStagingDeploy/index.js @@ -577,9 +577,6 @@ class GithubUtils { ) { return this.fetchAllPullRequests(_.map(PRList, this.getPullRequestNumberFromURL)) .then((data) => { - const automatedPRs = _.pluck(_.filter(data, GithubUtils.isAutomatedPullRequest), 'html_url'); - console.log('Filtering out the following automated pull requests:', automatedPRs); - // The format of this map is following: // { // 'https://github.com/Expensify/App/pull/9641': [ 'PauloGasparSv', 'kidroca' ], @@ -603,7 +600,7 @@ class GithubUtils { console.log('Found the following NO QA PRs:', noQAPRs); const verifiedOrNoQAPRs = _.union(verifiedPRList, noQAPRs); - const sortedPRList = _.chain(PRList).difference(automatedPRs).difference(_.keys(internalQAPRMap)).unique().sortBy(GithubUtils.getPullRequestNumberFromURL).value(); + const sortedPRList = _.chain(PRList).difference(_.keys(internalQAPRMap)).unique().sortBy(GithubUtils.getPullRequestNumberFromURL).value(); const sortedDeployBlockers = _.sortBy(_.unique(deployBlockers), GithubUtils.getIssueOrPullRequestNumberFromURL); // Tag version and comparison URL @@ -660,7 +657,7 @@ class GithubUtils { issueBody += '\r\n\r\ncc @Expensify/applauseleads\r\n'; return issueBody; }) - .catch((err) => console.warn('Error generating StagingDeployCash issue body!', 'Automated PRs may not be properly filtered out. Continuing...', err)); + .catch((err) => console.warn('Error generating StagingDeployCash issue body! Continuing...', err)); } /** @@ -840,16 +837,6 @@ class GithubUtils { return Number.parseInt(matches[1], 10); } - /** - * Determine if a given pull request is an automated PR. - * - * @param {Object} pullRequest - * @returns {Boolean} - */ - static isAutomatedPullRequest(pullRequest) { - return _.isEqual(lodashGet(pullRequest, 'user.login', ''), CONST.OS_BOTIFY); - } - /** * Return the login of the actor who closed an issue or PR. If the issue is not closed, return an empty string. * diff --git a/.github/actions/javascript/getDeployPullRequestList/index.js b/.github/actions/javascript/getDeployPullRequestList/index.js index 649a40504d55..f46ea055282a 100644 --- a/.github/actions/javascript/getDeployPullRequestList/index.js +++ b/.github/actions/javascript/getDeployPullRequestList/index.js @@ -511,9 +511,6 @@ class GithubUtils { ) { return this.fetchAllPullRequests(_.map(PRList, this.getPullRequestNumberFromURL)) .then((data) => { - const automatedPRs = _.pluck(_.filter(data, GithubUtils.isAutomatedPullRequest), 'html_url'); - console.log('Filtering out the following automated pull requests:', automatedPRs); - // The format of this map is following: // { // 'https://github.com/Expensify/App/pull/9641': [ 'PauloGasparSv', 'kidroca' ], @@ -537,7 +534,7 @@ class GithubUtils { console.log('Found the following NO QA PRs:', noQAPRs); const verifiedOrNoQAPRs = _.union(verifiedPRList, noQAPRs); - const sortedPRList = _.chain(PRList).difference(automatedPRs).difference(_.keys(internalQAPRMap)).unique().sortBy(GithubUtils.getPullRequestNumberFromURL).value(); + const sortedPRList = _.chain(PRList).difference(_.keys(internalQAPRMap)).unique().sortBy(GithubUtils.getPullRequestNumberFromURL).value(); const sortedDeployBlockers = _.sortBy(_.unique(deployBlockers), GithubUtils.getIssueOrPullRequestNumberFromURL); // Tag version and comparison URL @@ -594,7 +591,7 @@ class GithubUtils { issueBody += '\r\n\r\ncc @Expensify/applauseleads\r\n'; return issueBody; }) - .catch((err) => console.warn('Error generating StagingDeployCash issue body!', 'Automated PRs may not be properly filtered out. Continuing...', err)); + .catch((err) => console.warn('Error generating StagingDeployCash issue body! Continuing...', err)); } /** @@ -774,16 +771,6 @@ class GithubUtils { return Number.parseInt(matches[1], 10); } - /** - * Determine if a given pull request is an automated PR. - * - * @param {Object} pullRequest - * @returns {Boolean} - */ - static isAutomatedPullRequest(pullRequest) { - return _.isEqual(lodashGet(pullRequest, 'user.login', ''), CONST.OS_BOTIFY); - } - /** * Return the login of the actor who closed an issue or PR. If the issue is not closed, return an empty string. * diff --git a/.github/actions/javascript/getPullRequestDetails/index.js b/.github/actions/javascript/getPullRequestDetails/index.js index e066260e665f..7105946b2c73 100644 --- a/.github/actions/javascript/getPullRequestDetails/index.js +++ b/.github/actions/javascript/getPullRequestDetails/index.js @@ -390,9 +390,6 @@ class GithubUtils { ) { return this.fetchAllPullRequests(_.map(PRList, this.getPullRequestNumberFromURL)) .then((data) => { - const automatedPRs = _.pluck(_.filter(data, GithubUtils.isAutomatedPullRequest), 'html_url'); - console.log('Filtering out the following automated pull requests:', automatedPRs); - // The format of this map is following: // { // 'https://github.com/Expensify/App/pull/9641': [ 'PauloGasparSv', 'kidroca' ], @@ -416,7 +413,7 @@ class GithubUtils { console.log('Found the following NO QA PRs:', noQAPRs); const verifiedOrNoQAPRs = _.union(verifiedPRList, noQAPRs); - const sortedPRList = _.chain(PRList).difference(automatedPRs).difference(_.keys(internalQAPRMap)).unique().sortBy(GithubUtils.getPullRequestNumberFromURL).value(); + const sortedPRList = _.chain(PRList).difference(_.keys(internalQAPRMap)).unique().sortBy(GithubUtils.getPullRequestNumberFromURL).value(); const sortedDeployBlockers = _.sortBy(_.unique(deployBlockers), GithubUtils.getIssueOrPullRequestNumberFromURL); // Tag version and comparison URL @@ -473,7 +470,7 @@ class GithubUtils { issueBody += '\r\n\r\ncc @Expensify/applauseleads\r\n'; return issueBody; }) - .catch((err) => console.warn('Error generating StagingDeployCash issue body!', 'Automated PRs may not be properly filtered out. Continuing...', err)); + .catch((err) => console.warn('Error generating StagingDeployCash issue body! Continuing...', err)); } /** @@ -653,16 +650,6 @@ class GithubUtils { return Number.parseInt(matches[1], 10); } - /** - * Determine if a given pull request is an automated PR. - * - * @param {Object} pullRequest - * @returns {Boolean} - */ - static isAutomatedPullRequest(pullRequest) { - return _.isEqual(lodashGet(pullRequest, 'user.login', ''), CONST.OS_BOTIFY); - } - /** * Return the login of the actor who closed an issue or PR. If the issue is not closed, return an empty string. * diff --git a/.github/actions/javascript/getReleaseBody/index.js b/.github/actions/javascript/getReleaseBody/index.js index cdf97f3d2818..84ef8fff3685 100644 --- a/.github/actions/javascript/getReleaseBody/index.js +++ b/.github/actions/javascript/getReleaseBody/index.js @@ -332,9 +332,6 @@ class GithubUtils { ) { return this.fetchAllPullRequests(_.map(PRList, this.getPullRequestNumberFromURL)) .then((data) => { - const automatedPRs = _.pluck(_.filter(data, GithubUtils.isAutomatedPullRequest), 'html_url'); - console.log('Filtering out the following automated pull requests:', automatedPRs); - // The format of this map is following: // { // 'https://github.com/Expensify/App/pull/9641': [ 'PauloGasparSv', 'kidroca' ], @@ -358,7 +355,7 @@ class GithubUtils { console.log('Found the following NO QA PRs:', noQAPRs); const verifiedOrNoQAPRs = _.union(verifiedPRList, noQAPRs); - const sortedPRList = _.chain(PRList).difference(automatedPRs).difference(_.keys(internalQAPRMap)).unique().sortBy(GithubUtils.getPullRequestNumberFromURL).value(); + const sortedPRList = _.chain(PRList).difference(_.keys(internalQAPRMap)).unique().sortBy(GithubUtils.getPullRequestNumberFromURL).value(); const sortedDeployBlockers = _.sortBy(_.unique(deployBlockers), GithubUtils.getIssueOrPullRequestNumberFromURL); // Tag version and comparison URL @@ -415,7 +412,7 @@ class GithubUtils { issueBody += '\r\n\r\ncc @Expensify/applauseleads\r\n'; return issueBody; }) - .catch((err) => console.warn('Error generating StagingDeployCash issue body!', 'Automated PRs may not be properly filtered out. Continuing...', err)); + .catch((err) => console.warn('Error generating StagingDeployCash issue body! Continuing...', err)); } /** @@ -595,16 +592,6 @@ class GithubUtils { return Number.parseInt(matches[1], 10); } - /** - * Determine if a given pull request is an automated PR. - * - * @param {Object} pullRequest - * @returns {Boolean} - */ - static isAutomatedPullRequest(pullRequest) { - return _.isEqual(lodashGet(pullRequest, 'user.login', ''), CONST.OS_BOTIFY); - } - /** * Return the login of the actor who closed an issue or PR. If the issue is not closed, return an empty string. * diff --git a/.github/actions/javascript/isStagingDeployLocked/index.js b/.github/actions/javascript/isStagingDeployLocked/index.js index 650021e3cbb3..9a44f0418d27 100644 --- a/.github/actions/javascript/isStagingDeployLocked/index.js +++ b/.github/actions/javascript/isStagingDeployLocked/index.js @@ -296,9 +296,6 @@ class GithubUtils { ) { return this.fetchAllPullRequests(_.map(PRList, this.getPullRequestNumberFromURL)) .then((data) => { - const automatedPRs = _.pluck(_.filter(data, GithubUtils.isAutomatedPullRequest), 'html_url'); - console.log('Filtering out the following automated pull requests:', automatedPRs); - // The format of this map is following: // { // 'https://github.com/Expensify/App/pull/9641': [ 'PauloGasparSv', 'kidroca' ], @@ -322,7 +319,7 @@ class GithubUtils { console.log('Found the following NO QA PRs:', noQAPRs); const verifiedOrNoQAPRs = _.union(verifiedPRList, noQAPRs); - const sortedPRList = _.chain(PRList).difference(automatedPRs).difference(_.keys(internalQAPRMap)).unique().sortBy(GithubUtils.getPullRequestNumberFromURL).value(); + const sortedPRList = _.chain(PRList).difference(_.keys(internalQAPRMap)).unique().sortBy(GithubUtils.getPullRequestNumberFromURL).value(); const sortedDeployBlockers = _.sortBy(_.unique(deployBlockers), GithubUtils.getIssueOrPullRequestNumberFromURL); // Tag version and comparison URL @@ -379,7 +376,7 @@ class GithubUtils { issueBody += '\r\n\r\ncc @Expensify/applauseleads\r\n'; return issueBody; }) - .catch((err) => console.warn('Error generating StagingDeployCash issue body!', 'Automated PRs may not be properly filtered out. Continuing...', err)); + .catch((err) => console.warn('Error generating StagingDeployCash issue body! Continuing...', err)); } /** @@ -559,16 +556,6 @@ class GithubUtils { return Number.parseInt(matches[1], 10); } - /** - * Determine if a given pull request is an automated PR. - * - * @param {Object} pullRequest - * @returns {Boolean} - */ - static isAutomatedPullRequest(pullRequest) { - return _.isEqual(lodashGet(pullRequest, 'user.login', ''), CONST.OS_BOTIFY); - } - /** * Return the login of the actor who closed an issue or PR. If the issue is not closed, return an empty string. * diff --git a/.github/actions/javascript/markPullRequestsAsDeployed/index.js b/.github/actions/javascript/markPullRequestsAsDeployed/index.js index 6174a21f629f..22ce69749265 100644 --- a/.github/actions/javascript/markPullRequestsAsDeployed/index.js +++ b/.github/actions/javascript/markPullRequestsAsDeployed/index.js @@ -473,9 +473,6 @@ class GithubUtils { ) { return this.fetchAllPullRequests(_.map(PRList, this.getPullRequestNumberFromURL)) .then((data) => { - const automatedPRs = _.pluck(_.filter(data, GithubUtils.isAutomatedPullRequest), 'html_url'); - console.log('Filtering out the following automated pull requests:', automatedPRs); - // The format of this map is following: // { // 'https://github.com/Expensify/App/pull/9641': [ 'PauloGasparSv', 'kidroca' ], @@ -499,7 +496,7 @@ class GithubUtils { console.log('Found the following NO QA PRs:', noQAPRs); const verifiedOrNoQAPRs = _.union(verifiedPRList, noQAPRs); - const sortedPRList = _.chain(PRList).difference(automatedPRs).difference(_.keys(internalQAPRMap)).unique().sortBy(GithubUtils.getPullRequestNumberFromURL).value(); + const sortedPRList = _.chain(PRList).difference(_.keys(internalQAPRMap)).unique().sortBy(GithubUtils.getPullRequestNumberFromURL).value(); const sortedDeployBlockers = _.sortBy(_.unique(deployBlockers), GithubUtils.getIssueOrPullRequestNumberFromURL); // Tag version and comparison URL @@ -556,7 +553,7 @@ class GithubUtils { issueBody += '\r\n\r\ncc @Expensify/applauseleads\r\n'; return issueBody; }) - .catch((err) => console.warn('Error generating StagingDeployCash issue body!', 'Automated PRs may not be properly filtered out. Continuing...', err)); + .catch((err) => console.warn('Error generating StagingDeployCash issue body! Continuing...', err)); } /** @@ -736,16 +733,6 @@ class GithubUtils { return Number.parseInt(matches[1], 10); } - /** - * Determine if a given pull request is an automated PR. - * - * @param {Object} pullRequest - * @returns {Boolean} - */ - static isAutomatedPullRequest(pullRequest) { - return _.isEqual(lodashGet(pullRequest, 'user.login', ''), CONST.OS_BOTIFY); - } - /** * Return the login of the actor who closed an issue or PR. If the issue is not closed, return an empty string. * diff --git a/.github/actions/javascript/postTestBuildComment/index.js b/.github/actions/javascript/postTestBuildComment/index.js index c52177037668..2291b2f3cec2 100644 --- a/.github/actions/javascript/postTestBuildComment/index.js +++ b/.github/actions/javascript/postTestBuildComment/index.js @@ -340,9 +340,6 @@ class GithubUtils { ) { return this.fetchAllPullRequests(_.map(PRList, this.getPullRequestNumberFromURL)) .then((data) => { - const automatedPRs = _.pluck(_.filter(data, GithubUtils.isAutomatedPullRequest), 'html_url'); - console.log('Filtering out the following automated pull requests:', automatedPRs); - // The format of this map is following: // { // 'https://github.com/Expensify/App/pull/9641': [ 'PauloGasparSv', 'kidroca' ], @@ -366,7 +363,7 @@ class GithubUtils { console.log('Found the following NO QA PRs:', noQAPRs); const verifiedOrNoQAPRs = _.union(verifiedPRList, noQAPRs); - const sortedPRList = _.chain(PRList).difference(automatedPRs).difference(_.keys(internalQAPRMap)).unique().sortBy(GithubUtils.getPullRequestNumberFromURL).value(); + const sortedPRList = _.chain(PRList).difference(_.keys(internalQAPRMap)).unique().sortBy(GithubUtils.getPullRequestNumberFromURL).value(); const sortedDeployBlockers = _.sortBy(_.unique(deployBlockers), GithubUtils.getIssueOrPullRequestNumberFromURL); // Tag version and comparison URL @@ -423,7 +420,7 @@ class GithubUtils { issueBody += '\r\n\r\ncc @Expensify/applauseleads\r\n'; return issueBody; }) - .catch((err) => console.warn('Error generating StagingDeployCash issue body!', 'Automated PRs may not be properly filtered out. Continuing...', err)); + .catch((err) => console.warn('Error generating StagingDeployCash issue body! Continuing...', err)); } /** @@ -603,16 +600,6 @@ class GithubUtils { return Number.parseInt(matches[1], 10); } - /** - * Determine if a given pull request is an automated PR. - * - * @param {Object} pullRequest - * @returns {Boolean} - */ - static isAutomatedPullRequest(pullRequest) { - return _.isEqual(lodashGet(pullRequest, 'user.login', ''), CONST.OS_BOTIFY); - } - /** * Return the login of the actor who closed an issue or PR. If the issue is not closed, return an empty string. * diff --git a/.github/actions/javascript/reopenIssueWithComment/index.js b/.github/actions/javascript/reopenIssueWithComment/index.js index 4c5167ca3275..536afba4b408 100644 --- a/.github/actions/javascript/reopenIssueWithComment/index.js +++ b/.github/actions/javascript/reopenIssueWithComment/index.js @@ -309,9 +309,6 @@ class GithubUtils { ) { return this.fetchAllPullRequests(_.map(PRList, this.getPullRequestNumberFromURL)) .then((data) => { - const automatedPRs = _.pluck(_.filter(data, GithubUtils.isAutomatedPullRequest), 'html_url'); - console.log('Filtering out the following automated pull requests:', automatedPRs); - // The format of this map is following: // { // 'https://github.com/Expensify/App/pull/9641': [ 'PauloGasparSv', 'kidroca' ], @@ -335,7 +332,7 @@ class GithubUtils { console.log('Found the following NO QA PRs:', noQAPRs); const verifiedOrNoQAPRs = _.union(verifiedPRList, noQAPRs); - const sortedPRList = _.chain(PRList).difference(automatedPRs).difference(_.keys(internalQAPRMap)).unique().sortBy(GithubUtils.getPullRequestNumberFromURL).value(); + const sortedPRList = _.chain(PRList).difference(_.keys(internalQAPRMap)).unique().sortBy(GithubUtils.getPullRequestNumberFromURL).value(); const sortedDeployBlockers = _.sortBy(_.unique(deployBlockers), GithubUtils.getIssueOrPullRequestNumberFromURL); // Tag version and comparison URL @@ -392,7 +389,7 @@ class GithubUtils { issueBody += '\r\n\r\ncc @Expensify/applauseleads\r\n'; return issueBody; }) - .catch((err) => console.warn('Error generating StagingDeployCash issue body!', 'Automated PRs may not be properly filtered out. Continuing...', err)); + .catch((err) => console.warn('Error generating StagingDeployCash issue body! Continuing...', err)); } /** @@ -572,16 +569,6 @@ class GithubUtils { return Number.parseInt(matches[1], 10); } - /** - * Determine if a given pull request is an automated PR. - * - * @param {Object} pullRequest - * @returns {Boolean} - */ - static isAutomatedPullRequest(pullRequest) { - return _.isEqual(lodashGet(pullRequest, 'user.login', ''), CONST.OS_BOTIFY); - } - /** * Return the login of the actor who closed an issue or PR. If the issue is not closed, return an empty string. * diff --git a/.github/actions/javascript/reviewerChecklist/index.js b/.github/actions/javascript/reviewerChecklist/index.js index 6a7434946447..abb9deb48b92 100644 --- a/.github/actions/javascript/reviewerChecklist/index.js +++ b/.github/actions/javascript/reviewerChecklist/index.js @@ -375,9 +375,6 @@ class GithubUtils { ) { return this.fetchAllPullRequests(_.map(PRList, this.getPullRequestNumberFromURL)) .then((data) => { - const automatedPRs = _.pluck(_.filter(data, GithubUtils.isAutomatedPullRequest), 'html_url'); - console.log('Filtering out the following automated pull requests:', automatedPRs); - // The format of this map is following: // { // 'https://github.com/Expensify/App/pull/9641': [ 'PauloGasparSv', 'kidroca' ], @@ -401,7 +398,7 @@ class GithubUtils { console.log('Found the following NO QA PRs:', noQAPRs); const verifiedOrNoQAPRs = _.union(verifiedPRList, noQAPRs); - const sortedPRList = _.chain(PRList).difference(automatedPRs).difference(_.keys(internalQAPRMap)).unique().sortBy(GithubUtils.getPullRequestNumberFromURL).value(); + const sortedPRList = _.chain(PRList).difference(_.keys(internalQAPRMap)).unique().sortBy(GithubUtils.getPullRequestNumberFromURL).value(); const sortedDeployBlockers = _.sortBy(_.unique(deployBlockers), GithubUtils.getIssueOrPullRequestNumberFromURL); // Tag version and comparison URL @@ -458,7 +455,7 @@ class GithubUtils { issueBody += '\r\n\r\ncc @Expensify/applauseleads\r\n'; return issueBody; }) - .catch((err) => console.warn('Error generating StagingDeployCash issue body!', 'Automated PRs may not be properly filtered out. Continuing...', err)); + .catch((err) => console.warn('Error generating StagingDeployCash issue body! Continuing...', err)); } /** @@ -638,16 +635,6 @@ class GithubUtils { return Number.parseInt(matches[1], 10); } - /** - * Determine if a given pull request is an automated PR. - * - * @param {Object} pullRequest - * @returns {Boolean} - */ - static isAutomatedPullRequest(pullRequest) { - return _.isEqual(lodashGet(pullRequest, 'user.login', ''), CONST.OS_BOTIFY); - } - /** * Return the login of the actor who closed an issue or PR. If the issue is not closed, return an empty string. * diff --git a/.github/actions/javascript/triggerWorkflowAndWait/index.js b/.github/actions/javascript/triggerWorkflowAndWait/index.js index 091b759a95ce..413dec66a4f4 100644 --- a/.github/actions/javascript/triggerWorkflowAndWait/index.js +++ b/.github/actions/javascript/triggerWorkflowAndWait/index.js @@ -474,9 +474,6 @@ class GithubUtils { ) { return this.fetchAllPullRequests(_.map(PRList, this.getPullRequestNumberFromURL)) .then((data) => { - const automatedPRs = _.pluck(_.filter(data, GithubUtils.isAutomatedPullRequest), 'html_url'); - console.log('Filtering out the following automated pull requests:', automatedPRs); - // The format of this map is following: // { // 'https://github.com/Expensify/App/pull/9641': [ 'PauloGasparSv', 'kidroca' ], @@ -500,7 +497,7 @@ class GithubUtils { console.log('Found the following NO QA PRs:', noQAPRs); const verifiedOrNoQAPRs = _.union(verifiedPRList, noQAPRs); - const sortedPRList = _.chain(PRList).difference(automatedPRs).difference(_.keys(internalQAPRMap)).unique().sortBy(GithubUtils.getPullRequestNumberFromURL).value(); + const sortedPRList = _.chain(PRList).difference(_.keys(internalQAPRMap)).unique().sortBy(GithubUtils.getPullRequestNumberFromURL).value(); const sortedDeployBlockers = _.sortBy(_.unique(deployBlockers), GithubUtils.getIssueOrPullRequestNumberFromURL); // Tag version and comparison URL @@ -557,7 +554,7 @@ class GithubUtils { issueBody += '\r\n\r\ncc @Expensify/applauseleads\r\n'; return issueBody; }) - .catch((err) => console.warn('Error generating StagingDeployCash issue body!', 'Automated PRs may not be properly filtered out. Continuing...', err)); + .catch((err) => console.warn('Error generating StagingDeployCash issue body! Continuing...', err)); } /** @@ -737,16 +734,6 @@ class GithubUtils { return Number.parseInt(matches[1], 10); } - /** - * Determine if a given pull request is an automated PR. - * - * @param {Object} pullRequest - * @returns {Boolean} - */ - static isAutomatedPullRequest(pullRequest) { - return _.isEqual(lodashGet(pullRequest, 'user.login', ''), CONST.OS_BOTIFY); - } - /** * Return the login of the actor who closed an issue or PR. If the issue is not closed, return an empty string. * diff --git a/.github/actions/javascript/verifySignedCommits/index.js b/.github/actions/javascript/verifySignedCommits/index.js index 3283ab4f6c9a..664c51fefd61 100644 --- a/.github/actions/javascript/verifySignedCommits/index.js +++ b/.github/actions/javascript/verifySignedCommits/index.js @@ -298,9 +298,6 @@ class GithubUtils { ) { return this.fetchAllPullRequests(_.map(PRList, this.getPullRequestNumberFromURL)) .then((data) => { - const automatedPRs = _.pluck(_.filter(data, GithubUtils.isAutomatedPullRequest), 'html_url'); - console.log('Filtering out the following automated pull requests:', automatedPRs); - // The format of this map is following: // { // 'https://github.com/Expensify/App/pull/9641': [ 'PauloGasparSv', 'kidroca' ], @@ -324,7 +321,7 @@ class GithubUtils { console.log('Found the following NO QA PRs:', noQAPRs); const verifiedOrNoQAPRs = _.union(verifiedPRList, noQAPRs); - const sortedPRList = _.chain(PRList).difference(automatedPRs).difference(_.keys(internalQAPRMap)).unique().sortBy(GithubUtils.getPullRequestNumberFromURL).value(); + const sortedPRList = _.chain(PRList).difference(_.keys(internalQAPRMap)).unique().sortBy(GithubUtils.getPullRequestNumberFromURL).value(); const sortedDeployBlockers = _.sortBy(_.unique(deployBlockers), GithubUtils.getIssueOrPullRequestNumberFromURL); // Tag version and comparison URL @@ -381,7 +378,7 @@ class GithubUtils { issueBody += '\r\n\r\ncc @Expensify/applauseleads\r\n'; return issueBody; }) - .catch((err) => console.warn('Error generating StagingDeployCash issue body!', 'Automated PRs may not be properly filtered out. Continuing...', err)); + .catch((err) => console.warn('Error generating StagingDeployCash issue body! Continuing...', err)); } /** @@ -561,16 +558,6 @@ class GithubUtils { return Number.parseInt(matches[1], 10); } - /** - * Determine if a given pull request is an automated PR. - * - * @param {Object} pullRequest - * @returns {Boolean} - */ - static isAutomatedPullRequest(pullRequest) { - return _.isEqual(lodashGet(pullRequest, 'user.login', ''), CONST.OS_BOTIFY); - } - /** * Return the login of the actor who closed an issue or PR. If the issue is not closed, return an empty string. * diff --git a/.github/libs/GithubUtils.js b/.github/libs/GithubUtils.js index 4babce9d769d..2677a8e68fec 100644 --- a/.github/libs/GithubUtils.js +++ b/.github/libs/GithubUtils.js @@ -233,9 +233,6 @@ class GithubUtils { ) { return this.fetchAllPullRequests(_.map(PRList, this.getPullRequestNumberFromURL)) .then((data) => { - const automatedPRs = _.pluck(_.filter(data, GithubUtils.isAutomatedPullRequest), 'html_url'); - console.log('Filtering out the following automated pull requests:', automatedPRs); - // The format of this map is following: // { // 'https://github.com/Expensify/App/pull/9641': [ 'PauloGasparSv', 'kidroca' ], @@ -259,7 +256,7 @@ class GithubUtils { console.log('Found the following NO QA PRs:', noQAPRs); const verifiedOrNoQAPRs = _.union(verifiedPRList, noQAPRs); - const sortedPRList = _.chain(PRList).difference(automatedPRs).difference(_.keys(internalQAPRMap)).unique().sortBy(GithubUtils.getPullRequestNumberFromURL).value(); + const sortedPRList = _.chain(PRList).difference(_.keys(internalQAPRMap)).unique().sortBy(GithubUtils.getPullRequestNumberFromURL).value(); const sortedDeployBlockers = _.sortBy(_.unique(deployBlockers), GithubUtils.getIssueOrPullRequestNumberFromURL); // Tag version and comparison URL @@ -316,7 +313,7 @@ class GithubUtils { issueBody += '\r\n\r\ncc @Expensify/applauseleads\r\n'; return issueBody; }) - .catch((err) => console.warn('Error generating StagingDeployCash issue body!', 'Automated PRs may not be properly filtered out. Continuing...', err)); + .catch((err) => console.warn('Error generating StagingDeployCash issue body! Continuing...', err)); } /** @@ -496,16 +493,6 @@ class GithubUtils { return Number.parseInt(matches[1], 10); } - /** - * Determine if a given pull request is an automated PR. - * - * @param {Object} pullRequest - * @returns {Boolean} - */ - static isAutomatedPullRequest(pullRequest) { - return _.isEqual(lodashGet(pullRequest, 'user.login', ''), CONST.OS_BOTIFY); - } - /** * Return the login of the actor who closed an issue or PR. If the issue is not closed, return an empty string. * From f16da2860f160d99181fae4f381677c5e9f3e7a0 Mon Sep 17 00:00:00 2001 From: rory Date: Fri, 23 Jun 2023 14:23:28 -0700 Subject: [PATCH 4/4] Fix GitHubUtilsTest --- tests/unit/GithubUtilsTest.js | 39 ++++++++++++++--------------------- 1 file changed, 15 insertions(+), 24 deletions(-) diff --git a/tests/unit/GithubUtilsTest.js b/tests/unit/GithubUtilsTest.js index 02b051257168..b2b84dfd9d9f 100644 --- a/tests/unit/GithubUtilsTest.js +++ b/tests/unit/GithubUtilsTest.js @@ -2,7 +2,6 @@ * @jest-environment node */ const core = require('@actions/core'); -const CONST = require('../../.github/libs/CONST'); const GithubUtils = require('../../.github/libs/GithubUtils'); const mockGetInput = jest.fn(); @@ -280,29 +279,22 @@ describe('GithubUtils', () => { }, { number: 4, - title: 'Test Automated PR', - html_url: 'https://github.com/Expensify/App/pull/4', - user: {login: CONST.OS_BOTIFY}, - labels: [{name: 'automerge'}], - }, - { - number: 5, title: '[NO QA] Test No QA PR uppercase', - html_url: 'https://github.com/Expensify/App/pull/5', + html_url: 'https://github.com/Expensify/App/pull/4', user: {login: 'testUser'}, labels: [], }, { - number: 6, + number: 5, title: '[NoQa] Test No QA PR Title Case', - html_url: 'https://github.com/Expensify/App/pull/6', + html_url: 'https://github.com/Expensify/App/pull/5', user: {login: 'testUser'}, labels: [], }, { - number: 7, + number: 6, title: '[Internal QA] Test Internal QA PR', - html_url: 'https://github.com/Expensify/App/pull/7', + html_url: 'https://github.com/Expensify/App/pull/6', user: {login: 'testUser'}, labels: [ { @@ -324,9 +316,9 @@ describe('GithubUtils', () => { ], }, { - number: 8, + number: 7, title: '[Internal QA] Another Test Internal QA PR', - html_url: 'https://github.com/Expensify/App/pull/8', + html_url: 'https://github.com/Expensify/App/pull/7', user: {login: 'testUser'}, labels: [ { @@ -370,15 +362,14 @@ describe('GithubUtils', () => { 'https://github.com/Expensify/App/pull/2', 'https://github.com/Expensify/App/pull/3', 'https://github.com/Expensify/App/pull/1', - 'https://github.com/Expensify/App/pull/4', // Automated 'https://github.com/Expensify/App/pull/3', // This is an intentional duplicate for testing duplicates + 'https://github.com/Expensify/App/pull/4', // No QA 'https://github.com/Expensify/App/pull/5', // No QA - 'https://github.com/Expensify/App/pull/6', // No QA ]; const internalQAPRList = [ + 'https://github.com/Expensify/App/pull/6', // Internal QA 'https://github.com/Expensify/App/pull/7', // Internal QA - 'https://github.com/Expensify/App/pull/8', // Internal QA ]; const baseDeployBlockerList = ['https://github.com/Expensify/App/pull/3', 'https://github.com/Expensify/App/issues/4']; @@ -409,8 +400,8 @@ describe('GithubUtils', () => { `${closedCheckbox}${basePRList[2]}` + `${lineBreak}${closedCheckbox}${basePRList[0]}` + `${lineBreak}${closedCheckbox}${basePRList[1]}` + + `${lineBreak}${closedCheckbox}${basePRList[4]}` + `${lineBreak}${closedCheckbox}${basePRList[5]}` + - `${lineBreak}${closedCheckbox}${basePRList[6]}` + `${lineBreak}`; test('Test no verified PRs', () => @@ -420,8 +411,8 @@ describe('GithubUtils', () => { `${openCheckbox}${basePRList[2]}` + `${lineBreak}${openCheckbox}${basePRList[0]}` + `${lineBreak}${openCheckbox}${basePRList[1]}` + + `${lineBreak}${closedCheckbox}${basePRList[4]}` + `${lineBreak}${closedCheckbox}${basePRList[5]}` + - `${lineBreak}${closedCheckbox}${basePRList[6]}` + `${lineBreakDouble}${deployerVerificationsHeader}` + `${lineBreak}${openCheckbox}${timingDashboardVerification}` + `${lineBreak}${openCheckbox}${firebaseVerification}` + @@ -437,8 +428,8 @@ describe('GithubUtils', () => { `${openCheckbox}${basePRList[2]}` + `${lineBreak}${closedCheckbox}${basePRList[0]}` + `${lineBreak}${openCheckbox}${basePRList[1]}` + + `${lineBreak}${closedCheckbox}${basePRList[4]}` + `${lineBreak}${closedCheckbox}${basePRList[5]}` + - `${lineBreak}${closedCheckbox}${basePRList[6]}` + `${lineBreakDouble}${deployerVerificationsHeader}` + `${lineBreak}${openCheckbox}${timingDashboardVerification}` + `${lineBreak}${openCheckbox}${firebaseVerification}` + @@ -496,8 +487,8 @@ describe('GithubUtils', () => { `${closedCheckbox}${basePRList[2]}` + `${lineBreak}${closedCheckbox}${basePRList[0]}` + `${lineBreak}${closedCheckbox}${basePRList[1]}` + + `${lineBreak}${closedCheckbox}${basePRList[4]}` + `${lineBreak}${closedCheckbox}${basePRList[5]}` + - `${lineBreak}${closedCheckbox}${basePRList[6]}` + `${lineBreakDouble}${deployBlockerHeader}` + `${lineBreak}${closedCheckbox}${baseDeployBlockerList[0]}` + `${lineBreak}${closedCheckbox}${baseDeployBlockerList[1]}` + @@ -516,8 +507,8 @@ describe('GithubUtils', () => { `${openCheckbox}${basePRList[2]}` + `${lineBreak}${openCheckbox}${basePRList[0]}` + `${lineBreak}${openCheckbox}${basePRList[1]}` + + `${lineBreak}${closedCheckbox}${basePRList[4]}` + `${lineBreak}${closedCheckbox}${basePRList[5]}` + - `${lineBreak}${closedCheckbox}${basePRList[6]}` + `${lineBreak}${internalQAHeader}` + `${lineBreak}${openCheckbox}${internalQAPRList[0]}${assignOctocatHubot}` + `${lineBreak}${openCheckbox}${internalQAPRList[1]}${assignOctocatHubot}` + @@ -536,8 +527,8 @@ describe('GithubUtils', () => { `${openCheckbox}${basePRList[2]}` + `${lineBreak}${openCheckbox}${basePRList[0]}` + `${lineBreak}${openCheckbox}${basePRList[1]}` + + `${lineBreak}${closedCheckbox}${basePRList[4]}` + `${lineBreak}${closedCheckbox}${basePRList[5]}` + - `${lineBreak}${closedCheckbox}${basePRList[6]}` + `${lineBreak}${internalQAHeader}` + `${lineBreak}${closedCheckbox}${internalQAPRList[0]}${assignOctocatHubot}` + `${lineBreak}${openCheckbox}${internalQAPRList[1]}${assignOctocatHubot}` +