Commit 72669db3 authored by Mitchell Herrijgers's avatar Mitchell Herrijgers
Browse files

Add support for release and deployment events in webhooks

parent db8f9254
...@@ -2064,6 +2064,8 @@ public class ProjectApi extends AbstractApi implements Constants { ...@@ -2064,6 +2064,8 @@ public class ProjectApi extends AbstractApi implements Constants {
.withParam("wiki_events", enabledHooks.getWikiPageEvents(), false) .withParam("wiki_events", enabledHooks.getWikiPageEvents(), false)
.withParam("enable_ssl_verification", enableSslVerification, false) .withParam("enable_ssl_verification", enableSslVerification, false)
.withParam("repository_update_events", enabledHooks.getRepositoryUpdateEvents(), false) .withParam("repository_update_events", enabledHooks.getRepositoryUpdateEvents(), false)
.withParam("releases_events", enabledHooks.getReleasesEvents(), false)
.withParam("deployment_events", enabledHooks.getDeploymentEvents(), false)
.withParam("token", secretToken, false); .withParam("token", secretToken, false);
Response response = post(Response.Status.CREATED, formData, "projects", getProjectIdOrPath(projectIdOrPath), "hooks"); Response response = post(Response.Status.CREATED, formData, "projects", getProjectIdOrPath(projectIdOrPath), "hooks");
return (response.readEntity(ProjectHook.class)); return (response.readEntity(ProjectHook.class));
...@@ -2133,16 +2135,22 @@ public class ProjectApi extends AbstractApi implements Constants { ...@@ -2133,16 +2135,22 @@ public class ProjectApi extends AbstractApi implements Constants {
public ProjectHook modifyHook(ProjectHook hook) throws GitLabApiException { public ProjectHook modifyHook(ProjectHook hook) throws GitLabApiException {
GitLabApiForm formData = new GitLabApiForm() GitLabApiForm formData = new GitLabApiForm()
.withParam("url", hook.getUrl(), true) .withParam("url", hook.getUrl(), true)
.withParam("push_events", hook.getPushEvents(), false) .withParam("push_events", hook.getPushEvents(), false)
.withParam("issues_events", hook.getIssuesEvents(), false) .withParam("push_events_branch_filter", hook.getPushEventsBranchFilter(), false)
.withParam("merge_requests_events", hook.getMergeRequestsEvents(), false) .withParam("issues_events", hook.getIssuesEvents(), false)
.withParam("tag_push_events", hook.getTagPushEvents(), false) .withParam("confidential_issues_events", hook.getConfidentialIssuesEvents(), false)
.withParam("note_events", hook.getNoteEvents(), false) .withParam("merge_requests_events", hook.getMergeRequestsEvents(), false)
.withParam("job_events", hook.getJobEvents(), false) .withParam("tag_push_events", hook.getTagPushEvents(), false)
.withParam("pipeline_events", hook.getPipelineEvents(), false) .withParam("note_events", hook.getNoteEvents(), false)
.withParam("wiki_events", hook.getWikiPageEvents(), false) .withParam("confidential_note_events", hook.getConfidentialNoteEvents(), false)
.withParam("enable_ssl_verification", hook.getEnableSslVerification(), false) .withParam("job_events", hook.getJobEvents(), false)
.withParam("pipeline_events", hook.getPipelineEvents(), false)
.withParam("wiki_events", hook.getWikiPageEvents(), false)
.withParam("enable_ssl_verification", hook.getEnableSslVerification(), false)
.withParam("repository_update_events", hook.getRepositoryUpdateEvents(), false)
.withParam("releases_events", hook.getReleasesEvents(), false)
.withParam("deployment_events", hook.getDeploymentEvents(), false)
.withParam("token", hook.getToken(), false); .withParam("token", hook.getToken(), false);
Response response = put(Response.Status.OK, formData.asMap(), "projects", hook.getProjectId(), "hooks", hook.getId()); Response response = put(Response.Status.OK, formData.asMap(), "projects", hook.getProjectId(), "hooks", hook.getId());
......
package org.gitlab4j.api.models; package org.gitlab4j.api.models;
import java.util.Date;
import org.gitlab4j.api.utils.JacksonJson; import org.gitlab4j.api.utils.JacksonJson;
import java.util.Date;
public class ProjectHook { public class ProjectHook {
private Boolean buildEvents; private Boolean buildEvents;
...@@ -12,6 +12,8 @@ public class ProjectHook { ...@@ -12,6 +12,8 @@ public class ProjectHook {
private Boolean enableSslVerification; private Boolean enableSslVerification;
private Integer id; private Integer id;
private Boolean issuesEvents; private Boolean issuesEvents;
private Boolean deploymentEvents;
private Boolean releasesEvents;
private Boolean mergeRequestsEvents; private Boolean mergeRequestsEvents;
private Boolean noteEvents; private Boolean noteEvents;
private Boolean jobEvents; private Boolean jobEvents;
...@@ -83,7 +85,7 @@ public class ProjectHook { ...@@ -83,7 +85,7 @@ public class ProjectHook {
public void setNoteEvents(Boolean noteEvents) { public void setNoteEvents(Boolean noteEvents) {
this.noteEvents = noteEvents; this.noteEvents = noteEvents;
} }
public Boolean getJobEvents() { public Boolean getJobEvents() {
return jobEvents; return jobEvents;
} }
...@@ -123,7 +125,7 @@ public class ProjectHook { ...@@ -123,7 +125,7 @@ public class ProjectHook {
public void setTagPushEvents(Boolean tagPushEvents) { public void setTagPushEvents(Boolean tagPushEvents) {
this.tagPushEvents = tagPushEvents; this.tagPushEvents = tagPushEvents;
} }
public String getToken() { public String getToken() {
return token; return token;
} }
...@@ -179,7 +181,23 @@ public class ProjectHook { ...@@ -179,7 +181,23 @@ public class ProjectHook {
public void setPushEventsBranchFilter(String pushEventsBranchFilter) { public void setPushEventsBranchFilter(String pushEventsBranchFilter) {
this.pushEventsBranchFilter = pushEventsBranchFilter; this.pushEventsBranchFilter = pushEventsBranchFilter;
} }
public Boolean getDeploymentEvents() {
return deploymentEvents;
}
public void setDeploymentEvents(Boolean deploymentEvents) {
this.deploymentEvents = deploymentEvents;
}
public Boolean getReleasesEvents() {
return releasesEvents;
}
public void setReleasesEvents(Boolean releasesEvents) {
this.releasesEvents = releasesEvents;
}
public ProjectHook withIssuesEvents(Boolean issuesEvents) { public ProjectHook withIssuesEvents(Boolean issuesEvents) {
this.issuesEvents = issuesEvents; this.issuesEvents = issuesEvents;
return (this); return (this);
...@@ -194,7 +212,7 @@ public class ProjectHook { ...@@ -194,7 +212,7 @@ public class ProjectHook {
this.noteEvents = noteEvents; this.noteEvents = noteEvents;
return (this); return (this);
} }
public ProjectHook withJobEvents(Boolean jobEvents) { public ProjectHook withJobEvents(Boolean jobEvents) {
this.jobEvents = jobEvents; this.jobEvents = jobEvents;
return (this); return (this);
...@@ -240,8 +258,18 @@ public class ProjectHook { ...@@ -240,8 +258,18 @@ public class ProjectHook {
return (this); return (this);
} }
public ProjectHook withDeploymentEvents(Boolean deploymentEvents) {
this.deploymentEvents = deploymentEvents;
return (this);
}
public ProjectHook withReleasesEvents(Boolean releasesEvents) {
this.releasesEvents = ProjectHook.this.releasesEvents;
return (this);
}
@Override @Override
public String toString() { public String toString() {
return (JacksonJson.toJsonString(this)); return (JacksonJson.toJsonString(this));
} }
} }
\ No newline at end of file
package org.gitlab4j.api.webhook;
import org.gitlab4j.api.models.User;
import org.gitlab4j.api.utils.JacksonJson;
public class DeploymentEvent extends AbstractEvent {
public static final String JOB_HOOK_X_GITLAB_EVENT = "Deployment Hook";
public static final String OBJECT_KIND = "deployment";
private String status;
private String statusChanged_at;
private Integer deployableId;
private String deployableUrl;
private String environment;
private EventProject project;
private String shortSha;
private User user;
private String userUrl;
private String commitUrl;
private String commitTitle;
public String getObjectKind() {
return (OBJECT_KIND);
}
public void setObjectKind(String objectKind) {
if (!OBJECT_KIND.equals(objectKind))
throw new RuntimeException("Invalid object_kind (" + objectKind + "), must be '" + OBJECT_KIND + "'");
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getStatusChanged_at() {
return statusChanged_at;
}
public void setStatusChanged_at(String statusChanged_at) {
this.statusChanged_at = statusChanged_at;
}
public Integer getDeployableId() {
return deployableId;
}
public void setDeployableId(Integer deployableId) {
this.deployableId = deployableId;
}
public String getDeployableUrl() {
return deployableUrl;
}
public void setDeployableUrl(String deployableUrl) {
this.deployableUrl = deployableUrl;
}
public String getEnvironment() {
return environment;
}
public void setEnvironment(String environment) {
this.environment = environment;
}
public EventProject getProject() {
return project;
}
public void setProject(EventProject project) {
this.project = project;
}
public String getShortSha() {
return shortSha;
}
public void setShortSha(String shortSha) {
this.shortSha = shortSha;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String getUserUrl() {
return userUrl;
}
public void setUserUrl(String userUrl) {
this.userUrl = userUrl;
}
public String getCommitUrl() {
return commitUrl;
}
public void setCommitUrl(String commitUrl) {
this.commitUrl = commitUrl;
}
public String getCommitTitle() {
return commitTitle;
}
public void setCommitTitle(String commitTitle) {
this.commitTitle = commitTitle;
}
@Override
public String toString() {
return (JacksonJson.toJsonString(this));
}
}
...@@ -17,7 +17,9 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo; ...@@ -17,7 +17,9 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo;
@JsonSubTypes.Type(value = PipelineEvent.class, name = PipelineEvent.OBJECT_KIND), @JsonSubTypes.Type(value = PipelineEvent.class, name = PipelineEvent.OBJECT_KIND),
@JsonSubTypes.Type(value = PushEvent.class, name = PushEvent.OBJECT_KIND), @JsonSubTypes.Type(value = PushEvent.class, name = PushEvent.OBJECT_KIND),
@JsonSubTypes.Type(value = TagPushEvent.class, name = TagPushEvent.OBJECT_KIND), @JsonSubTypes.Type(value = TagPushEvent.class, name = TagPushEvent.OBJECT_KIND),
@JsonSubTypes.Type(value = WikiPageEvent.class, name = WikiPageEvent.OBJECT_KIND) @JsonSubTypes.Type(value = WikiPageEvent.class, name = WikiPageEvent.OBJECT_KIND),
@JsonSubTypes.Type(value = DeploymentEvent.class, name = DeploymentEvent.OBJECT_KIND),
@JsonSubTypes.Type(value = ReleaseEvent.class, name = ReleaseEvent.OBJECT_KIND)
}) })
public interface Event { public interface Event {
String getObjectKind(); String getObjectKind();
......
package org.gitlab4j.api.webhook;
import org.gitlab4j.api.utils.JacksonJson;
import java.util.List;
public class EventReleaseAssets {
private Integer count;
private List<EventReleaseLink> links;
private List<EventReleaseSource> sources;
public Integer getCount() {
return count;
}
public void setCount(Integer count) {
this.count = count;
}
public List<EventReleaseLink> getLinks() {
return links;
}
public void setLinks(List<EventReleaseLink> links) {
this.links = links;
}
public List<EventReleaseSource> getSources() {
return sources;
}
public void setSources(List<EventReleaseSource> sources) {
this.sources = sources;
}
@Override
public String toString() {
return (JacksonJson.toJsonString(this));
}
}
package org.gitlab4j.api.webhook;
import org.gitlab4j.api.utils.JacksonJson;
public class EventReleaseLink {
private Integer id;
private Boolean external;
private String linkType;
private String name;
private String url;
public Integer getId() {
return id;
}
public void setId(final Integer id) {
this.id = id;
}
public Boolean getExternal() {
return external;
}
public void setExternal(final Boolean external) {
this.external = external;
}
public String getLinkType() {
return linkType;
}
public void setLinkType(final String linkType) {
this.linkType = linkType;
}
public String getName() {
return name;
}
public void setName(final String name) {
this.name = name;
}
public String getUrl() {
return url;
}
public void setUrl(final String url) {
this.url = url;
}
@Override
public String toString() {
return (JacksonJson.toJsonString(this));
}
}
package org.gitlab4j.api.webhook;
import org.gitlab4j.api.utils.JacksonJson;
public class EventReleaseSource {
private String format;
private String url;
public String getFormat() {
return format;
}
public void setFormat(final String format) {
this.format = format;
}
public String getUrl() {
return url;
}
public void setUrl(final String url) {
this.url = url;
}
@Override
public String toString() {
return (JacksonJson.toJsonString(this));
}
}
package org.gitlab4j.api.webhook;
import org.gitlab4j.api.models.User;
import org.gitlab4j.api.utils.JacksonJson;
public class ReleaseEvent extends AbstractEvent {
public static final String JOB_HOOK_X_GITLAB_EVENT = "Release Hook";
public static final String OBJECT_KIND = "release";
private String action;
private String url;
private String name;
private String description;
private String tag;
private String releasedAt;
private EventCommit commit;
public String getObjectKind() {
return (OBJECT_KIND);
}
public void setObjectKind(String objectKind) {
if (!OBJECT_KIND.equals(objectKind))
throw new RuntimeException("Invalid object_kind (" + objectKind + "), must be '" + OBJECT_KIND + "'");
}
@Override
public String toString() {
return (JacksonJson.toJsonString(this));
}
}
...@@ -78,4 +78,23 @@ public interface WebHookListener extends java.util.EventListener { ...@@ -78,4 +78,23 @@ public interface WebHookListener extends java.util.EventListener {
*/ */
default void onWikiPageEvent(WikiPageEvent wikiEvent) { default void onWikiPageEvent(WikiPageEvent wikiEvent) {
} }
/**
* This method is called when a WebHook deployment event has been received.
*
* @param deploymentEvent the DeploymentEvent instance
*/
default void onDeploymentEvent(DeploymentEvent deploymentEvent) {
}
/**
* This method is called when a WebHook release event has been received.
*
* @param releaseEvent the ReleaseEvent instance
*/
default void onReleaseEvent(ReleaseEvent releaseEvent) {
}
} }
package org.gitlab4j.api.webhook; package org.gitlab4j.api.webhook;
import org.gitlab4j.api.GitLabApiException;
import org.gitlab4j.api.HookManager;
import org.gitlab4j.api.utils.HttpRequestUtils;
import org.gitlab4j.api.utils.JacksonJson;
import javax.servlet.http.HttpServletRequest;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.util.List; import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest;
import org.gitlab4j.api.GitLabApiException;
import org.gitlab4j.api.HookManager;
import org.gitlab4j.api.utils.HttpRequestUtils;
import org.gitlab4j.api.utils.JacksonJson;
/** /**
* This class provides a handler for processing GitLab WebHook callouts. * This class provides a handler for processing GitLab WebHook callouts.
*/ */
...@@ -36,7 +35,7 @@ public class WebHookManager implements HookManager { ...@@ -36,7 +35,7 @@ public class WebHookManager implements HookManager {
/** /**
* Create a HookManager to handle GitLab webhook events which will be verified * Create a HookManager to handle GitLab webhook events which will be verified
* against the specified secretToken. * against the specified secretToken.
* *
* @param secretToken the secret token to verify against * @param secretToken the secret token to verify against
*/ */
public WebHookManager(String secretToken) { public WebHookManager(String secretToken) {
...@@ -64,7 +63,7 @@ public class WebHookManager implements HookManager { ...@@ -64,7 +63,7 @@ public class WebHookManager implements HookManager {
/** /**
* Parses and verifies an Event instance from the HTTP request and * Parses and verifies an Event instance from the HTTP request and
* fires it off to the registered listeners. * fires it off to the registered listeners.
* *
* @param request the HttpServletRequest to read the Event instance from * @param request the HttpServletRequest to read the Event instance from
* @throws GitLabApiException if the parsed event is not supported * @throws GitLabApiException if the parsed event is not supported
*/ */
...@@ -98,20 +97,22 @@ public class WebHookManager implements HookManager { ...@@ -98,20 +97,22 @@ public class WebHookManager implements HookManager {
LOGGER.info("handleEvent: X-Gitlab-Event=" + eventName); LOGGER.info("handleEvent: X-Gitlab-Event=" + eventName);
switch (eventName) { switch (eventName) {
case IssueEvent.X_GITLAB_EVENT: case IssueEvent.X_GITLAB_EVENT:
case JobEvent.JOB_HOOK_X_GITLAB_EVENT: case JobEvent.JOB_HOOK_X_GITLAB_EVENT:
case MergeRequestEvent.X_GITLAB_EVENT: case MergeRequestEvent.X_GITLAB_EVENT:
case NoteEvent.X_GITLAB_EVENT: case NoteEvent.X_GITLAB_EVENT:
case PipelineEvent.X_GITLAB_EVENT: case PipelineEvent.X_GITLAB_EVENT:
case PushEvent.X_GITLAB_EVENT: case PushEvent.X_GITLAB_EVENT:
case TagPushEvent.X_GITLAB_EVENT: case TagPushEvent.X_GITLAB_EVENT:
case WikiPageEvent.X_GITLAB_EVENT: case WikiPageEvent.X_GITLAB_EVENT:
break; case DeploymentEvent.JOB_HOOK_X_GITLAB_EVENT:
case ReleaseEvent.JOB_HOOK_X_GITLAB_EVENT:
default: break;
String message = "Unsupported X-Gitlab-Event, event Name=" + eventName;
LOGGER.warning(message); default:
throw new GitLabApiException(message); String message = "Unsupported X-Gitlab-Event, event Name=" + eventName;
LOGGER.warning(message);
throw new GitLabApiException(message);
} }
Event event; Event event;
...@@ -154,7 +155,7 @@ public class WebHookManager implements HookManager { ...@@ -154,7 +155,7 @@ public class WebHookManager implements HookManager {
/** /**
* Verifies the provided Event and fires it off to the registered listeners. * Verifies the provided Event and fires it off to the registered listeners.
* *
* @param event the Event instance to handle * @param event the Event instance to handle
* @throws GitLabApiException if the event is not supported * @throws GitLabApiException if the event is not supported
*/ */
...@@ -163,22 +164,23 @@ public class WebHookManager implements HookManager { ...@@ -163,22 +164,23 @@ public class WebHookManager implements HookManager {
LOGGER.info("handleEvent: object_kind=" + event.getObjectKind()); LOGGER.info("handleEvent: object_kind=" + event.getObjectKind());
switch (event.getObjectKind()) { switch (event.getObjectKind()) {
case BuildEvent.OBJECT_KIND: case BuildEvent.OBJECT_KIND:
case IssueEvent.OBJECT_KIND: case IssueEvent.OBJECT_KIND:
case JobEvent.OBJECT_KIND: case JobEvent.OBJECT_KIND:
case MergeRequestEvent.OBJECT_KIND: case MergeRequestEvent.OBJECT_KIND:
case NoteEvent.OBJECT_KIND: case NoteEvent.OBJECT_KIND:
case PipelineEvent.OBJECT_KIND: case PipelineEvent.OBJECT_KIND:
case PushEvent.OBJECT_KIND: case PushEvent.OBJECT_KIND:
case TagPushEvent.OBJECT_KIND: case TagPushEvent.OBJECT_KIND:
case WikiPageEvent.OBJECT_KIND: case WikiPageEvent.OBJECT_KIND:
fireEvent(event); case DeploymentEvent.OBJECT_KIND:
break; fireEvent(event);
break;
default:
String message = "Unsupported event object_kind, object_kind=" + event.getObjectKind(); default:
LOGGER.warning(message); String message = "Unsupported event object_kind, object_kind=" + event.getObjectKind();
throw new GitLabApiException(message); LOGGER.warning(message);
throw new GitLabApiException(message);
} }
} }
...@@ -205,53 +207,61 @@ public class WebHookManager implements HookManager { ...@@ -205,53 +207,61 @@ public class WebHookManager implements HookManager {
/** /**
* Fire the event to the registered listeners. * Fire the event to the registered listeners.
* *
* @param event the Event instance to fire to the registered event listeners * @param event the Event instance to fire to the registered event listeners
* @throws GitLabApiException if the event is not supported * @throws GitLabApiException if the event is not supported
*/ */
public void fireEvent(Event event) throws GitLabApiException { public void fireEvent(Event event) throws GitLabApiException {
switch (event.getObjectKind()) { switch (event.getObjectKind()) {
case BuildEvent.OBJECT_KIND: case BuildEvent.OBJECT_KIND:
fireBuildEvent((BuildEvent) event); fireBuildEvent((BuildEvent) event);
break; break;
case IssueEvent.OBJECT_KIND: case IssueEvent.OBJECT_KIND:
fireIssueEvent((IssueEvent) event); fireIssueEvent((IssueEvent) event);
break; break;
case JobEvent.OBJECT_KIND: case JobEvent.OBJECT_KIND:
fireJobEvent((JobEvent) event); fireJobEvent((JobEvent) event);
break; break;
case MergeRequestEvent.OBJECT_KIND: case MergeRequestEvent.OBJECT_KIND:
fireMergeRequestEvent((MergeRequestEvent) event); fireMergeRequestEvent((MergeRequestEvent) event);
break; break;
case NoteEvent.OBJECT_KIND: case NoteEvent.OBJECT_KIND:
fireNoteEvent((NoteEvent) event); fireNoteEvent((NoteEvent) event);
break; break;
case PipelineEvent.OBJECT_KIND: case PipelineEvent.OBJECT_KIND:
firePipelineEvent((PipelineEvent) event); firePipelineEvent((PipelineEvent) event);
break; break;
case PushEvent.OBJECT_KIND: case PushEvent.OBJECT_KIND:
firePushEvent((PushEvent) event); firePushEvent((PushEvent) event);
break; break;
case TagPushEvent.OBJECT_KIND: case TagPushEvent.OBJECT_KIND:
fireTagPushEvent((TagPushEvent) event); fireTagPushEvent((TagPushEvent) event);
break; break;
case WikiPageEvent.OBJECT_KIND: case WikiPageEvent.OBJECT_KIND:
fireWikiPageEvent((WikiPageEvent) event); fireWikiPageEvent((WikiPageEvent) event);
break; break;
default: case DeploymentEvent.OBJECT_KIND:
String message = "Unsupported event object_kind, object_kind=" + event.getObjectKind(); fireDeploymentEvent((DeploymentEvent) event);
LOGGER.warning(message); break;
throw new GitLabApiException(message);
case ReleaseEvent.OBJECT_KIND:
fireReleaseEvent((ReleaseEvent) event);
break;
default:
String message = "Unsupported event object_kind, object_kind=" + event.getObjectKind();
LOGGER.warning(message);
throw new GitLabApiException(message);
} }
} }
...@@ -308,4 +318,16 @@ public class WebHookManager implements HookManager { ...@@ -308,4 +318,16 @@ public class WebHookManager implements HookManager {
listener.onWikiPageEvent(wikiPageEvent); listener.onWikiPageEvent(wikiPageEvent);
} }
} }
protected void fireDeploymentEvent(DeploymentEvent deploymentEvent) {
for (WebHookListener listener : webhookListeners) {
listener.onDeploymentEvent(deploymentEvent);
}
}
protected void fireReleaseEvent(ReleaseEvent releaseEvent) {
for (WebHookListener listener : webhookListeners) {
listener.onReleaseEvent(releaseEvent);
}
}
} }
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment