是否可以使用声明性管道来实现这一目标?
pipeline {
agent any
stages {
stage("test") {
steps {
dir ("file_path") {
// find all files with complete path
parallel (
// execute parallel tasks for each file found.
// this must be dynamic
}
}
}
}
}
}
}
#1 楼
设法用以下代码解决了它:pipeline {
agent { label "master"}
stages {
stage('1') {
steps {
script {
def tests = [:]
for (f in findFiles(glob: '**/html/*.html')) {
tests["${f}"] = {
node {
stage("${f}") {
echo '${f}'
}
}
}
}
parallel tests
}
}
}
}
}
评论
另请查看官方管道示例-jenkins.io/doc/pipeline/examples/#parallel-multiple-nodes
–phedoreanu
18年4月10日在16:15
@phedoreanu我正在使用声明性管道...
– thclpr
18年4月10日在16:24
@phedoreanu我拒绝了您的编辑,编辑代码应该有充分的理由,您的评论不足以允许我对这样的答案进行这种编辑,这是一种自我解决方案。我认为您应该先评论才能与答案作者讨论此事,然后再进行此编辑。
–滕西拜
18年4月16日在9:38
@phedoreanu我认为您有更好的派生作品,然后请编写您自己的答案并解释为什么它更好(在错误处理,模板等方面)。
–滕西拜
18年4月16日在9:40
嗨,经过几次失败的尝试,我发现还是一样的。现在我唯一的问题是,如果出于某种原因,如果在节点内放置两个阶段{..},则工作流程阶段图和Blu Ocean会混淆。例如,在工作流阶段图表中,我得到NaNy NaNd,而在蓝海中,我仅得到第一阶段。
–朱塞佩
19年4月11日在10:13
#2 楼
如果您想留在Declarative Pipeline
空间内,这也可以工作// declare our vars outside the pipeline
def tests = [:]
def files
pipeline {
agent any
stages {
stage('1') {
steps {
script {
// we've declared the variable, now we give it the values
files = findFiles(glob: '**/html/*.html')
// Loop through them
files.each { f ->
// add each object from the 'files' loop to the 'tests' array
tests[f] = {
// we're already in the script{} block, so do our advanced stuff here
echo f.toString()
}
}
// Still within the 'Script' block, run the parallel array object
parallel tests
}
}
}
}
}
评论
如果要将每个并行任务分配给不同的Jenkins节点,则只需将动作包装在一个节点{}块中,如下所示:tests [f] = {node {echo f.toString()}}
–primetheus
19年1月29日19:57
#3 楼
请注意,动态构建步骤可能会在某些构建步骤中引起一些问题,例如当您呼叫其他工作时:pipeline {
stages {
stage('Test') {
steps {
script {
def tests = [:]
for (f in findFiles(glob: '**/html/*.html')) {
// Create temp variable, otherwise the name will be the last value of the for loop
def name = f
tests["${name}"] = {
build job: "${name}"
}
}
parallel tests
}
}
}
}
}
评论
我不知道为什么,但是我在测试中使用了stage和echo,但是它将提供阶段名称和echo为null,直到我使用了像上面使用过name的局部变量为止。你知道为什么吗?谢谢你的回答!
–考希克
20年4月8日在10:26
#4 楼
使用脚本化管道可以轻松地执行此操作,因为您可以使用任意Groovy,但仍然可以使用findFiles
步骤对声明性管道进行此操作。
评论
如果我要依次而不是并行执行多个步骤,该怎么办?当然可以,但是那样就不能动态生成并行任务,例如,取决于存储库中的某些文件。