【问题标题】:Do I have to use a node block in Declarative Jenkins pipelines?我必须在声明式 Jenkins 管道中使用节点块吗?
【发布时间】:2017-11-29 11:00:14
【问题描述】:

我正在阅读有关 Jenkins 管道的最佳实践的信息。 我创建了一个不执行并行作业的声明性管道,我想在同一个从属设备上运行所有内容。

我用:

agent {
    label 'xxx'
}

我的管道的其余部分如下所示:

pipeline {
        agent {
            label 'xxx'
        }
    triggers {
        pollSCM pipelineParams.polling
    }

    options {
        buildDiscarder(logRotator(numToKeepStr: '3'))
    }

    stages {
        stage('stage1') {
            steps {
                xxx
            }
        }

        stage('stage2') {
            steps {
                xxx
            }
        }
    }

    post {
        always {
            cleanWs()
        }

        failure {
            xxx"
        }

        success {
            xxx         
        }
    }
}

现在我阅读了最佳实践here。 第 4 点说明:

  1. 执行:节点内的所有材料工作

管道内的任何材料工作都应发生在节点块内。

为什么?默认情况下,Jenkinsfile 脚本本身在 Jenkins 上运行 master,使用一个轻量级的执行器,预计会使用很少 资源。任何实质性工作,例如从 Git 服务器克隆代码或 编译 Java 应用程序,应该利用 Jenkins 分布式 构建能力并运行代理节点。

我怀疑这是针对脚本化管道的。

现在我的问题是:

我是否必须在声明性管道中的stage 内创建node(这是可能的),或者当我想在另一个特定代理上运行我的舞台时,我是否必须在舞台内使用代理?

我当前的管道定义了一个label,它位于 4 个代理上。但是我的整个管道总是在一个代理上执行(我想要的),但我怀疑它在slaveX 上执行stage1,也许在slaveY 上执行stage2。为什么这没有发生?

【问题讨论】:

标签: jenkins jenkins-pipeline


【解决方案1】:

该文档具有很大的误导性。

文档的建议是利用分布式构建。使用agentnode 块激活分布式构建。 当您想几乎只在一个节点上运行管道时,应该使用agent。节点块允许更灵活,因为它允许您指定应在何处执行细粒度任务。

如果您在某个代理上运行管道并且您使用相同代理封装了一个带有节点的步骤,那么除了将新的执行器分配给使用节点封装的步骤之外,不会产生任何影响。 这样做没有明显的好处。你只会消耗你不需要的执行者。

总之,在使用 agent 时,您已经在使用分布式构建,而这正是文档模糊推荐的内容。

【讨论】:

    猜你喜欢
    • 2017-08-12
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    相关资源
    最近更新 更多