diff --git a/.github/workflows/dependabot-auto-merge.yml b/.github/workflows/dependabot-auto-merge.yml index eac6142..69c4a00 100644 --- a/.github/workflows/dependabot-auto-merge.yml +++ b/.github/workflows/dependabot-auto-merge.yml @@ -64,11 +64,17 @@ jobs: status === "SKIPPED" || status === "NEUTRAL"; - const { data: pr } = await github.rest.pulls.get({ - owner, - repo, - pull_number, - }); + const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); + const getPullRequest = async () => { + const { data } = await github.rest.pulls.get({ + owner, + repo, + pull_number, + }); + return data; + }; + + let pr = await getPullRequest(); if (pr.user?.login !== "dependabot[bot]") { core.info(`PR #${pull_number} is no longer a Dependabot PR.`); @@ -80,8 +86,14 @@ jobs: return; } - if (pr.mergeable === false) { - core.info(`PR #${pull_number} has merge conflicts.`); + for (let attempt = 1; attempt <= 6 && pr.mergeable === null; attempt += 1) { + core.info(`PR #${pull_number} mergeability is still being computed; retry ${attempt}/6.`); + await wait(5000); + pr = await getPullRequest(); + } + + if (pr.mergeable !== true) { + core.info(`PR #${pull_number} is not currently mergeable; skipping auto-merge.`); return; } @@ -109,12 +121,21 @@ jobs: return; } - await github.rest.pulls.merge({ - owner, - repo, - pull_number, - merge_method: "merge", - }); + try { + await github.rest.pulls.merge({ + owner, + repo, + pull_number, + merge_method: "merge", + }); + } catch (error) { + if (error.status === 405 || error.status === 409) { + core.info(`PR #${pull_number} could not be merged right now: ${error.message}`); + return; + } + + throw error; + } await github.rest.git.deleteRef({ owner,