【问题标题】:Re-use agent in parallel stages of declarative pipeline在声明性管道的并行阶段重用代理
【发布时间】:2018-11-06 01:18:21
【问题描述】:

我正在使用 Declarative Pipelines 1.3.2 插件,并且我想在多个并行阶段使用相同的代理(如仅指定一次 agent 指令):

stage('Parallel Deployment')
{
    agent { dockerfile { label 'docker'; filename 'Dockerfile'; } }
    parallel
    {
        stage('A') { steps { ... } } 
        stage('B') { steps { ... } }
    }
}

然而,詹金斯抱怨:

“代理”不允许出现在“并行部署”阶段,因为它包含并行阶段

一种解决方案是为每个并行阶段复制agent 指令,但这很繁琐,并且会导致许多并行阶段的重复代码:

stage('Parallel Deployment')
{
    parallel
    {
        stage('A') { 
            agent { dockerfile { label 'docker'; filename 'Dockerfile'; } }
            steps { ... } 
        } 
        stage('B') { 
            agent { dockerfile { label 'docker'; filename 'Dockerfile'; } }
            steps { ... } 
        }
    }
}

是否有更惯用的解决方案,或者是否需要为每个并行阶段复制 agent 指令?

【问题讨论】:

  • 您不能在管道级别声明代理,以便所有阶段都在同一个代理上运行吗?
  • 你完全正确;如果这是答案,我现在就接受。
  • 添加它作为答案:)

标签: jenkins jenkins-plugins jenkins-pipeline


【解决方案1】:

pipeline 级别指定代理可能是一种解决方案,但存在潜在的缺点,即代理在整个构建期间都处于启动和运行状态。
另请注意,这意味着每个阶段(未定义自己的agent)都在同一个代理实例上运行,而不是在代理类型上运行。如果并行进程是 CPU/资源密集型的,这可能不是您想要的。

不过,如果您想在一个实例上运行并行阶段,并且不能或不想在 pipeline 级别定义代理,这里有一个声明性语法的解决方法:

stage('Parallel Deployment') {
    agent { dockerfile { label 'docker'; filename 'Dockerfile'; } }
    stages {
        stage('A & B') {
            parallel {
                stage('A') { steps { ... } } 
                stage('B') { steps { ... } }
            }
        }
    }
}

或者您选择没有此限制的脚本化管道。

【讨论】:

    【解决方案2】:

    在管道级别声明代理,以便所有阶段都在同一个代理上运行。

    【讨论】:

    • 你能澄清一下吗? @Sean Pianka 希望这些阶段在相同的代理上运行,而不是在同一个代理上。如何编写 Jenkinsfile 以使代理定义可重用?
    • 我试过了,并行阶段没有并行运行?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多