diff --git a/echo-pipelinetriggers/src/main/java/com/netflix/spinnaker/echo/pipelinetriggers/monitor/DockerEventMonitor.java b/echo-pipelinetriggers/src/main/java/com/netflix/spinnaker/echo/pipelinetriggers/monitor/DockerEventMonitor.java index 70daa4a75..087b98bb2 100644 --- a/echo-pipelinetriggers/src/main/java/com/netflix/spinnaker/echo/pipelinetriggers/monitor/DockerEventMonitor.java +++ b/echo-pipelinetriggers/src/main/java/com/netflix/spinnaker/echo/pipelinetriggers/monitor/DockerEventMonitor.java @@ -33,6 +33,7 @@ import java.util.function.Function; import java.util.function.Predicate; +import java.util.regex.PatternSyntaxException; @Component public class DockerEventMonitor extends TriggerMonitor { @@ -88,6 +89,15 @@ protected boolean isValidTrigger(final Trigger trigger) { ); } + private boolean matchTags(String suppliedTag, String incomingTag) { + try { + // use matches to handle regex or basic string compare + return incomingTag.matches(suppliedTag); + } catch (PatternSyntaxException e) { + return false; + } + } + @Override protected Predicate matchTriggerFor(final TriggerEvent event) { DockerEvent dockerEvent = (DockerEvent) event; @@ -98,7 +108,7 @@ protected Predicate matchTriggerFor(final TriggerEvent event) { trigger.getRepository().equals(repository) && trigger.getRegistry().equals(registry) && ((trigger.getTag() == null && !tag.equals("latest")) - || trigger.getTag() != null && trigger.getTag().equals(tag)); + || trigger.getTag() != null && matchTags(trigger.getTag(), tag)); } protected void onMatchingPipeline(Pipeline pipeline) { diff --git a/echo-pipelinetriggers/src/test/groovy/com/netflix/spinnaker/echo/pipelinetriggers/DockerEventMonitorSpec.groovy b/echo-pipelinetriggers/src/test/groovy/com/netflix/spinnaker/echo/pipelinetriggers/DockerEventMonitorSpec.groovy index bac381105..213d488ef 100644 --- a/echo-pipelinetriggers/src/test/groovy/com/netflix/spinnaker/echo/pipelinetriggers/DockerEventMonitorSpec.groovy +++ b/echo-pipelinetriggers/src/test/groovy/com/netflix/spinnaker/echo/pipelinetriggers/DockerEventMonitorSpec.groovy @@ -166,4 +166,42 @@ class DockerEventMonitorSpec extends Specification implements RetrofitStubs { goodPipeline = createPipelineWith(enabledDockerTrigger) badPipeline = createPipelineWith(trigger) } + + @Unroll + def "triggers a pipeline that has an enabled docker trigger with regex"() { + given: + def pipeline = createPipelineWith(trigger) + pipelineCache.getPipelines() >> [pipeline] + + when: + monitor.processEvent(objectMapper.convertValue(event, Event)) + + then: + 1 * subscriber.call({ it.id == pipeline.id }) + + where: + trigger | field + enabledDockerTrigger.withTag("\\d+") | "regex tag" + + event = createDockerEvent("2") + } + + @Unroll + def "does not trigger a pipeline that has an enabled docker trigger with regex"() { + given: + def pipeline = createPipelineWith(trigger) + pipelineCache.getPipelines() >> [pipeline] + + when: + monitor.processEvent(objectMapper.convertValue(event, Event)) + + then: + 0 * subscriber._ + + where: + trigger | field + enabledDockerTrigger.withTag("\\d+") | "regex tag" + + event = createDockerEvent() + } } diff --git a/echo-pipelinetriggers/src/test/groovy/com/netflix/spinnaker/echo/test/RetrofitStubs.groovy b/echo-pipelinetriggers/src/test/groovy/com/netflix/spinnaker/echo/test/RetrofitStubs.groovy index c2d186e25..1504314b6 100644 --- a/echo-pipelinetriggers/src/test/groovy/com/netflix/spinnaker/echo/test/RetrofitStubs.groovy +++ b/echo-pipelinetriggers/src/test/groovy/com/netflix/spinnaker/echo/test/RetrofitStubs.groovy @@ -56,9 +56,13 @@ trait RetrofitStubs { return res } - DockerEvent createDockerEvent() { + DockerEvent createDockerEvent(String inTag) { + def tag = "tag" + if (inTag) { + tag = inTag + } def res = new DockerEvent() - res.content = new DockerEvent.Content("registry", "repository", "tag", "sha") + res.content = new DockerEvent.Content("registry", "repository", tag, "sha") res.details = new Metadata([type: DockerEvent.TYPE, source: "spock"]) return res }