相关疑难解决方法(0)

与Jenkins工作流/管道并行运行阶段

请注意:问题基于旧的,现在称为"脚本"管道格式.使用"声明性管道"时,并行块可以嵌套在阶段块内(请参阅带有声明性管道1.2的并行阶段).

我想知道如何将并行步骤与Jenkins工作流/管道插件一起使用,尤其是.如何将它们与构建阶段混合.我知道一般模式:

parallel(firstTask: {
  // Do some stuff
}, secondTask: {
  // Do some other stuff in parallel
})
Run Code Online (Sandbox Code Playgroud)

但是,我想并行运行几个阶段(在同一节点上,有多个执行程序),所以我尝试添加这样的阶段:

stage 'A'
// Do some preparation stuff

parallel(firstTask: {
  stage 'B1'
  // Do some stuff
}, secondTask: {
  stage 'B2'
  // Do some other stuff in parallel
})

stage 'C'
// Finalizing stuff
Run Code Online (Sandbox Code Playgroud)

这不能按预期工作."do stuff"任务是并行执行的,但并行阶段会立即结束,并且不会包含它们应包含的内容.因此,舞台视图不会显示正确的结果,也不会链接日志.

我可以并行构建不同的阶段,还是"并行"步骤仅用于单个阶段?

jenkins jenkins-pipeline

43
推荐指数
5
解决办法
10万
查看次数

Jenkinsfile 管道 DSL:如何在作业仪表板 GUI 中显示多列 - 适用于所有动态创建的阶段 - 在 PIPELINE 部分中时

詹金斯2.89.4 滚动

我看到了几乎所有的 stackoverflow 帖子,这些帖子展示了我们如何成功运行并行步骤/阶段(使用列表/映射等)——或者直接对它们进行硬编码——或者甚至为 Jenkinsfile 创建动态阶段(如这篇文章所示:脚本化 jenkinsfile 并行阶段)

我的要求是:

  1. 在“构建”步骤下构建 N 个项目的管道,即在这些项目中的每一个上并行构建。即它在所有 N 个项目上运行 Gradle。在这里,我有一个由声明性 JOB DSL Groovy 创建的 Jenkinsfile。这里我的 Gradle 项目没有设置为多项目,所以我不能调用顶级 gradle 并说,Gradle 请发挥你的平行魔法(在 Gradle 内)。

  2. 我想在它们自己单独的并行动态创建阶段(GUI 列)中运行这些 N 个项目的构建,如 jenkins 作业的仪表板中所见。

  3. 我想分别查看(Gradle 构建/控制台)每个项目构建的输出,即我不想混合每个项目构建的控制台输出,这些构建仅在一列(即名为 的列BUILD中并行运行

  4. 在这个 URL https://jenkins.io/blog/2017/09/25/declarative-1/我明白了,你可以如何运行并行阶段/步骤,但这样做,要么将这些并行步骤的输出混合在一列中(我的意思是在BUILD列)--OR如果你想让它在不同的阶段/列(即发帖称测试在Linux或Windows 分开,那么你仍然硬编码的所有阶段/步骤早期(在Jenkinsfile而不是使用只是一个列表或数组哈希,我更愿意更新它以添加更多或更少的阶段/并行步骤,就像我的情况一样,它们都遵循相同的标准。我想要的是只在一个地方更新多少步骤和什么所有阶段都在一个地方(列表/数组)。

  5. 我现在使用Jenkins Blue Ocean

通常,如果您在一个阶段中有并行步骤,则当您单击以查看给定并行步骤/阶段的控制台输出时,所有步骤的控制台标准输出会混合到一个控制台输出/阶段/列中;当您将鼠标悬停在作业仪表板中的 BUILD 列(假设在 BUILD 阶段中有并行步骤)时(所有这些步骤的标准输出混合在一起,很难看到单个项目步骤的控制台输出仅针对给定的步骤/阶段)。

如果我们想(动态地)创建单独的阶段,那么 Jenkins …

parallel-processing groovy dashboard jenkins-pipeline

9
推荐指数
1
解决办法
3761
查看次数

如何在 Jenkins 的动态管道中使用 failFast

我有具有动态并行阶段的管道,如果任何阶段失败,我希望我的管道快速失败。我试图添加 failFast: true 但我的管道卡在“在阶段 ABC 失败”。

  stage("Deploy") {             
        steps {
            script {
                def stages = createStages("Name", "Project")
                fastFail: true
                for (stage in stages) {                        
                    parallel stage                      
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

fail-fast jenkins jenkins-pipeline

8
推荐指数
1
解决办法
9767
查看次数

如何在 Jenkins 脚本化管道中创建并行阶段?

我正在尝试在我的 Jenkins 管道代码中实现并行化,我可以在其中并行运行两个阶段。我知道这在声明性管道中是可能的,但我使用的是脚本化管道。

我试图通过做这样的事情来实现这一点:

parallel(
    stage('StageA') {
        echo "This is branch a"
    },
    stage('StageB') {
        echo "This is branch b"
    }
  )
Run Code Online (Sandbox Code Playgroud)

当我运行它并在 Blue Ocean 中查看它时,阶段不会并行运行,而是在 StageA 之后执行 StageB。在脚本化的 jenkins 管道中是否可以有并行阶段?如果是这样,如何?

groovy continuous-integration continuous-deployment jenkins-groovy jenkins-pipeline

5
推荐指数
1
解决办法
4692
查看次数

Groovy 中的闭包不捕获外部变量

在 Jenkins 管道的上下文中,我有一些 Groovy 代码,它枚举列表、创建闭包,然后使用闭包中的该值作为键来查找映射中的另一个值。这似乎几乎每次都充斥着某种异常或竞争条件。

这是代码的简化:

def tasks = [:]
for (platformName in platforms) {
  // ...

  tasks[platformName] = {
    def componentUploadPath = componentUploadPaths[platformName]

    echo "Uploading for platform [${platformName}] to [${componentUploadPath}]."

    // ...
}

tasks.failFast = true
parallel(tasks)
Run Code Online (Sandbox Code Playgroud)

platforms有两个值。我通常会看到两个迭代和两个注册的任务,并且输入的键tasks是正确的,但是闭包中的 echo 语句表明我们只是运行了一个平台两次:

14:20:02 [platform2] Uploading for platform [platform1] to [some_path/platform1].
14:20:02 [platform1] Uploading for platform [platform1] to [some_path/platform1].
Run Code Online (Sandbox Code Playgroud)

这很荒谬。

我需要添加什么或做不同的事情?

groovy jenkins jenkins-groovy jenkins-pipeline

4
推荐指数
1
解决办法
271
查看次数