Unverified Commit a7991ddc authored by Gautier de Saint Martin Lacaze's avatar Gautier de Saint Martin Lacaze Committed by GitHub
Browse files

Merge pull request #765 from tubbynl/feature/webhook-releases-and-deployments

Webhook support for Release and Deployment events
parents de4e5aa2 e388f9ae
...@@ -2080,6 +2080,7 @@ public class ProjectApi extends AbstractApi implements Constants { ...@@ -2080,6 +2080,7 @@ public class ProjectApi extends AbstractApi implements Constants {
.withParam("repository_update_events", enabledHooks.getRepositoryUpdateEvents(), false) .withParam("repository_update_events", enabledHooks.getRepositoryUpdateEvents(), false)
.withParam("deployment_events", enabledHooks.getDeploymentEvents(), false) .withParam("deployment_events", enabledHooks.getDeploymentEvents(), false)
.withParam("releases_events", enabledHooks.getReleasesEvents(), 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));
...@@ -2151,14 +2152,20 @@ public class ProjectApi extends AbstractApi implements Constants { ...@@ -2151,14 +2152,20 @@ public class ProjectApi extends AbstractApi implements Constants {
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("push_events_branch_filter", hook.getPushEventsBranchFilter(), false)
.withParam("issues_events", hook.getIssuesEvents(), false) .withParam("issues_events", hook.getIssuesEvents(), false)
.withParam("confidential_issues_events", hook.getConfidentialIssuesEvents(), false)
.withParam("merge_requests_events", hook.getMergeRequestsEvents(), false) .withParam("merge_requests_events", hook.getMergeRequestsEvents(), false)
.withParam("tag_push_events", hook.getTagPushEvents(), false) .withParam("tag_push_events", hook.getTagPushEvents(), false)
.withParam("note_events", hook.getNoteEvents(), false) .withParam("note_events", hook.getNoteEvents(), false)
.withParam("confidential_note_events", hook.getConfidentialNoteEvents(), false)
.withParam("job_events", hook.getJobEvents(), false) .withParam("job_events", hook.getJobEvents(), false)
.withParam("pipeline_events", hook.getPipelineEvents(), false) .withParam("pipeline_events", hook.getPipelineEvents(), false)
.withParam("wiki_page_events", hook.getWikiPageEvents(), false) .withParam("wiki_page_events", hook.getWikiPageEvents(), false)
.withParam("enable_ssl_verification", hook.getEnableSslVerification(), 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.webhook;
import org.gitlab4j.api.models.User;
import org.gitlab4j.api.utils.JacksonJson;
public class DeploymentEvent extends AbstractEvent {
public static final String X_GITLAB_EVENT = "Deployment Hook";
public static final String OBJECT_KIND = "deployment";
private String status;
private String statusChangedAt;
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 getStatusChangedAt() {
return statusChangedAt;
}
public void setStatusChangedAt(String statusChangedAt) {
this.statusChangedAt = statusChangedAt;
}
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.utils.JacksonJson;
public class ReleaseEvent extends AbstractEvent {
public static final String X_GITLAB_EVENT = "Release Hook";
public static final String OBJECT_KIND = "release";
private Integer id;
private String createdAt;
private String description;
private String name;
private String releasedAt;
private String tag;
private EventProject project;
private String url;
private String action;
private EventReleaseAssets assets;
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 + "'");
}
public Integer getId() {
return id;
}
public void setId(final Integer id) {
this.id = id;
}
public String getCreatedAt() {
return createdAt;
}
public void setCreatedAt(final String createdAt) {
this.createdAt = createdAt;
}
public String getDescription() {
return description;
}
public void setDescription(final String description) {
this.description = description;
}
public String getName() {
return name;
}
public void setName(final String name) {
this.name = name;
}
public String getReleasedAt() {
return releasedAt;
}
public void setReleasedAt(final String releasedAt) {
this.releasedAt = releasedAt;
}
public String getTag() {
return tag;
}
public void setTag(final String tag) {
this.tag = tag;
}
public EventProject getProject() {
return project;
}
public void setProject(final EventProject project) {
this.project = project;
}
public String getUrl() {
return url;
}
public void setUrl(final String url) {
this.url = url;
}
public String getAction() {
return action;
}
public void setAction(final String action) {
this.action = action;
}
public EventReleaseAssets getAssets() {
return assets;
}
public void setAssets(final EventReleaseAssets assets) {
this.assets = assets;
}
public EventCommit getCommit() {
return commit;
}
public void setCommit(final EventCommit commit) {
this.commit = commit;
}
@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) {
}
} }
...@@ -36,7 +36,7 @@ public class WebHookManager implements HookManager { ...@@ -36,7 +36,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 +64,7 @@ public class WebHookManager implements HookManager { ...@@ -64,7 +64,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
*/ */
...@@ -106,6 +106,8 @@ public class WebHookManager implements HookManager { ...@@ -106,6 +106,8 @@ public class WebHookManager implements HookManager {
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:
case DeploymentEvent.X_GITLAB_EVENT:
case ReleaseEvent.X_GITLAB_EVENT:
break; break;
default: default:
...@@ -154,7 +156,7 @@ public class WebHookManager implements HookManager { ...@@ -154,7 +156,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
*/ */
...@@ -172,6 +174,8 @@ public class WebHookManager implements HookManager { ...@@ -172,6 +174,8 @@ public class WebHookManager implements HookManager {
case PushEvent.OBJECT_KIND: case PushEvent.OBJECT_KIND:
case TagPushEvent.OBJECT_KIND: case TagPushEvent.OBJECT_KIND:
case WikiPageEvent.OBJECT_KIND: case WikiPageEvent.OBJECT_KIND:
case ReleaseEvent.OBJECT_KIND:
case DeploymentEvent.OBJECT_KIND:
fireEvent(event); fireEvent(event);
break; break;
...@@ -205,7 +209,7 @@ public class WebHookManager implements HookManager { ...@@ -205,7 +209,7 @@ 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
*/ */
...@@ -248,6 +252,14 @@ public class WebHookManager implements HookManager { ...@@ -248,6 +252,14 @@ public class WebHookManager implements HookManager {
fireWikiPageEvent((WikiPageEvent) event); fireWikiPageEvent((WikiPageEvent) event);
break; break;
case ReleaseEvent.OBJECT_KIND:
fireReleaseEvent((ReleaseEvent) event);
break;
case DeploymentEvent.OBJECT_KIND:
fireDeploymentEvent((DeploymentEvent) event);
break;
default: default:
String message = "Unsupported event object_kind, object_kind=" + event.getObjectKind(); String message = "Unsupported event object_kind, object_kind=" + event.getObjectKind();
LOGGER.warning(message); LOGGER.warning(message);
...@@ -308,4 +320,16 @@ public class WebHookManager implements HookManager { ...@@ -308,4 +320,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