-
Improvement
-
Resolution: Unresolved
-
Major
-
None
Hello, it would be great if we had a mechanism to define dynamic stages within declarative pipelines. The use case is that I want to create a pipeline function for micro service repositories. Each repository contains a number of container images that needs to be built in parallel. The only way I found is using the these pseudo stages wrapped by the `parallel` step:
pipeline { agent any stages { stage('build') { steps { runParallel items: ("a".."f").collect { "Stage ${it}" } } } } } def runParallel(args) { parallel args.items.collectEntries { name -> [ "${name}": { stage("${name}") { echo name } }]} }
This is bad because the sub-stages can neither have an agent nor contain other sub-stages. And it requires a separate function (I couldn't get it working without).
On the other hand, this shouldn't make the declarative pipeline too scripty. A minimal scriptiness approach would look like this:
pipeline { agent none stages { stage('build') { stages { ("A".."F").collect { stage("Stage ${it}") { agent any steps { echo "Hello from stage ${it}!" } } } } } } }
[JENKINS-58236] Provide mechanism to define dynamic stages in declarative pipelines
Description |
Original:
Hello, it would be great if we had a mechanism to define dynamic stages within declarative pipelines. The use case is that I want to create a pipeline function for micro service repositories. Each repository contains a number of container images that needs to be built in parallel. The only way I found is using the these pseudo stages wrapped by the `parallel` step: {code} pipeline { agent any stages { stage('build') { steps { runParallel items: ("a".."f").collect { "Stage ${it}" } } } } } def runParallel(args) { parallel args.items.collectEntries { name -> [ "${name}": { stage("${name}") { echo name } }]} } {code} This is bad because the sub-stages can neither have an agent nor contain other sub-stages. And it requires a On the other hand, this shouldn't make the declarative pipeline too scripty. A minimal scriptiness approach would look like this: {code} pipeline { agent none stages { stage('build') { stages { ("A".."F").collect { stage("Stage ${it}") { agent any steps { echo "Hello from stage ${it}!" } } } } } } } {code} |
New:
Hello, it would be great if we had a mechanism to define dynamic stages within declarative pipelines. The use case is that I want to create a pipeline function for micro service repositories. Each repository contains a number of container images that needs to be built in parallel. The only way I found is using the these pseudo stages wrapped by the `parallel` step: {code} pipeline { agent any stages { stage('build') { steps { runParallel items: ("a".."f").collect { "Stage ${it}" } } } } } def runParallel(args) { parallel args.items.collectEntries { name -> [ "${name}": { stage("${name}") { echo name } }]} } {code} This is bad because the sub-stages can neither have an agent nor contain other sub-stages. And it requires a separate function (I couldn't get it working without). On the other hand, this shouldn't make the declarative pipeline too scripty. A minimal scriptiness approach would look like this: {code} pipeline { agent none stages { stage('build') { stages { ("A".."F").collect { stage("Stage ${it}") { agent any steps { echo "Hello from stage ${it}!" } } } } } } } {code} |
Assignee | Original: Andrew Bayer [ abayer ] |
Attachment | New: image-2020-08-21-11-00-07-514.png [ 52405 ] |
Attachment | New: Screenshot 2020-08-21 at 11.13.42.png [ 52407 ] |
Attachment | Original: image-2020-08-21-11-00-07-514.png [ 52405 ] |
Attachment | New: image-2020-08-21-11-14-53-397.png [ 52408 ] |
The number of Dockerfile is increasing more and more, so this feature is really needed and important to all users.