From eb579ff3885446c3255e22691965cd612650de7d Mon Sep 17 00:00:00 2001 From: Rhys Arkins Date: Tue, 26 Dec 2017 06:26:33 +0100 Subject: [PATCH] feat: restart renovation after github error When 404 or 422 errors are encountered writing updates, Renovate will now restart in an attempt to fix it. Usually this is because branches/PRs have been edited or closed while Renovate is running. Closes #1299 --- lib/workers/branch/index.js | 5 +++++ lib/workers/repository/index.js | 4 ++++ lib/workers/repository/write.js | 3 +++ test/workers/repository/index.spec.js | 1 + test/workers/repository/write.spec.js | 7 +++++++ 5 files changed, 20 insertions(+) diff --git a/lib/workers/branch/index.js b/lib/workers/branch/index.js index 19fdd88224..26ab3c9e63 100644 --- a/lib/workers/branch/index.js +++ b/lib/workers/branch/index.js @@ -116,6 +116,11 @@ async function processBranch(branchConfig) { config.forcePr = true; } } catch (err) { + // istanbul ignore if + if (err.statusCode === 404 || err.statusCode === 422) { + logger.warn({ err }, `Error updating branch: ${err.message}`); + return 'platform-error'; + } logger.error({ err }, `Error updating branch: ${err.message}`); // Don't throw here - we don't want to stop the other renovations return 'error'; diff --git a/lib/workers/repository/index.js b/lib/workers/repository/index.js index ef6f1ad13f..00b3312693 100644 --- a/lib/workers/repository/index.js +++ b/lib/workers/repository/index.js @@ -32,6 +32,10 @@ async function renovateRepository(repoConfig, token, loop = 1) { logger.info('Restarting repo renovation after automerge'); return renovateRepository(repoConfig, token, loop + 1); } + if (res === 'platform-error') { + logger.info('Restarting renovation after platform error'); + return renovateRepository(repoConfig, token, loop + 1); + } return res; } catch (err) { return handleError(config, err); diff --git a/lib/workers/repository/write.js b/lib/workers/repository/write.js index 076f6e0688..455537d0a5 100644 --- a/lib/workers/repository/write.js +++ b/lib/workers/repository/write.js @@ -21,6 +21,9 @@ async function writeUpdates(config) { // Stop procesing other branches because base branch has been changed by an automerge return 'automerged'; } + if (res === 'platform-error') { + return 'platform-error'; + } } return 'done'; } finally { diff --git a/test/workers/repository/index.spec.js b/test/workers/repository/index.spec.js index 2c39859c8c..267a983f0b 100644 --- a/test/workers/repository/index.spec.js +++ b/test/workers/repository/index.spec.js @@ -28,6 +28,7 @@ describe('workers/repository', () => { it('writes', async () => { determineUpdates.mockReturnValue({ repoIsOnboarded: true }); writeUpdates.mockReturnValueOnce('automerged'); + writeUpdates.mockReturnValueOnce('platform-error'); writeUpdates.mockReturnValueOnce('onboarded'); const res = await renovateRepository(config, 'some-token'); expect(res).toMatchSnapshot(); diff --git a/test/workers/repository/write.spec.js b/test/workers/repository/write.spec.js index 6f8e335811..3ab58a9c29 100644 --- a/test/workers/repository/write.spec.js +++ b/test/workers/repository/write.spec.js @@ -25,5 +25,12 @@ describe('workers/repository/write', () => { expect(res).toEqual('automerged'); expect(branchWorker.processBranch.mock.calls).toHaveLength(2); }); + it('stops after platform error', async () => { + config.branches = [{}, {}]; + branchWorker.processBranch.mockReturnValueOnce('platform-error'); + const res = await writeUpdates(config); + expect(res).toEqual('platform-error'); + expect(branchWorker.processBranch.mock.calls).toHaveLength(1); + }); }); });