Skip to content

Commit 8919c5f

Browse files
committed
Implement GHEventPayload.WorkflowRun and GHEventPayload.WorkflowDispatch
Fixes hub4j#1037
1 parent b8f00bc commit 8919c5f

7 files changed

Lines changed: 1302 additions & 7 deletions

File tree

src/main/java/org/kohsuke/github/GHEventPayload.java

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import java.io.Reader;
88
import java.util.Date;
99
import java.util.List;
10+
import java.util.Map;
1011

1112
/**
1213
* Base type for types used in databinding of the event payload.
@@ -1326,4 +1327,86 @@ void wrapUp(GitHub root) {
13261327
}
13271328
}
13281329
}
1330+
1331+
/**
1332+
* Occurs when someone triggered a workflow run or sends a POST request to the "Create a workflow dispatch event"
1333+
* endpoint.
1334+
*
1335+
* @see <a href=
1336+
* "https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#workflow_dispatch">
1337+
* workflow dispatch event</a>
1338+
* @see <a href=
1339+
* "https://docs.github.com/en/actions/reference/events-that-trigger-workflows#workflow_dispatch">Events that
1340+
* trigger workflows</a>
1341+
*/
1342+
public static class WorkflowDispatch extends GHEventPayload {
1343+
private Map<String, Object> inputs;
1344+
private String ref;
1345+
private String workflow;
1346+
1347+
/**
1348+
* Gets the map of input parameters passed to the workflow.
1349+
*
1350+
* @return the map of input parameters
1351+
*/
1352+
public Map<String, Object> getInputs() {
1353+
return inputs;
1354+
}
1355+
1356+
/**
1357+
* Gets the ref of the branch (e.g. refs/heads/main)
1358+
*
1359+
* @return the ref of the branch
1360+
*/
1361+
public String getRef() {
1362+
return ref;
1363+
}
1364+
1365+
/**
1366+
* Gets the path of the workflow file (e.g. .github/workflows/hello-world-workflow.yml).
1367+
*
1368+
* @return the path of the workflow file
1369+
*/
1370+
public String getWorkflow() {
1371+
return workflow;
1372+
}
1373+
}
1374+
1375+
/**
1376+
* A workflow run was requested or completed.
1377+
*
1378+
* @see <a href=
1379+
* "https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#workflow_run">
1380+
* workflow run event</a>
1381+
* @see <a href="https://docs.github.com/en/rest/reference/actions#workflow-runs">Actions Workflow Runs</a>
1382+
*/
1383+
public static class WorkflowRun extends GHEventPayload {
1384+
private GHWorkflowRun workflowRun;
1385+
private GHWorkflow workflow;
1386+
1387+
public GHWorkflowRun getWorkflowRun() {
1388+
return workflowRun;
1389+
}
1390+
1391+
public GHWorkflow getWorkflow() {
1392+
return workflow;
1393+
}
1394+
1395+
@Override
1396+
void wrapUp(GitHub root) {
1397+
super.wrapUp(root);
1398+
if (workflowRun == null || workflow == null) {
1399+
throw new IllegalStateException(
1400+
"Expected workflow and workflow_run payload, but got something else. Maybe we've got another type of event?");
1401+
}
1402+
GHRepository repository = getRepository();
1403+
if (repository != null) {
1404+
workflowRun.wrapUp(repository);
1405+
workflow.wrapUp(repository);
1406+
} else {
1407+
workflowRun.wrapUp(root);
1408+
workflow.wrapUp(root);
1409+
}
1410+
}
1411+
}
13291412
}

src/main/java/org/kohsuke/github/GHWorkflowRun.java

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@
66

77
import java.io.IOException;
88
import java.net.URL;
9+
import java.util.Arrays;
10+
import java.util.Collections;
911
import java.util.Date;
12+
import java.util.List;
1013
import java.util.Locale;
1114
import java.util.Objects;
1215

