diff --git a/src/main/groovy/com/lesfurets/jenkins/unit/declarative/AllOfDeclaration.groovy b/src/main/groovy/com/lesfurets/jenkins/unit/declarative/AllOfDeclaration.groovy index e6c16e6a..5a779db9 100644 --- a/src/main/groovy/com/lesfurets/jenkins/unit/declarative/AllOfDeclaration.groovy +++ b/src/main/groovy/com/lesfurets/jenkins/unit/declarative/AllOfDeclaration.groovy @@ -1,18 +1,41 @@ package com.lesfurets.jenkins.unit.declarative -import org.springframework.util.AntPathMatcher - import static groovy.lang.Closure.DELEGATE_FIRST class AllOfDeclaration extends WhenDeclaration { - List branches = [] + List> tags = [] + List> branches = [] List changeRequests = [] List expressions = [] List anyOfs = [] - def branch(String name) { - this.branches.add(name) + def tag(String pattern) { + tags.add(new Tuple2(pattern, ComparatorEnum.GLOB)) + } + + def tag(Map args) { + if (args.comparator) { + ComparatorEnum comparator = ComparatorEnum.getComparator(args.comparator as String) + this.tags.add(new Tuple2(args.pattern as String, comparator)) + } + else { + tag(args.pattern) + } + } + + def branch(String pattern) { + branches.add(new Tuple2(pattern, ComparatorEnum.GLOB)) + } + + def branch(Map args) { + if (args.comparator) { + ComparatorEnum comparator = ComparatorEnum.getComparator(args.comparator as String) + this.branches.add(new Tuple2(args.pattern as String, comparator)) + } + else { + branch(args.pattern) + } } def changeRequest(Object val) { @@ -38,28 +61,33 @@ class AllOfDeclaration extends WhenDeclaration { Boolean execute(Object delegate) { def results = [] - AntPathMatcher antPathMatcher = new AntPathMatcher() + if (tags) { + tags.each { tag -> + results.add(compareStringToPattern(delegate.env.TAG_NAME, tag)) + } + } - if (this.branches.size() > 0) { + if (branches) { branches.each { branch -> - results.add(antPathMatcher.match(branch, delegate.env.BRANCH_NAME)) + results.add(compareStringToPattern(delegate.env.BRANCH_NAME, branch)) } } - if (this.changeRequests.size() > 0) { + if (changeRequests) { changeRequests.each { changeRequest -> results.add(changeRequest.execute(delegate)) } } - if (this.expressions.size() > 0) { + if (expressions) { results.add(expressions(delegate)) } - if (this.anyOfs.size() > 0) { + if (anyOfs) { results.addAll(anyOf(delegate)) } return results.every() } + } diff --git a/src/main/groovy/com/lesfurets/jenkins/unit/declarative/AnyOfDeclaration.groovy b/src/main/groovy/com/lesfurets/jenkins/unit/declarative/AnyOfDeclaration.groovy index 7bd387ef..5d517146 100644 --- a/src/main/groovy/com/lesfurets/jenkins/unit/declarative/AnyOfDeclaration.groovy +++ b/src/main/groovy/com/lesfurets/jenkins/unit/declarative/AnyOfDeclaration.groovy @@ -1,25 +1,43 @@ package com.lesfurets.jenkins.unit.declarative import static com.lesfurets.jenkins.unit.declarative.GenericPipelineDeclaration.executeWith -import org.springframework.util.AntPathMatcher import static groovy.lang.Closure.DELEGATE_FIRST - class AnyOfDeclaration extends WhenDeclaration { - List tags = [] - List branches = [] + List> tags = [] + List> branches = [] List changeRequests = [] List expressions = [] List allOfs = [] - def tag(String name) { - this.tags.add(name) + def tag(String pattern) { + this.tags.add(new Tuple2(pattern, ComparatorEnum.GLOB)) + } + + def tag(Map args) { + if (args.comparator) { + ComparatorEnum comparator = ComparatorEnum.getComparator(args.comparator as String) + this.tags.add(new Tuple2(args.pattern as String, comparator)) + } + else { + tag(args.pattern) + } } - def branch(String name) { - this.branches.add(name) + def branch(String pattern) { + this.branches.add(new Tuple2(pattern, ComparatorEnum.GLOB)) + } + + def branch(Map args) { + if (args.comparator) { + ComparatorEnum comparator = ComparatorEnum.getComparator(args.comparator as String) + this.branches.add(new Tuple2(args.pattern as String, comparator)) + } + else { + branch(args.pattern) + } } def changeRequest(Object val) { @@ -45,34 +63,33 @@ class AnyOfDeclaration extends WhenDeclaration { Boolean execute(Object delegate) { def results = [] - AntPathMatcher antPathMatcher = new AntPathMatcher() - - if (this.tags.size() > 0) { + if (tags) { tags.each { tag -> - results.add(antPathMatcher.match(tag, delegate.env.TAG_NAME)) + results.add(compareStringToPattern(delegate.env.TAG_NAME, tag)) } } - if (this.branches.size() > 0) { + if (branches) { branches.each { branch -> - results.add(antPathMatcher.match(branch, delegate.env.BRANCH_NAME)) + results.add(compareStringToPattern(delegate.env.BRANCH_NAME, branch)) } } - if (this.changeRequests.size() > 0) { + if (changeRequests) { changeRequests.each { changeRequest -> results.add(changeRequest.execute(delegate)) } } - if (this.expressions.size() > 0) { + if (expressions) { results.add(expressions(delegate)) } - if (this.allOfs.size() > 0) { + if (allOfs) { results.addAll(allOf(delegate)) } return results.any() } + } diff --git a/src/main/groovy/com/lesfurets/jenkins/unit/declarative/ChangeRequestDeclaration.groovy b/src/main/groovy/com/lesfurets/jenkins/unit/declarative/ChangeRequestDeclaration.groovy index 37d95f98..d22d4808 100644 --- a/src/main/groovy/com/lesfurets/jenkins/unit/declarative/ChangeRequestDeclaration.groovy +++ b/src/main/groovy/com/lesfurets/jenkins/unit/declarative/ChangeRequestDeclaration.groovy @@ -5,95 +5,84 @@ import java.util.regex.Pattern class ChangeRequestDeclaration extends WhenDeclaration { boolean all - String id - String target - String branch - String fork - String url - String title - String author - String authorDisplayName - String authorEmail - String comparator + Tuple2 id + Tuple2 target + Tuple2 branch + Tuple2 fork + Tuple2 url + Tuple2 title + Tuple2 author + Tuple2 authorDisplayName + Tuple2 authorEmail def ChangeRequestDeclaration (Map val) { if (val) { - this.all = false - this.id = val.id - this.target = val.target - this.branch = val.branch - this.fork = val.fork - this.title = val.title - this.url = val.url - this.author = val.author - this.authorDisplayName = val.authorDisplayName - this.authorEmail = val.authorEmail - this.comparator = val.comparator - } - else { - this.all = true - } - } + all = false - Boolean compare(String expected, String actual) { - Boolean result - if (!this.comparator || this.comparator == "EQUALS") { - result = actual == expected - } - else if (this.comparator == "GLOB") { - Pattern expectedPattern = getPatternFromGlob(expected) - result = actual ==~ expectedPattern.pattern() - } - else if (this.comparator == "REGEXP") { - result = actual ==~ expected + ComparatorEnum comparator = null + if (val.comparator == null) { + comparator = ComparatorEnum.EQUALS + } + else { + comparator = ComparatorEnum.getComparator(val.comparator) + } + + id = val.id ? new Tuple2(val.id, comparator) : null + target = val.target ? new Tuple2(val.target, comparator) : null + branch = val.branch ? new Tuple2(val.branch, comparator) : null + fork = val.fork ? new Tuple2(val.fork, comparator) : null + title = val.title ? new Tuple2(val.title, comparator) : null + url = val.url ? new Tuple2(val.url, comparator) : null + author = val.author ? new Tuple2(val.author, comparator) : null + authorDisplayName = val.authorDisplayName ? new Tuple2(val.authorDisplayName, comparator) : null + authorEmail = val.authorEmail ? new Tuple2(val.authorEmail, comparator) : null } else { - throw new IllegalArgumentException("Invalid comparator for changeRequest '${this.comparator}'") + all = true } - return result } Boolean execute(Object delegate) { def results = [] - if (this.all) { - results.add(delegate?.env?.containsKey("CHANGE_ID")) + if (all) { + results.add(delegate?.env?.containsKey('CHANGE_ID')) } else { - if (this.id) { - results.add(compare(this.id, delegate.env.CHANGE_ID)) + if (id) { + results.add(compareStringToPattern(delegate.env.CHANGE_ID, id)) } - if (this.target) { - results.add(compare(this.target, delegate.env.CHANGE_TARGET)) + if (target) { + results.add(compareStringToPattern(delegate.env.CHANGE_TARGET, target)) } - if (this.branch) { - results.add(compare(this.branch, delegate.env.CHANGE_BRANCH)) + if (branch) { + results.add(compareStringToPattern(delegate.env.CHANGE_BRANCH, branch)) } - if (this.fork) { - results.add(compare(this.fork, delegate.env.CHANGE_FORK)) + if (fork) { + results.add(compareStringToPattern(delegate.env.CHANGE_FORK, fork)) } - if (this.url) { - results.add(compare(this.url, delegate.env.CHANGE_URL)) + if (url) { + results.add(compareStringToPattern(delegate.env.CHANGE_URL, url)) } - if (this.title) { - results.add(compare(this.title, delegate.env.CHANGE_TITLE)) + if (title) { + results.add(compareStringToPattern(delegate.env.CHANGE_TITLE, title)) } - if (this.author) { - results.add(compare(this.author, delegate.env.CHANGE_AUTHOR)) + if (author) { + results.add(compareStringToPattern(delegate.env.CHANGE_AUTHOR, author)) } - if (this.authorDisplayName) { - results.add(compare(this.authorDisplayName, delegate.env.CHANGE_AUTHOR_DISPLAY_NAME)) + if (authorDisplayName) { + results.add(compareStringToPattern(delegate.env.CHANGE_AUTHOR_DISPLAY_NAME, authorDisplayName)) } - if (this.authorEmail) { - results.add(compare(this.authorEmail, delegate.env.CHANGE_AUTHOR_EMAIL)) + if (authorEmail) { + results.add(compareStringToPattern(delegate.env.CHANGE_AUTHOR_EMAIL, authorEmail)) } } diff --git a/src/main/groovy/com/lesfurets/jenkins/unit/declarative/ComparatorEnum.groovy b/src/main/groovy/com/lesfurets/jenkins/unit/declarative/ComparatorEnum.groovy new file mode 100644 index 00000000..8735182c --- /dev/null +++ b/src/main/groovy/com/lesfurets/jenkins/unit/declarative/ComparatorEnum.groovy @@ -0,0 +1,33 @@ +package com.lesfurets.jenkins.unit.declarative + +enum ComparatorEnum { + + EQUALS ('EQUALS'), + GLOB ('GLOB'), + REGEXP ('REGEXP') + + private static Map map + + static { + map = [:] + values().each { comparator -> + map.put(comparator.name, comparator) + } + } + + static ComparatorEnum getComparator(String name) { + return map.get(name) + } + + private final String name + + private ComparatorEnum(String name) { + this.name = name + } + + @Override + String toString() { + return this.name + } + +} \ No newline at end of file diff --git a/src/main/groovy/com/lesfurets/jenkins/unit/declarative/WhenDeclaration.groovy b/src/main/groovy/com/lesfurets/jenkins/unit/declarative/WhenDeclaration.groovy index f926bb6e..a4343fda 100644 --- a/src/main/groovy/com/lesfurets/jenkins/unit/declarative/WhenDeclaration.groovy +++ b/src/main/groovy/com/lesfurets/jenkins/unit/declarative/WhenDeclaration.groovy @@ -1,29 +1,27 @@ package com.lesfurets.jenkins.unit.declarative -import org.springframework.util.AntPathMatcher - import java.util.regex.Pattern import static groovy.lang.Closure.DELEGATE_FIRST class WhenDeclaration extends GenericPipelineDeclaration { + protected static Pattern getPatternFromGlob(String glob) { + // from https://stackoverflow.com/a/3619098 + return Pattern.compile('^' + Pattern.quote(glob).replace('*', '\\E.*\\Q').replace('?', '\\E.\\Q') + '$') + } + AllOfDeclaration allOf AnyOfDeclaration anyOf NotDeclaration not Boolean buildingTag - String branch + Tuple2 branch ChangeRequestDeclaration changeRequest - String tag + Tuple2 tag Closure expression String envName String envValue - protected static Pattern getPatternFromGlob(String glob) { - // from https://stackoverflow.com/a/3619098 - return Pattern.compile('^' + Pattern.quote(glob).replace('*', '\\E.*\\Q').replace('?', '\\E.\\Q') + '$') - } - def allOf(@DelegatesTo(strategy = DELEGATE_FIRST, value = AllOfDeclaration) Closure closure) { this.allOf = createComponent(AllOfDeclaration, closure) } @@ -36,16 +34,36 @@ class WhenDeclaration extends GenericPipelineDeclaration { this.not = createComponent(NotDeclaration, closure) } - def branch (String name) { - this.branch = name + def branch(String pattern) { + branch = new Tuple2(pattern, ComparatorEnum.GLOB) + } + + def branch(Map args) { + if (args.comparator) { + ComparatorEnum comparator = ComparatorEnum.getComparator(args.comparator as String) + branch = new Tuple2(args.pattern as String, comparator) + } + else { + branch(args.pattern) + } } def changeRequest(Object o) { this.changeRequest = new ChangeRequestDeclaration(o) } - def tag (String name) { - this.tag = getPatternFromGlob(name) + def tag(String pattern) { + tag = new Tuple2(pattern, ComparatorEnum.GLOB) + } + + def tag(Map args) { + if (args.comparator) { + ComparatorEnum comparator = ComparatorEnum.getComparator(args.comparator as String) + tag = new Tuple2(args.pattern as String, comparator) + } + else { + tag(args.pattern) + } } def buildingTag () { @@ -84,8 +102,7 @@ class WhenDeclaration extends GenericPipelineDeclaration { expressionCheck = executeWith(delegate, expression) } if (branch) { - AntPathMatcher antPathMatcher = new AntPathMatcher() - branchCheck = antPathMatcher.match(branch, delegate.env.BRANCH_NAME) + branchCheck = compareStringToPattern(delegate.env.BRANCH_NAME, branch) } if (changeRequest) { changeRequestCheck = changeRequest.execute(delegate) @@ -94,7 +111,7 @@ class WhenDeclaration extends GenericPipelineDeclaration { tagCheck = delegate?.env?.containsKey("TAG_NAME") } if (tag) { - tagCheck = delegate.env.TAG_NAME =~ tag + tagCheck = compareStringToPattern(delegate.env.TAG_NAME, tag) } if (envName != null) { def val = delegate?.env[envName] @@ -104,4 +121,21 @@ class WhenDeclaration extends GenericPipelineDeclaration { return expressionCheck && branchCheck && changeRequestCheck && tagCheck && envCheck && allOfCheck && anyOfCheck && notCheck } + protected Boolean compareStringToPattern(String string, Tuple2 tuple) { + return compareStringToPattern(string, tuple.first, tuple.second) + } + + protected Boolean compareStringToPattern(String string, String pattern, ComparatorEnum comparator) { + switch (comparator) { + case ComparatorEnum.EQUALS: + return string == pattern + case ComparatorEnum.GLOB: + return string ==~ getPatternFromGlob(pattern) + case ComparatorEnum.REGEXP: + return string ==~ pattern + } + + throw new IllegalArgumentException("Invalid comparator '${comparator}'") + } + } diff --git a/src/test/groovy/com/lesfurets/jenkins/unit/declarative/TestDeclarativePipeline.groovy b/src/test/groovy/com/lesfurets/jenkins/unit/declarative/TestDeclarativePipeline.groovy index a43b3883..10a6bde1 100644 --- a/src/test/groovy/com/lesfurets/jenkins/unit/declarative/TestDeclarativePipeline.groovy +++ b/src/test/groovy/com/lesfurets/jenkins/unit/declarative/TestDeclarativePipeline.groovy @@ -111,7 +111,7 @@ class TestDeclarativePipeline extends DeclarativePipelineTest { } @Test void when_anyOf_branch_release() throws Exception { - addEnvVar('BRANCH_NAME', 'release') + addEnvVar('BRANCH_NAME', 'release/A.B.C') runScript('AnyOf_Jenkinsfile') printCallStack() assertCallStack().contains('Executing anyOf with branch') @@ -134,16 +134,24 @@ class TestDeclarativePipeline extends DeclarativePipelineTest { assertJobStatusSuccess() } - @Test void when_anyOf_branch_pattern_main_not() throws Exception { - addEnvVar('BRANCH_NAME', 'main2') + @Test void when_anyOf_branch_feature() throws Exception { + addEnvVar('BRANCH_NAME', 'feature/jenkins') + runScript('AnyOf_Jenkinsfile') + printCallStack() + assertCallStack().contains('Executing anyOf with branch') + assertJobStatusSuccess() + } + + @Test void when_anyOf_branch_pattern_not() throws Exception { + addEnvVar('BRANCH_NAME', '?') runScript('AnyOf_Jenkinsfile') printCallStack() assertCallStack().contains('Skipping stage Example anyOf branch') assertJobStatusSuccess() } - @Test void when_anyOf_tag_version_pattern() throws Exception { - addEnvVar('TAG_NAME', 'version-X.Y.Z') + @Test void when_anyOf_tag_latest() throws Exception { + addEnvVar('TAG_NAME', 'latest') runScript('AnyOf_Jenkinsfile') printCallStack() assertCallStack().contains('Executing anyOf with tag') @@ -158,8 +166,24 @@ class TestDeclarativePipeline extends DeclarativePipelineTest { assertJobStatusSuccess() } - @Test void when_anyOf_tag_release_pattern_main_not() throws Exception { - addEnvVar('TAG_NAME', 'releaseX.Y.Z') + @Test void when_anyOf_tag_v_pattern() throws Exception { + addEnvVar('TAG_NAME', 'v-X.Y.Z') + runScript('AnyOf_Jenkinsfile') + printCallStack() + assertCallStack().contains('Executing anyOf with tag') + assertJobStatusSuccess() + } + + @Test void when_anyOf_tag_version_pattern() throws Exception { + addEnvVar('TAG_NAME', 'version-X.Y.Z') + runScript('AnyOf_Jenkinsfile') + printCallStack() + assertCallStack().contains('Executing anyOf with tag') + assertJobStatusSuccess() + } + + @Test void when_anyOf_tag_not() throws Exception { + addEnvVar('TAG_NAME', '?') runScript('AnyOf_Jenkinsfile') printCallStack() assertCallStack().contains('Skipping stage Example anyOf tag') @@ -234,6 +258,22 @@ class TestDeclarativePipeline extends DeclarativePipelineTest { assertJobStatusSuccess() } + @Test void when_allOf_branches() throws Exception { + addEnvVar('BRANCH_NAME', 'production') + runScript('AllOf_Jenkinsfile') + printCallStack() + assertCallStack().contains('Skipping stage Example allOf branches') + assertJobStatusSuccess() + } + + @Test void when_allOf_tags() throws Exception { + addEnvVar('TAG_NAME', 'latest') + runScript('AllOf_Jenkinsfile') + printCallStack() + assertCallStack().contains('Skipping stage Example allOf tags') + assertJobStatusSuccess() + } + @Test void when_allOf_changerequests() throws Exception { addEnvVar('CHANGE_TARGET', 'develop') addEnvVar('CHANGE_BRANCH', 'feature/ABC-123 new feature') @@ -379,11 +419,35 @@ class TestDeclarativePipeline extends DeclarativePipelineTest { assertJobStatusSuccess() } - @Test void when_branch() throws Exception { - addEnvVar('BRANCH_NAME', 'production') + @Test void when_branch_using_explicit_equals_comparator() throws Exception { + addEnvVar('BRANCH_NAME', 'develop') + runScript('Branch_Jenkinsfile') + printCallStack() + assertCallStack().contains('EQUALS (explicit)') + assertJobStatusSuccess() + } + + @Test void when_branch_using_implicit_glob_comparator() throws Exception { + addEnvVar('BRANCH_NAME', 'feature/xyz') + runScript('Branch_Jenkinsfile') + printCallStack() + assertCallStack().contains('GLOB (implicit)') + assertJobStatusSuccess() + } + + @Test void when_branch_using_explicit_glob_comparator() throws Exception { + addEnvVar('BRANCH_NAME', 'bugfix/xyz') + runScript('Branch_Jenkinsfile') + printCallStack() + assertCallStack().contains('GLOB (explicit)') + assertJobStatusSuccess() + } + + @Test void when_branch_using_explicit_regexp_comparator() throws Exception { + addEnvVar('BRANCH_NAME', 'hotfix/xyz') runScript('Branch_Jenkinsfile') printCallStack() - assertCallStack().contains('Deploying') + assertCallStack().contains('REGEXP (explicit)') assertJobStatusSuccess() } @@ -391,7 +455,10 @@ class TestDeclarativePipeline extends DeclarativePipelineTest { addEnvVar('BRANCH_NAME', 'master') runScript('Branch_Jenkinsfile') printCallStack() - assertCallStack().contains('Skipping stage Example Deploy') + assertCallStack().contains('Skipping stage Example - EQUALS comparator') + assertCallStack().contains('Skipping stage Example - GLOB comparator (implicit)') + assertCallStack().contains('Skipping stage Example - GLOB comparator (explicit)') + assertCallStack().contains('Skipping stage Example - REGEXP comparator') assertJobStatusSuccess() } @@ -489,7 +556,7 @@ class TestDeclarativePipeline extends DeclarativePipelineTest { addEnvVar('TAG_NAME', 'release-1.0.0') runScript('Tag_Jenkinsfile') printCallStack() - assertCallStack().contains('Generating Release Notes') + assertCallStack().contains('Generating Release Notes for any tag') assertJobStatusSuccess() } @@ -497,16 +564,43 @@ class TestDeclarativePipeline extends DeclarativePipelineTest { // no TAG_NAME variable defined runScript('Tag_Jenkinsfile') printCallStack() - assertCallStack().contains('Skipping stage Example Release Notes') // No stage bound to a "buildingTag()" condition - assertCallStack().contains('Skipping stage Example Deploy') // No stage bound to a "tag " condition + assertCallStack().contains('Skipping stage Example - EQUALS comparator') + assertCallStack().contains('Skipping stage Example - GLOB comparator (implicit)') + assertCallStack().contains('Skipping stage Example - GLOB comparator (explicit)') + assertCallStack().contains('Skipping stage Example - REGEXP comparator') + assertCallStack().contains('Skipping stage Example Release Notes') + assertJobStatusSuccess() + } + + @Test void when_tag_using_explicit_equals_comparator() throws Exception { + addEnvVar('TAG_NAME', 'x.y.z') + runScript('Tag_Jenkinsfile') + printCallStack() + assertCallStack().contains('EQUALS (explicit)') + assertJobStatusSuccess() + } + + @Test void when_tag_using_implicit_glob_comparator() throws Exception { + addEnvVar('TAG_NAME', 'v1.0.0') + runScript('Tag_Jenkinsfile') + printCallStack() + assertCallStack().contains('GLOB (implicit)') + assertJobStatusSuccess() + } + + @Test void when_tag_using_explicit_glob_comparator() throws Exception { + addEnvVar('TAG_NAME', 'v-1.0.0') + runScript('Tag_Jenkinsfile') + printCallStack() + assertCallStack().contains('GLOB (explicit)') assertJobStatusSuccess() } - @Test void when_tag() throws Exception { - addEnvVar('TAG_NAME', 'v1.1.1') + @Test void when_tag_using_explicit_regexp_comparator() throws Exception { + addEnvVar('TAG_NAME', '1.0.0') runScript('Tag_Jenkinsfile') printCallStack() - assertCallStack().contains('Deploying') + assertCallStack().contains('REGEXP (explicit)') assertJobStatusSuccess() } @@ -514,7 +608,10 @@ class TestDeclarativePipeline extends DeclarativePipelineTest { addEnvVar('TAG_NAME', 'someothertag') runScript('Tag_Jenkinsfile') printCallStack() - assertCallStack().contains('Skipping stage Example Deploy') + assertCallStack().contains('Skipping stage Example - EQUALS comparator') + assertCallStack().contains('Skipping stage Example - GLOB comparator (implicit)') + assertCallStack().contains('Skipping stage Example - GLOB comparator (explicit)') + assertCallStack().contains('Skipping stage Example - REGEXP comparator') assertJobStatusSuccess() } diff --git a/src/test/jenkins/jenkinsfiles/AllOf_Jenkinsfile b/src/test/jenkins/jenkinsfiles/AllOf_Jenkinsfile index c8825897..b0b80c6f 100644 --- a/src/test/jenkins/jenkinsfiles/AllOf_Jenkinsfile +++ b/src/test/jenkins/jenkinsfiles/AllOf_Jenkinsfile @@ -21,11 +21,37 @@ pipeline { echo 'Executing allOf with expression' } } - stage('Example allOf changeRequests') { + stage('Example allOf branches') { // Contrived example when { allOf { - changeRequest target: 'develop' - changeRequest branch: 'feature/*', comparator:'GLOB' + branch pattern: 'production', comparator: 'EQUALS' + branch pattern: /^release\/[A-Z].[A-Z].[A-Z]$/, comparator: 'REGEXP' + branch pattern: 'main-**', comparator: 'GLOB' + branch 'feature/*' + } + } + steps { + echo 'Executing allOf with branches' + } + } + stage('Example allOf tags') { // Contrived example + when { + allOf { + tag pattern: 'latest', comparator: 'EQUALS' + tag pattern: /^release-[A-Z].[A-Z].[A-Z]$/, comparator: 'REGEXP' + tag pattern: 'v-*', comparator: 'GLOB' + tag 'version-*' + } + } + steps { + echo 'Executing allOf with tags' + } + } + stage('Example allOf changeRequests') { + when { + allOf { + changeRequest target: 'develop' + changeRequest branch: 'feature/*', comparator:'GLOB' } } steps { diff --git a/src/test/jenkins/jenkinsfiles/AnyOf_Jenkinsfile b/src/test/jenkins/jenkinsfiles/AnyOf_Jenkinsfile index e7bc0ca0..edff30bd 100644 --- a/src/test/jenkins/jenkinsfiles/AnyOf_Jenkinsfile +++ b/src/test/jenkins/jenkinsfiles/AnyOf_Jenkinsfile @@ -24,9 +24,10 @@ pipeline { stage('Example anyOf branches') { when { anyOf { - branch 'production' - branch 'release' - branch 'main-**' + branch pattern: 'production', comparator: 'EQUALS' + branch pattern: /^release\/[A-Z].[A-Z].[A-Z]$/, comparator: 'REGEXP' + branch pattern: 'main-**', comparator: 'GLOB' + branch 'feature/*' } } steps { @@ -36,7 +37,9 @@ pipeline { stage('Example anyOf tags') { when { anyOf { - tag 'release-*' + tag pattern: 'latest', comparator: 'EQUALS' + tag pattern: /^release-[A-Z].[A-Z].[A-Z]$/, comparator: 'REGEXP' + tag pattern: 'v-*', comparator: 'GLOB' tag 'version-*' } } @@ -48,7 +51,7 @@ pipeline { when { anyOf { changeRequest target: 'develop' - changeRequest target: 'release/*', comparator:'GLOB' + changeRequest target: 'release/*', comparator: 'GLOB' } } steps { diff --git a/src/test/jenkins/jenkinsfiles/Branch_Jenkinsfile b/src/test/jenkins/jenkinsfiles/Branch_Jenkinsfile index 41c2546a..c622a03a 100644 --- a/src/test/jenkins/jenkinsfiles/Branch_Jenkinsfile +++ b/src/test/jenkins/jenkinsfiles/Branch_Jenkinsfile @@ -6,12 +6,36 @@ pipeline { echo 'Hello World' } } - stage('Example Deploy') { + stage('Example - EQUALS comparator') { when { - branch 'production' + branch pattern: 'develop', comparator: 'EQUALS' } steps { - echo 'Deploying' + echo 'EQUALS (explicit)' + } + } + stage('Example - GLOB comparator (implicit)') { + when { + branch 'feature/*' + } + steps { + echo 'GLOB (implicit)' + } + } + stage('Example - GLOB comparator (explicit)') { + when { + branch pattern: 'bugfix/*', comparator: 'GLOB' + } + steps { + echo 'GLOB (explicit)' + } + } + stage('Example - REGEXP comparator') { + when { + branch pattern: /^[a-z]*\/[a-z]*$/, comparator: 'REGEXP' + } + steps { + echo 'REGEXP (explicit)' } } } diff --git a/src/test/jenkins/jenkinsfiles/Tag_Jenkinsfile b/src/test/jenkins/jenkinsfiles/Tag_Jenkinsfile index cf116eda..1f11fb3b 100644 --- a/src/test/jenkins/jenkinsfiles/Tag_Jenkinsfile +++ b/src/test/jenkins/jenkinsfiles/Tag_Jenkinsfile @@ -6,12 +6,36 @@ pipeline { echo 'Hello World' } } - stage('Example Deploy') { + stage('Example - EQUALS comparator') { + when { + tag pattern: 'x.y.z', comparator: 'EQUALS' + } + steps { + echo 'EQUALS (explicit)' + } + } + stage('Example - GLOB comparator (implicit)') { when { tag 'v*' } steps { - echo 'Deploying only tags matching the pattern v*' + echo 'GLOB (implicit)' + } + } + stage('Example - GLOB comparator (explicit)') { + when { + tag pattern: 'v-*', comparator: 'GLOB' + } + steps { + echo 'GLOB (explicit)' + } + } + stage('Example - REGEXP comparator') { + when { + tag pattern: /^[0-9].[0-9].[0-9]$/, comparator: 'REGEXP' + } + steps { + echo 'REGEXP (explicit)' } } stage('Example Release Notes') {