Skip to content

Commit

Permalink
fix(triggers): Include image as a received artifact for Docker (#219)
Browse files Browse the repository at this point in the history
  • Loading branch information
wjoel authored and lwander committed Jan 12, 2018
1 parent fb85c99 commit dfe3a4e
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ class DockerEvent extends TriggerEvent {
@JsonIgnoreProperties(ignoreUnknown = true)
static class Content {
String account
String registry
String repository
String tag
String digest
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import com.netflix.spinnaker.echo.model.trigger.DockerEvent;
import com.netflix.spinnaker.echo.model.trigger.TriggerEvent;
import com.netflix.spinnaker.echo.pipelinetriggers.PipelineCache;
import com.netflix.spinnaker.kork.artifacts.model.Artifact;
import lombok.NonNull;
import lombok.val;
import org.apache.commons.lang.StringUtils;
Expand All @@ -32,10 +33,14 @@
import rx.Observable;
import rx.functions.Action1;

import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.regex.PatternSyntaxException;

import static com.netflix.spinnaker.echo.pipelinetriggers.artifacts.ArtifactMatcher.anyArtifactsMatchExpected;

@Component
public class DockerEventMonitor extends TriggerMonitor {

Expand Down Expand Up @@ -74,10 +79,25 @@ protected boolean isSuccessfulTriggerEvent(final TriggerEvent event) {
return tag != null && !tag.isEmpty();
}

private static List<Artifact> getArtifacts(DockerEvent dockerEvent) {
DockerEvent.Content content = dockerEvent.getContent();

String name = content.getRegistry() + "/" + content.getRepository();
String reference = name + ":" + content.getTag();
return Collections.singletonList(Artifact.builder()
.type("docker/image")
.name(name)
.version(content.getTag())
.reference(reference)
.build());
}

@Override
protected Function<Trigger, Pipeline> buildTrigger(Pipeline pipeline, TriggerEvent event) {
DockerEvent dockerEvent = (DockerEvent) event;
return trigger -> pipeline.withTrigger(trigger.atTag(dockerEvent.getContent().getTag()));

return trigger -> pipeline.withTrigger(trigger.atTag(dockerEvent.getContent().getTag()))
.withReceivedArtifacts(getArtifacts(dockerEvent));
}

@Override
Expand All @@ -101,10 +121,10 @@ private boolean matchTags(String suppliedTag, String incomingTag) {

@Override
protected Predicate<Trigger> matchTriggerFor(final TriggerEvent event, final Pipeline pipeline) {
return trigger -> isMatchingTrigger((DockerEvent)event, trigger);
return trigger -> isMatchingTrigger((DockerEvent)event, trigger, pipeline);
}

private boolean isMatchingTrigger(DockerEvent dockerEvent, Trigger trigger) {
private boolean isMatchingTrigger(DockerEvent dockerEvent, Trigger trigger, final Pipeline pipeline) {
String account = dockerEvent.getContent().getAccount();
String repository = dockerEvent.getContent().getRepository();
String eventTag = dockerEvent.getContent().getTag();
Expand All @@ -116,7 +136,8 @@ private boolean isMatchingTrigger(DockerEvent dockerEvent, Trigger trigger) {
trigger.getRepository().equals(repository) &&
trigger.getAccount().equals(account) &&
((triggerTagPattern == null && !eventTag.equals("latest"))
|| triggerTagPattern != null && matchTags(triggerTagPattern, eventTag));
|| triggerTagPattern != null && matchTags(triggerTagPattern, eventTag)) &&
anyArtifactsMatchExpected(getArtifacts(dockerEvent), trigger, pipeline);
}

protected void onMatchingPipeline(Pipeline pipeline) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import com.netflix.spinnaker.echo.model.Event
import com.netflix.spinnaker.echo.model.Pipeline
import com.netflix.spinnaker.echo.pipelinetriggers.monitor.DockerEventMonitor
import com.netflix.spinnaker.echo.test.RetrofitStubs
import com.netflix.spinnaker.kork.artifacts.model.Artifact
import rx.functions.Action1
import spock.lang.Specification
import spock.lang.Subject
Expand Down Expand Up @@ -74,10 +75,18 @@ class DockerEventMonitorSpec extends Specification implements RetrofitStubs {
it.trigger.account == enabledDockerTrigger.account
it.trigger.repository == enabledDockerTrigger.repository
it.trigger.tag == enabledDockerTrigger.tag
it.receivedArtifacts.size() == 1
it.receivedArtifacts.get(0) == artifact
})

where:
event = createDockerEvent()
artifact = Artifact.builder()
.type("docker/image")
.name(event.content.registry + "/" + event.content.repository)
.version(event.content.tag)
.reference(event.content.registry + "/" + event.content.repository + ":" + event.content.tag)
.build()
pipeline = createPipelineWith(enabledJenkinsTrigger, nonJenkinsTrigger, enabledDockerTrigger, disabledDockerTrigger)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ trait RetrofitStubs {

final Trigger enabledGithubTrigger = Trigger.builder().enabled(true).type('git').source('github').project('project').slug('slug').build()

final Trigger enabledDockerTrigger = Trigger.builder().enabled(true).type('docker').account('registry').repository('repository').tag('tag').build()
final Trigger disabledDockerTrigger = Trigger.builder().enabled(false).type('docker').account('registry').repository('repository').tag('tag').build()
final Trigger enabledDockerTrigger = Trigger.builder().enabled(true).type('docker').account('account').repository('repository').tag('tag').build()
final Trigger disabledDockerTrigger = Trigger.builder().enabled(false).type('docker').account('account').repository('repository').tag('tag').build()
final Trigger enabledWebhookTrigger = Trigger.builder().enabled(true).type('webhook').build()
final Trigger disabledWebhookTrigger = Trigger.builder().enabled(true).type('webhook').build()
final Trigger nonWebhookTrigger = Trigger.builder().enabled(true).type('not webhook').build()
Expand Down Expand Up @@ -75,7 +75,7 @@ trait RetrofitStubs {
tag = inTag
}
def res = new DockerEvent()
res.content = new DockerEvent.Content("registry", "repository", tag, "sha")
res.content = new DockerEvent.Content("account", "registry", "repository", tag, "sha")
res.details = new Metadata([type: DockerEvent.TYPE, source: "spock"])
return res
}
Expand Down

0 comments on commit dfe3a4e

Please sign in to comment.