diff --git a/lib/workers/branch/index.ts b/lib/workers/branch/index.ts index 07a8707c48..c66d4e5108 100644 --- a/lib/workers/branch/index.ts +++ b/lib/workers/branch/index.ts @@ -439,8 +439,17 @@ export async function processBranch( await setStability(config); await setUnpublishable(config); + // break if we pushed a new commit because status check are pretty sure pending but maybe not reported yet + if ( + commit && + (config.requiredStatusChecks?.length || config.prCreation !== 'immediate') + ) { + logger.debug({ commit }, `Branch status pending`); + return 'pending'; + } + // Try to automerge branch and finish if successful, but only if branch already existed before this run - if (branchExists || !config.requiresStatusChecks) { + if (branchExists || !config.requiredStatusChecks) { const mergeStatus = await tryBranchAutomerge(config); logger.debug(`mergeStatus=${mergeStatus}`); if (mergeStatus === 'automerged') { diff --git a/test/workers/branch/index.spec.ts b/test/workers/branch/index.spec.ts index adfb1386cc..11c56e81b3 100644 --- a/test/workers/branch/index.spec.ts +++ b/test/workers/branch/index.spec.ts @@ -233,12 +233,33 @@ describe('workers/branch', () => { updatedArtifacts: [{}], } as never); platform.branchExists.mockResolvedValueOnce(true); + commit.commitFilesToBranch.mockResolvedValueOnce(null); automerge.tryBranchAutomerge.mockResolvedValueOnce('automerged'); await branchWorker.processBranch(config); expect(statusChecks.setUnpublishable).toHaveBeenCalledTimes(1); expect(automerge.tryBranchAutomerge).toHaveBeenCalledTimes(1); expect(prWorker.ensurePr).toHaveBeenCalledTimes(0); }); + + it('returns if branch automerged and no checks', async () => { + getUpdated.getUpdatedPackageFiles.mockReturnValueOnce({ + updatedPackageFiles: [{}], + } as never); + npmPostExtract.getAdditionalFiles.mockReturnValueOnce({ + artifactErrors: [], + updatedArtifacts: [{}], + } as never); + platform.branchExists.mockResolvedValueOnce(false); + automerge.tryBranchAutomerge.mockResolvedValueOnce('automerged'); + await branchWorker.processBranch({ + ...config, + requiredStatusChecks: null, + }); + expect(statusChecks.setUnpublishable).toHaveBeenCalledTimes(1); + expect(automerge.tryBranchAutomerge).toHaveBeenCalledTimes(1); + expect(prWorker.ensurePr).toHaveBeenCalledTimes(0); + }); + it('returns if branch automerged (dry-run)', async () => { getUpdated.getUpdatedPackageFiles.mockResolvedValueOnce({ updatedPackageFiles: [{}], @@ -248,6 +269,7 @@ describe('workers/branch', () => { updatedArtifacts: [{}], } as never); platform.branchExists.mockResolvedValueOnce(true); + commit.commitFilesToBranch.mockResolvedValueOnce(null); automerge.tryBranchAutomerge.mockResolvedValueOnce('automerged'); await branchWorker.processBranch({ ...config, dryRun: true }); expect(statusChecks.setUnpublishable).toHaveBeenCalledTimes(1); @@ -263,6 +285,7 @@ describe('workers/branch', () => { updatedArtifacts: [{}], } as never); platform.branchExists.mockResolvedValueOnce(true); + commit.commitFilesToBranch.mockResolvedValueOnce(null); automerge.tryBranchAutomerge.mockResolvedValueOnce('failed'); prWorker.ensurePr.mockResolvedValueOnce('needs-pr-approval'); expect(await branchWorker.processBranch(config)).toEqual( @@ -270,6 +293,7 @@ describe('workers/branch', () => { ); }); it('returns if branch exists but pending', async () => { + expect.assertions(1); getUpdated.getUpdatedPackageFiles.mockResolvedValueOnce({ updatedPackageFiles: [{}], } as never); @@ -278,12 +302,33 @@ describe('workers/branch', () => { updatedArtifacts: [{}], } as never); platform.branchExists.mockResolvedValueOnce(true); + commit.commitFilesToBranch.mockResolvedValueOnce(null); automerge.tryBranchAutomerge.mockResolvedValueOnce('failed'); prWorker.ensurePr.mockResolvedValueOnce('pending'); expect(await branchWorker.processBranch(config)).toEqual( BRANCH_STATUS_PENDING ); }); + it('returns if branch exists but updated', async () => { + expect.assertions(3); + getUpdated.getUpdatedPackageFiles.mockResolvedValueOnce({ + updatedPackageFiles: [{}], + } as never); + npmPostExtract.getAdditionalFiles.mockResolvedValueOnce({ + artifactErrors: [], + updatedArtifacts: [{}], + } as never); + expect( + await branchWorker.processBranch({ + ...config, + requiredStatusChecks: null, + prCreation: 'not-pending', + }) + ).toEqual(BRANCH_STATUS_PENDING); + + expect(automerge.tryBranchAutomerge).toHaveBeenCalledTimes(0); + expect(prWorker.ensurePr).toHaveBeenCalledTimes(0); + }); it('ensures PR and tries automerge', async () => { getUpdated.getUpdatedPackageFiles.mockResolvedValueOnce({ updatedPackageFiles: [{}], @@ -296,6 +341,7 @@ describe('workers/branch', () => { automerge.tryBranchAutomerge.mockResolvedValueOnce('failed'); prWorker.ensurePr.mockResolvedValueOnce({} as never); prWorker.checkAutoMerge.mockResolvedValueOnce(true); + commit.commitFilesToBranch.mockResolvedValueOnce(null); await branchWorker.processBranch(config); expect(prWorker.ensurePr).toHaveBeenCalledTimes(1); expect(platform.ensureCommentRemoval).toHaveBeenCalledTimes(1); @@ -313,6 +359,7 @@ describe('workers/branch', () => { automerge.tryBranchAutomerge.mockResolvedValueOnce('failed'); prWorker.ensurePr.mockResolvedValueOnce({} as never); prWorker.checkAutoMerge.mockResolvedValueOnce(true); + commit.commitFilesToBranch.mockResolvedValueOnce(null); await branchWorker.processBranch(config); expect(platform.ensureComment).toHaveBeenCalledTimes(1); // expect(platform.ensureCommentRemoval.mock.calls).toHaveLength(0); @@ -332,6 +379,7 @@ describe('workers/branch', () => { prWorker.ensurePr.mockResolvedValueOnce({} as never); prWorker.checkAutoMerge.mockResolvedValueOnce(true); config.releaseTimestamp = '2018-04-26T05:15:51.877Z'; + commit.commitFilesToBranch.mockResolvedValueOnce(null); await branchWorker.processBranch(config); expect(platform.ensureComment).toHaveBeenCalledTimes(1); // expect(platform.ensureCommentRemoval.mock.calls).toHaveLength(0); @@ -351,6 +399,7 @@ describe('workers/branch', () => { prWorker.ensurePr.mockResolvedValueOnce({} as never); prWorker.checkAutoMerge.mockResolvedValueOnce(true); config.releaseTimestamp = new Date().toISOString(); + commit.commitFilesToBranch.mockResolvedValueOnce(null); await branchWorker.processBranch(config); expect(platform.ensureComment).toHaveBeenCalledTimes(1); // expect(platform.ensureCommentRemoval.mock.calls).toHaveLength(0); @@ -387,6 +436,7 @@ describe('workers/branch', () => { automerge.tryBranchAutomerge.mockResolvedValueOnce('failed'); prWorker.ensurePr.mockResolvedValueOnce({} as never); prWorker.checkAutoMerge.mockResolvedValueOnce(true); + commit.commitFilesToBranch.mockResolvedValueOnce(null); await branchWorker.processBranch(config); expect(platform.ensureComment).toHaveBeenCalledTimes(1); // expect(platform.ensureCommentRemoval.mock.calls).toHaveLength(0); @@ -494,6 +544,7 @@ describe('workers/branch', () => { schedule.isScheduledNow.mockReturnValueOnce(false); prWorker.ensurePr.mockResolvedValueOnce({} as never); + commit.commitFilesToBranch.mockResolvedValueOnce(null); expect( await branchWorker.processBranch({ ...config,