Skip to content

Commit 1f4896c

Browse files
authored
Add support for workflow_run events (#156)
Resolves #155 This adds support for `workflow_run` triggered auth-merges. Because [this event is similar to `check_suite`](https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#workflow_run) I was able to reuse the existing handle check logic.
1 parent 4d2ac8c commit 1f4896c

3 files changed

Lines changed: 71 additions & 62 deletions

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,7 @@ Automerge can be configured to run for these events:
229229
* `schedule`
230230
* `status`
231231
* `workflow_dispatch`
232+
* `workflow_run`
232233

233234
For more information on when these occur, see the Github documentation on [events that trigger workflows](https://docs.github.com/en/actions/reference/events-that-trigger-workflows) and [their payloads](https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads).
234235

dist/index.js

Lines changed: 35 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,8 @@ async function executeGitHubAction(context, eventName, eventData) {
7676
await handleStatusUpdate(context, eventName, eventData);
7777
} else if (["pull_request", "pull_request_target"].includes(eventName)) {
7878
await handlePullRequestUpdate(context, eventName, eventData);
79-
} else if (["check_suite", "check_run"].includes(eventName)) {
80-
await handleCheckUpdate(context, eventName, eventData);
79+
} else if (["check_suite", "check_run", "workflow_run"].includes(eventName)) {
80+
await handleCheckOrWorkflowUpdate(context, eventName, eventData);
8181
} else if (["pull_request_review"].includes(eventName)) {
8282
await handlePullRequestReviewUpdate(context, eventName, eventData);
8383
} else if (["schedule", "repository_dispatch"].includes(eventName)) {
@@ -136,39 +136,43 @@ async function handleArbitraryPullRequestUpdate(context, eventData) {
136136
}
137137
}
138138

139-
async function handleCheckUpdate(context, eventName, event) {
139+
async function handleCheckOrWorkflowUpdate(context, eventName, event) {
140140
const { action } = event;
141+
const eventType = eventName === "workflow_run" ? "workflow" : "status check";
141142
if (action !== "completed") {
142-
logger.info("A status check is not yet complete:", eventName);
143-
} else {
144-
const payload =
145-
eventName === "check_suite" ? event.check_suite : event.check_run;
146-
if (payload.conclusion === "success") {
147-
logger.info("Status check completed successfully");
148-
const checkPullRequest = payload.pull_requests[0];
149-
if (checkPullRequest != null) {
150-
const { octokit } = context;
151-
const { data: pullRequest } = await octokit.request(
152-
checkPullRequest.url
153-
);
154-
logger.trace("PR:", pullRequest);
143+
logger.info(`A ${eventType} is not yet complete:`, eventName);
144+
return;
145+
}
155146

156-
await update(context, pullRequest);
157-
await merge(context, pullRequest);
158-
} else {
159-
const branchName = payload.head_branch;
160-
if (branchName != null) {
161-
await checkPullRequestsForBranches(context, event, branchName);
162-
} else {
163-
await checkPullRequestsForHeadSha(
164-
context,
165-
event.repository,
166-
payload.head_sha
167-
);
168-
}
169-
}
147+
const payload = event[eventName];
148+
if (!payload) {
149+
throw new Error(`failed to find payload for event type: ${eventName}`);
150+
}
151+
if (payload.conclusion !== "success") {
152+
logger.info(`A ${eventType} completed unsuccessfully:`, eventName);
153+
return;
154+
}
155+
156+
logger.info(`${eventType} completed successfully`);
157+
158+
const eventPullRequest = payload.pull_requests[0];
159+
if (eventPullRequest != null) {
160+
const { octokit } = context;
161+
const { data: pullRequest } = await octokit.request(eventPullRequest.url);
162+
logger.trace("PR:", pullRequest);
163+
164+
await update(context, pullRequest);
165+
await merge(context, pullRequest);
166+
} else {
167+
const branchName = payload.head_branch;
168+
if (branchName != null) {
169+
await checkPullRequestsForBranches(context, event, branchName);
170170
} else {
171-
logger.info("A status check completed unsuccessfully:", eventName);
171+
await checkPullRequestsForHeadSha(
172+
context,
173+
event.repository,
174+
payload.head_sha
175+
);
172176
}
173177
}
174178
}

lib/api.js

Lines changed: 35 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ async function executeGitHubAction(context, eventName, eventData) {
6969
await handleStatusUpdate(context, eventName, eventData);
7070
} else if (["pull_request", "pull_request_target"].includes(eventName)) {
7171
await handlePullRequestUpdate(context, eventName, eventData);
72-
} else if (["check_suite", "check_run"].includes(eventName)) {
73-
await handleCheckUpdate(context, eventName, eventData);
72+
} else if (["check_suite", "check_run", "workflow_run"].includes(eventName)) {
73+
await handleCheckOrWorkflowUpdate(context, eventName, eventData);
7474
} else if (["pull_request_review"].includes(eventName)) {
7575
await handlePullRequestReviewUpdate(context, eventName, eventData);
7676
} else if (["schedule", "repository_dispatch"].includes(eventName)) {
@@ -129,39 +129,43 @@ async function handleArbitraryPullRequestUpdate(context, eventData) {
129129
}
130130
}
131131

132-
async function handleCheckUpdate(context, eventName, event) {
132+
async function handleCheckOrWorkflowUpdate(context, eventName, event) {
133133
const { action } = event;
134+
const eventType = eventName === "workflow_run" ? "workflow" : "status check";
134135
if (action !== "completed") {
135-
logger.info("A status check is not yet complete:", eventName);
136+
logger.info(`A ${eventType} is not yet complete:`, eventName);
137+
return;
138+
}
139+
140+
const payload = event[eventName];
141+
if (!payload) {
142+
throw new Error(`failed to find payload for event type: ${eventName}`);
143+
}
144+
if (payload.conclusion !== "success") {
145+
logger.info(`A ${eventType} completed unsuccessfully:`, eventName);
146+
return;
147+
}
148+
149+
logger.info(`${eventType} completed successfully`);
150+
151+
const eventPullRequest = payload.pull_requests[0];
152+
if (eventPullRequest != null) {
153+
const { octokit } = context;
154+
const { data: pullRequest } = await octokit.request(eventPullRequest.url);
155+
logger.trace("PR:", pullRequest);
156+
157+
await update(context, pullRequest);
158+
await merge(context, pullRequest);
136159
} else {
137-
const payload =
138-
eventName === "check_suite" ? event.check_suite : event.check_run;
139-
if (payload.conclusion === "success") {
140-
logger.info("Status check completed successfully");
141-
const checkPullRequest = payload.pull_requests[0];
142-
if (checkPullRequest != null) {
143-
const { octokit } = context;
144-
const { data: pullRequest } = await octokit.request(
145-
checkPullRequest.url
146-
);
147-
logger.trace("PR:", pullRequest);
148-
149-
await update(context, pullRequest);
150-
await merge(context, pullRequest);
151-
} else {
152-
const branchName = payload.head_branch;
153-
if (branchName != null) {
154-
await checkPullRequestsForBranches(context, event, branchName);
155-
} else {
156-
await checkPullRequestsForHeadSha(
157-
context,
158-
event.repository,
159-
payload.head_sha
160-
);
161-
}
162-
}
160+
const branchName = payload.head_branch;
161+
if (branchName != null) {
162+
await checkPullRequestsForBranches(context, event, branchName);
163163
} else {
164-
logger.info("A status check completed unsuccessfully:", eventName);
164+
await checkPullRequestsForHeadSha(
165+
context,
166+
event.repository,
167+
payload.head_sha
168+
);
165169
}
166170
}
167171
}

0 commit comments

Comments
 (0)