Skip to content

Commit

Permalink
[JENKINS-48596] Example of selecting events from UI
Browse files Browse the repository at this point in the history
  • Loading branch information
rsandell committed Dec 20, 2017
1 parent 1f197d0 commit b124e90
Show file tree
Hide file tree
Showing 11 changed files with 294 additions and 2 deletions.
Expand Up @@ -38,6 +38,7 @@
import jenkins.model.Jenkins;
import jenkins.model.ParameterizedJobMixIn;
import net.sf.json.JSONObject;
import org.jenkinsci.plugins.registry.notification.events.EventType;
import org.jenkinsci.plugins.registry.notification.opt.TriggerOption;
import org.jenkinsci.plugins.registry.notification.opt.TriggerOptionDescriptor;
import org.jenkinsci.plugins.registry.notification.opt.impl.TriggerForAllUsedInJob;
Expand Down Expand Up @@ -69,6 +70,7 @@
public class DockerHubTrigger extends Trigger<Job<?, ?>> {

private List<TriggerOption> options;
private List<EventType> eventTypes;

@DataBoundConstructor
public DockerHubTrigger(List<TriggerOption> options) {
Expand Down Expand Up @@ -99,6 +101,19 @@ public void setOptions(List<TriggerOption> options) {
this.options = options;
}

public List<EventType> getEventTypes() {
return Collections.unmodifiableList(eventTypes);
}

@DataBoundSetter
public void setEventTypes(List<EventType> eventTypes) {
if (eventTypes != null) {
this.eventTypes = new Vector<EventType>(eventTypes);
} else {
this.eventTypes = new Vector<EventType>();
}
}

@Nonnull
public Set<String> getAllRepoNames() {
Set<String> all = new HashSet<String>();
Expand Down Expand Up @@ -138,6 +153,7 @@ public String getDisplayName() {

@Override
public Trigger<?> newInstance(StaplerRequest req, JSONObject formData) throws FormException {
//TODO can't remember why we are doing it this convoluted way but it looks intentional
JSONObject data = formData.getJSONObject("options");
List<TriggerOption> r = new Vector<TriggerOption>();
for (TriggerOptionDescriptor d : TriggerOptionDescriptor.all()) {
Expand All @@ -147,7 +163,9 @@ public Trigger<?> newInstance(StaplerRequest req, JSONObject formData) throws Fo
r.add(instance);
}
}
return new DockerHubTrigger(r);
final DockerHubTrigger dockerHubTrigger = new DockerHubTrigger(r);
dockerHubTrigger.setEventTypes(req.bindJSONToList(EventType.class, formData.opt("eventTypes")));
return dockerHubTrigger;
}
}

Expand Down
Expand Up @@ -27,15 +27,21 @@
import hudson.EnvVars;
import hudson.Extension;
import hudson.model.EnvironmentContributor;
import hudson.model.Job;
import hudson.model.ParameterValue;
import hudson.model.Run;
import hudson.model.TaskListener;
import hudson.triggers.Trigger;
import jenkins.model.ParameterizedJobMixIn;
import org.jenkinsci.plugins.registry.notification.events.EventType;
import org.jenkinsci.plugins.registry.notification.webhook.WebHookCause;
import org.jenkinsci.plugins.registry.notification.webhook.WebHookPayload;
import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse;

import javax.annotation.Nonnull;
import java.io.IOException;
import java.util.List;
import java.util.Set;

/**
Expand All @@ -55,6 +61,22 @@ public void buildEnvironmentFor(@Nonnull Run r, @Nonnull EnvVars envs, @Nonnull
for (ParameterValue parameter : parameters) {
parameter.buildEnvironment(r, envs);
}
final Job parent = r.getParent();
if (parent instanceof ParameterizedJobMixIn.ParameterizedJob) {
final DockerHubTrigger trigger = (DockerHubTrigger) ((ParameterizedJobMixIn.ParameterizedJob) parent).getTriggers().get(DockerHubTrigger.DescriptorImpl.class);
if (trigger != null) {
final List<EventType> eventTypes = trigger.getEventTypes();
if (eventTypes != null) {
final WebHookPayload payload = cause.getPushNotification().getWebHookPayload();
for (EventType type : eventTypes) {
if (type.accepts(payload)) {
type.buildEnvironment(r, envs);
}
}
}
}
}

}
}
}
@@ -0,0 +1,17 @@
package org.jenkinsci.plugins.registry.notification.events;

import hudson.EnvVars;
import hudson.model.AbstractDescribableImpl;
import hudson.model.Run;
import org.jenkinsci.plugins.registry.notification.webhook.WebHookPayload;

import javax.annotation.Nonnull;

public abstract class EventType extends AbstractDescribableImpl<EventType> {

public abstract boolean accepts(WebHookPayload payload);

public void buildEnvironment(@Nonnull Run r, @Nonnull EnvVars envs) {
//No-Op
}
}
@@ -0,0 +1,22 @@
package org.jenkinsci.plugins.registry.notification.events;

import hudson.ExtensionList;
import hudson.model.Descriptor;
import org.jenkinsci.plugins.registry.notification.webhook.WebHookPayload;

public abstract class EventTypeDescriptor extends Descriptor<EventType> {

public static final String ENVIRONMENT_KEY = WebHookPayload.PREFIX + "EVENT";

public EventTypeDescriptor(Class<? extends EventType> clazz) {
super(clazz);
}

public EventTypeDescriptor() {
}


public static ExtensionList<EventTypeDescriptor> all() {
return ExtensionList.lookup(EventTypeDescriptor.class);
}
}
@@ -0,0 +1,40 @@
package org.jenkinsci.plugins.registry.notification.events.impl;

import hudson.EnvVars;
import hudson.Extension;
import hudson.model.Run;
import org.jenkinsci.plugins.registry.notification.Messages;
import org.jenkinsci.plugins.registry.notification.events.EventType;
import org.jenkinsci.plugins.registry.notification.events.EventTypeDescriptor;
import org.jenkinsci.plugins.registry.notification.webhook.WebHookPayload;
import org.kohsuke.stapler.DataBoundConstructor;

import javax.annotation.Nonnull;

public class ManifestDeleted extends EventType {

@DataBoundConstructor
public ManifestDeleted() {
}

@Override
public boolean accepts(WebHookPayload payload) {
return false; //TODO
}

@Override
public void buildEnvironment(@Nonnull Run r, @Nonnull EnvVars envs) {
envs.put(EventTypeDescriptor.ENVIRONMENT_KEY, "MANIFEST_DELETED"); //TODO perhaps something more appropriate?
}

@Extension
public static class DescriptorImpl extends EventTypeDescriptor {
public DescriptorImpl() {
}

@Override
public String getDisplayName() {
return Messages.EventType_ManifestDeleted_DisplayName();
}
}
}
@@ -0,0 +1,40 @@
package org.jenkinsci.plugins.registry.notification.events.impl;

import hudson.EnvVars;
import hudson.Extension;
import hudson.model.Run;
import org.jenkinsci.plugins.registry.notification.Messages;
import org.jenkinsci.plugins.registry.notification.events.EventType;
import org.jenkinsci.plugins.registry.notification.events.EventTypeDescriptor;
import org.jenkinsci.plugins.registry.notification.webhook.WebHookPayload;
import org.kohsuke.stapler.DataBoundConstructor;

import javax.annotation.Nonnull;

public class ManifestPushed extends EventType {

@DataBoundConstructor
public ManifestPushed() {
}

@Override
public boolean accepts(WebHookPayload payload) {
return false; //TODO
}

@Override
public void buildEnvironment(@Nonnull Run r, @Nonnull EnvVars envs) {
envs.put(EventTypeDescriptor.ENVIRONMENT_KEY, "MANIFEST_PUSHED"); //TODO perhaps something more appropriate?
}

@Extension
public static class DescriptorImpl extends EventTypeDescriptor {
public DescriptorImpl() {
}

@Override
public String getDisplayName() {
return Messages.EventType_ManifestPushed_DisplayName();
}
}
}
@@ -0,0 +1,40 @@
package org.jenkinsci.plugins.registry.notification.events.impl;

import hudson.EnvVars;
import hudson.Extension;
import hudson.model.Run;
import org.jenkinsci.plugins.registry.notification.Messages;
import org.jenkinsci.plugins.registry.notification.events.EventType;
import org.jenkinsci.plugins.registry.notification.events.EventTypeDescriptor;
import org.jenkinsci.plugins.registry.notification.webhook.WebHookPayload;
import org.kohsuke.stapler.DataBoundConstructor;

import javax.annotation.Nonnull;

public class SecurityScanCompleted extends EventType {

@DataBoundConstructor
public SecurityScanCompleted() {
}

@Override
public boolean accepts(WebHookPayload payload) {
return false; //TODO
}

@Override
public void buildEnvironment(@Nonnull Run r, @Nonnull EnvVars envs) {
envs.put(EventTypeDescriptor.ENVIRONMENT_KEY, "Security_Scan_Completed"); //TODO perhaps something more appropriate?
}

@Extension
public static class DescriptorImpl extends EventTypeDescriptor {
public DescriptorImpl() {
}

@Override
public String getDisplayName() {
return Messages.EventType_SecurityScanCompleted_DisplayName();
}
}
}
@@ -0,0 +1,40 @@
package org.jenkinsci.plugins.registry.notification.events.impl;

import hudson.EnvVars;
import hudson.Extension;
import hudson.model.Run;
import org.jenkinsci.plugins.registry.notification.Messages;
import org.jenkinsci.plugins.registry.notification.events.EventType;
import org.jenkinsci.plugins.registry.notification.events.EventTypeDescriptor;
import org.jenkinsci.plugins.registry.notification.webhook.WebHookPayload;
import org.kohsuke.stapler.DataBoundConstructor;

import javax.annotation.Nonnull;

public class TagDeleted extends EventType {

@DataBoundConstructor
public TagDeleted() {
}

@Override
public boolean accepts(WebHookPayload payload) {
return false; //TODO
}

@Override
public void buildEnvironment(@Nonnull Run r, @Nonnull EnvVars envs) {
envs.put(EventTypeDescriptor.ENVIRONMENT_KEY, "TAG_DELETED"); //TODO perhaps something more appropriate?
}

@Extension
public static class DescriptorImpl extends EventTypeDescriptor {
public DescriptorImpl() {
}

@Override
public String getDisplayName() {
return Messages.EventType_TagDeleted_DisplayName();
}
}
}
@@ -0,0 +1,40 @@
package org.jenkinsci.plugins.registry.notification.events.impl;

import hudson.EnvVars;
import hudson.Extension;
import hudson.model.Run;
import org.jenkinsci.plugins.registry.notification.Messages;
import org.jenkinsci.plugins.registry.notification.events.EventType;
import org.jenkinsci.plugins.registry.notification.events.EventTypeDescriptor;
import org.jenkinsci.plugins.registry.notification.webhook.WebHookPayload;
import org.kohsuke.stapler.DataBoundConstructor;

import javax.annotation.Nonnull;

public class TagPushed extends EventType {

@DataBoundConstructor
public TagPushed() {
}

@Override
public boolean accepts(WebHookPayload payload) {
return false; //TODO
}

@Override
public void buildEnvironment(@Nonnull Run r, @Nonnull EnvVars envs) {
envs.put(EventTypeDescriptor.ENVIRONMENT_KEY, "TAG_PUSHED"); //TODO perhaps something more appropriate?
}

@Extension
public static class DescriptorImpl extends EventTypeDescriptor {
public DescriptorImpl() {
}

@Override
public String getDisplayName() {
return Messages.EventType_TagPushed_DisplayName();
}
}
}
Expand Up @@ -24,6 +24,7 @@
package org.jenkinsci.plugins.registry.notification.DockerHubTrigger

import org.jenkinsci.plugins.registry.notification.DockerHubTrigger
import org.jenkinsci.plugins.registry.notification.events.EventTypeDescriptor
import org.jenkinsci.plugins.registry.notification.opt.TriggerOptionDescriptor
import org.jenkinsci.plugins.registry.notification.opt.impl.TriggerForAllUsedInJob

Expand All @@ -41,3 +42,9 @@ l.descriptorList(title: null,
descriptors: TriggerOptionDescriptor.all(),
instances: trigger != null ? trigger.optionsList : defaultOption)

f.advanced {
f.entry(title: _('Events'), description: 'If using DTR; what type of events to trigger on (default: Tag Pushed)') {
f.'hetero-list'(name: 'eventTypes',descriptors: EventTypeDescriptor.all(), items: trigger?.eventTypes, hasHeader: true)
}
}

Expand Up @@ -31,4 +31,10 @@ TriggerListViewColumn_DisplayName=Docker Hub image names being triggered on
TriggerListViewColumn.ColumnCaption=DHT

TriggerOption.TriggerForAllUsedInJob.DisplayName=Any referenced Docker image can trigger this job
TriggerOption.TriggerOnSpecifiedImageNames.DisplayName=Specified repositories will trigger this job
TriggerOption.TriggerOnSpecifiedImageNames.DisplayName=Specified repositories will trigger this job

EventType.TagPushed.DisplayName=Tag Pushed
EventType.TagDeleted.DisplayName=Tag Deleted
EventType.ManifestDeleted.DisplayName=Manifest Deleted
EventType.ManifestPushed.DisplayName=Manifest Pushed
EventType.SecurityScanCompleted.DisplayName=Security Scan Completed

0 comments on commit b124e90

Please sign in to comment.