diff --git a/lib/workers/pr/index.js b/lib/workers/pr/index.js index 6d9db42e5105d6242c55482717e023ac08da8521..3f9df72d49fc666f7988a66544afade5796bb16b 100644 --- a/lib/workers/pr/index.js +++ b/lib/workers/pr/index.js @@ -143,6 +143,10 @@ async function ensurePr(prConfig) { // Check if existing PR exists const existingPr = await config.api.getBranchPr(branchName); if (existingPr) { + if (config.automerge && branchStatus === 'failure') { + logger.debug(`Setting assignees and reviewers as status checks failed`); + await addAssigneesReviewers(config, existingPr); + } // Check if existing PR needs updating if (existingPr.title === prTitle && existingPr.body === prBody) { logger.info(`${existingPr.displayNumber} does not need updating`); @@ -166,39 +170,16 @@ async function ensurePr(prConfig) { await config.api.addLabels(pr.number, config.labels); } // Skip assign and review if automerging PR - if (config.automerge && config.automergeType === 'pr') { + if ( + config.automerge && + config.automergeType === 'pr' && + branchStatus !== 'failure' + ) { logger.debug( `Skipping assignees and reviewers as automerge=${config.automerge}` ); } else { - if (config.assignees.length > 0) { - logger.debug({ assignees: config.assignees }, 'Adding assignees'); - try { - const assignees = config.assignees.map( - assignee => - assignee.length && assignee[0] === '@' - ? assignee.slice(1) - : assignee - ); - await config.api.addAssignees(pr.number, assignees); - } catch (err) { - logger.warn({ err }, 'Failed to add assignees'); - } - } - if (config.reviewers.length > 0) { - logger.debug({ reviewers: config.reviewers }, 'Adding reviewers'); - try { - const reviewers = config.reviewers.map( - reviewer => - reviewer.length && reviewer[0] === '@' - ? reviewer.slice(1) - : reviewer - ); - await config.api.addReviewers(pr.number, reviewers); - } catch (err) { - logger.warn({ err }, 'Failed to add reviewers'); - } - } + await addAssigneesReviewers(config, pr); } logger.info(`Created ${pr.displayNumber}`); return pr; @@ -208,6 +189,34 @@ async function ensurePr(prConfig) { return null; } +async function addAssigneesReviewers(config, pr) { + const { logger } = config; + if (config.assignees.length > 0) { + logger.debug({ assignees: config.assignees }, 'Adding assignees'); + try { + const assignees = config.assignees.map( + assignee => + assignee.length && assignee[0] === '@' ? assignee.slice(1) : assignee + ); + await config.api.addAssignees(pr.number, assignees); + } catch (err) { + logger.warn({ err }, 'Failed to add assignees'); + } + } + if (config.reviewers.length > 0) { + logger.debug({ reviewers: config.reviewers }, 'Adding reviewers'); + try { + const reviewers = config.reviewers.map( + reviewer => + reviewer.length && reviewer[0] === '@' ? reviewer.slice(1) : reviewer + ); + await config.api.addReviewers(pr.number, reviewers); + } catch (err) { + logger.warn({ err }, 'Failed to add reviewers'); + } + } +} + async function checkAutoMerge(pr, config) { const { logger } = config; logger.trace({ config }, 'checkAutoMerge'); diff --git a/test/workers/pr/__snapshots__/index.spec.js.snap b/test/workers/pr/__snapshots__/index.spec.js.snap index 619d8f2a1dc776a524fccfd4dd674af6eccc3604..f4400485f0217ee2ef2c65292d5eb8bd0a30d093 100644 --- a/test/workers/pr/__snapshots__/index.spec.js.snap +++ b/test/workers/pr/__snapshots__/index.spec.js.snap @@ -1,5 +1,7 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`workers/pr ensurePr should add assignees and reviewers to existing PR 1`] = `Array []`; + exports[`workers/pr ensurePr should add assignees and reviewers to new PR 1`] = ` Array [ Array [ diff --git a/test/workers/pr/index.spec.js b/test/workers/pr/index.spec.js index 4c88bd3588c8dda10073d2f61ea727819bbeeaaa..564bb8b522a4548dc45c995701439576ded883e7 100644 --- a/test/workers/pr/index.spec.js +++ b/test/workers/pr/index.spec.js @@ -95,6 +95,8 @@ describe('workers/pr', () => { config = { ...defaultConfig, api: { + addAssignees: jest.fn(), + addReviewers: jest.fn(), createPr: jest.fn(() => ({ displayNumber: 'New Pull Request' })), getBranchStatus: jest.fn(), }, @@ -266,6 +268,27 @@ describe('workers/pr', () => { expect(config.api.addAssignees.mock.calls.length).toBe(0); expect(config.api.addReviewers.mock.calls.length).toBe(0); }); + it('should add assignees and reviewers to existing PR', async () => { + config.depName = 'dummy'; + config.automerge = true; + config.assignees = ['bar']; + config.reviewers = ['baz']; + config.isGitHub = true; + config.privateRepo = true; + config.currentVersion = '1.0.0'; + config.newVersion = '1.1.0'; + config.repositoryUrl = 'https://github.com/renovateapp/dummy'; + config.api.getBranchPr = jest.fn(() => existingPr); + config.api.getBranchStatus.mockReturnValueOnce('failure'); + config.api.updatePr = jest.fn(); + config.semanticPrefix = ''; + const pr = await prWorker.ensurePr(config); + expect(config.api.updatePr.mock.calls).toMatchSnapshot(); + expect(config.api.updatePr.mock.calls.length).toBe(0); + expect(config.api.addAssignees.mock.calls.length).toBe(1); + expect(config.api.addReviewers.mock.calls.length).toBe(1); + expect(pr).toMatchObject(existingPr); + }); it('should return unmodified existing PR', async () => { config.depName = 'dummy'; config.isGitHub = true;