@@ -43,10 +46,7 @@ public class GHWorkflowRun extends GHObject {
4346
private String status;
4447
private String conclusion;
4548

46-
// TODO GHWorkflowRun
47-
/*
48-
* "pull_requests": [],
49-
*/
49+
private GHPullRequest[] pullRequests;
5050

5151
/**
5252
* The name of the workflow run.
@@ -210,6 +210,27 @@ public Conclusion getConclusion() {
210210
return Conclusion.from(conclusion);
211211
}
212212

213+
/**
214+
* Gets the pull requests participated in this workflow run.
215+
*
216+
* Note this field is only populated for events. When getting a {@link GHWorkflowRun} outside of an event, this is
217+
* always empty.
218+
*
219+
* @return the list of {@link GHPullRequest}s for this workflow run. Only populated for events.
220+
* @throws IOException
221+
* the io exception
222+
*/
223+
public List<GHPullRequest> getPullRequests() throws IOException {
224+
if (pullRequests != null && pullRequests.length != 0) {
225+
for (GHPullRequest pullRequest : pullRequests) {
226+
// Only refresh if we haven't do so before
227+
pullRequest.refresh(pullRequest.getTitle());
228+
}
229+
return Collections.unmodifiableList(Arrays.asList(pullRequests));
230+
}
231+
return Collections.emptyList();
232+
}
233+
213234
/**
214235
* Cancel the workflow run.
215236
*
@@ -257,10 +278,21 @@ GHWorkflowRun wrapUp(GHRepository owner) {
257278

258279
GHWorkflowRun wrapUp(GitHub root) {
259280
this.root = root;
260-
if (owner != null)
281+
if (owner != null) {
261282
owner.wrap(root);
262-
if (headRepository != null)
283+
if (pullRequests != null) {
284+
for (GHPullRequest singlePull : pullRequests) {
285+
singlePull.wrap(owner);
286+
}
287+
}
288+
} else if (pullRequests != null) {
289+
for (GHPullRequest singlePull : pullRequests) {
290+
singlePull.wrap(root);
291+
}
292+
}
293+
if (headRepository != null) {
263294
headRepository.wrap(root);
295+
}
264296
return this;
265297
}
266298

src/test/java/org/kohsuke/github/GHEventPayloadTest.java

Lines changed: 111 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,20 @@
88
import java.io.IOException;
99
import java.text.SimpleDateFormat;
1010
import java.util.Collections;
11+
import java.util.List;
1112
import java.util.TimeZone;
1213

1314
import static java.lang.Boolean.TRUE;
14-
import static org.hamcrest.Matchers.*;
15+
import static org.hamcrest.Matchers.aMapWithSize;
16+
import static org.hamcrest.Matchers.contains;
17+
import static org.hamcrest.Matchers.endsWith;
18+
import static org.hamcrest.Matchers.equalTo;
19+
import static org.hamcrest.Matchers.hasToString;
20+
import static org.hamcrest.Matchers.is;
21+
import static org.hamcrest.Matchers.lessThanOrEqualTo;
22+
import static org.hamcrest.Matchers.notNullValue;
23+
import static org.hamcrest.Matchers.nullValue;
24+
import static org.hamcrest.Matchers.startsWith;
1525

1626
public class GHEventPayloadTest extends AbstractGitHubWireMockTest {
1727

@@ -695,4 +705,104 @@ public void InstallationEvent() throws Exception {
695705

696706
assertThat(event.getSender().getLogin(), is("octocat"));
697707
}
708+
709+
@Test
710+
public void workflow_dispatch() throws Exception {
711+
GHEventPayload.WorkflowDispatch workflowDispatchPayload = GitHub.offline()
712+
.parseEventPayload(payload.asReader(), GHEventPayload.WorkflowDispatch.class);
713+
714+
assertThat(workflowDispatchPayload.getRef(), is("refs/heads/main"));
715+
assertThat(workflowDispatchPayload.getAction(), is(nullValue()));
716+
assertThat(workflowDispatchPayload.getWorkflow(), is(".github/workflows/main.yml"));
717+
assertThat(workflowDispatchPayload.getInputs(), aMapWithSize(1));
718+
assertThat(workflowDispatchPayload.getInputs().keySet(), contains("logLevel"));
719+
assertThat(workflowDispatchPayload.getInputs().values(), contains("warning"));
720+
assertThat(workflowDispatchPayload.getRepository().getName(), is("quarkus-bot-java-playground"));
721+
assertThat(workflowDispatchPayload.getSender().getLogin(), is("gsmet"));
722+
}
723+
724+
@Test
725+
public void workflow_run() throws Exception {
726+
GHEventPayload.WorkflowRun workflowRunPayload = GitHub.offline()
727+
.parseEventPayload(payload.asReader(), GHEventPayload.WorkflowRun.class);
728+
729+
assertThat(workflowRunPayload.getAction(), is("completed"));
730+
assertThat(workflowRunPayload.getRepository().getFullName(), is("gsmet/quarkus-bot-java-playground"));
731+
assertThat(workflowRunPayload.getSender().getLogin(), is("gsmet"));
732+
733+
GHWorkflow workflow = workflowRunPayload.getWorkflow();
734+
assertThat(workflow.getId(), is(7087581L));
735+
assertThat(workflow.getName(), is("CI"));
736+
assertThat(workflow.getPath(), is(".github/workflows/main.yml"));
737+
assertThat(workflow.getState(), is("active"));
738+
assertThat(workflow.getUrl().toString(),
739+
is("https://api.github.com/repos/gsmet/quarkus-bot-java-playground/actions/workflows/7087581"));
740+
assertThat(workflow.getHtmlUrl().toString(),
741+
is("https://github.com/gsmet/quarkus-bot-java-playground/blob/main/.github/workflows/main.yml"));
742+
assertThat(workflow.getBadgeUrl().toString(),
743+
is("https://github.com/gsmet/quarkus-bot-java-playground/workflows/CI/badge.svg"));
744+
745+
GHWorkflowRun workflowRun = workflowRunPayload.getWorkflowRun();
746+
assertThat(workflowRun.getId(), is(680604745L));
747+
assertThat(workflowRun.getName(), is("CI"));
748+
assertThat(workflowRun.getHeadBranch(), is("main"));
749+
assertThat(workflowRun.getHeadSha(), is("dbea8d8b6ed2cf764dfd84a215f3f9040b3d4423"));
750+
assertThat(workflowRun.getRunNumber(), is(6L));
751+
assertThat(workflowRun.getEvent(), is(GHEvent.WORKFLOW_DISPATCH));
752+
assertThat(workflowRun.getStatus(), is(GHWorkflowRun.Status.COMPLETED));
753+
assertThat(workflowRun.getConclusion(), is(GHWorkflowRun.Conclusion.SUCCESS));
754+
assertThat(workflowRun.getWorkflowId(), is(7087581L));
755+
assertThat(workflowRun.getUrl().toString(),
756+
is("https://api.github.com/repos/gsmet/quarkus-bot-java-playground/actions/runs/680604745"));
757+
assertThat(workflowRun.getHtmlUrl().toString(),
758+
is("https://github.com/gsmet/quarkus-bot-java-playground/actions/runs/680604745"));
759+
assertThat(workflowRun.getJobsUrl().toString(),
760+
is("https://api.github.com/repos/gsmet/quarkus-bot-java-playground/actions/runs/680604745/jobs"));
761+
assertThat(workflowRun.getLogsUrl().toString(),
762+
is("https://api.github.com/repos/gsmet/quarkus-bot-java-playground/actions/runs/680604745/logs"));
763+
assertThat(workflowRun.getCheckSuiteUrl().toString(),
764+
is("https://api.github.com/repos/gsmet/quarkus-bot-java-playground/check-suites/2327154397"));
765+
assertThat(workflowRun.getArtifactsUrl().toString(),
766+
is("https://api.github.com/repos/gsmet/quarkus-bot-java-playground/actions/runs/680604745/artifacts"));
767+
assertThat(workflowRun.getCancelUrl().toString(),
768+
is("https://api.github.com/repos/gsmet/quarkus-bot-java-playground/actions/runs/680604745/cancel"));
769+
assertThat(workflowRun.getRerunUrl().toString(),
770+
is("https://api.github.com/repos/gsmet/quarkus-bot-java-playground/actions/runs/680604745/rerun"));
771+
assertThat(workflowRun.getWorkflowUrl().toString(),
772+
is("https://api.github.com/repos/gsmet/quarkus-bot-java-playground/actions/workflows/7087581"));
773+
assertThat(workflowRun.getCreatedAt().getTime(), is(1616524526000L));
774+
assertThat(workflowRun.getUpdatedAt().getTime(), is(1616524543000L));
775+
assertThat(workflowRun.getHeadCommit().getId(), is("dbea8d8b6ed2cf764dfd84a215f3f9040b3d4423"));
776+
assertThat(workflowRun.getHeadCommit().getTreeId(), is("b17089e6a2574ec1002566fe980923e62dce3026"));
777+
assertThat(workflowRun.getHeadCommit().getMessage(), is("Update main.yml"));
778+
assertThat(workflowRun.getHeadCommit().getTimestamp().getTime(), is(1616523390000L));
779+
assertThat(workflowRun.getHeadCommit().getAuthor().getName(), is("Guillaume Smet"));
780+
assertThat(workflowRun.getHeadCommit().getAuthor().getEmail(), is("[email protected]"));
781+
assertThat(workflowRun.getHeadCommit().getCommitter().getName(), is("GitHub"));
782+
assertThat(workflowRun.getHeadCommit().getCommitter().getEmail(), is("[email protected]"));
783+
assertThat(workflowRun.getHeadRepository().getFullName(), is("gsmet/quarkus-bot-java-playground"));
784+
}
785+
786+
@Test
787+
public void workflow_run_pull_request() throws Exception {
788+
GHEventPayload.WorkflowRun workflowRunPayload = GitHub.offline()
789+
.parseEventPayload(payload.asReader(), GHEventPayload.WorkflowRun.class);
790+
791+
List<GHPullRequest> pullRequests = workflowRunPayload.getWorkflowRun().getPullRequests();
792+
assertThat(pullRequests.size(), is(1));
793+
794+
GHPullRequest pullRequest = pullRequests.get(0);
795+
assertThat(pullRequest.getId(), is(599098265L));
796+
}
797+
798+
@Test
799+
public void workflow_run_other_repository() throws Exception {
800+
GHEventPayload.WorkflowRun workflowRunPayload = GitHub.offline()
801+
.parseEventPayload(payload.asReader(), GHEventPayload.WorkflowRun.class);
802+
GHWorkflowRun workflowRun = workflowRunPayload.getWorkflowRun();
803+
804+
assertThat(workflowRunPayload.getRepository().getFullName(), is("gsmet/quarkus-bot-java-playground"));
805+
assertThat(workflowRun.getHeadRepository().getFullName(),
806+
is("gsmet-bot-playground/quarkus-bot-java-playground"));
807+
}
698808
}

0 commit comments

Comments
 (0)