Jenkins管道中的节点,阶段和步骤有什么区别?

时间:2016-09-17 16:38:26

标签: jenkins jenkins-pipeline

我正在尝试了解如何构建我的Jenkins 2.7管道groovy脚本。我已经阅读了pipeline tutorial,但觉得它可以在这些主题上进一步扩展。

我可以理解,管道可以有很多stage个,每个stage可以有很多step个。但是step();stage内的方法调用之间有什么区别,比如sh([script: "echo hello"]);nodestage的内部还是外部?作业的整体属性应该在node之内还是之外?

这是我在ubuntu主节点上的当前结构:

#!/usr/bin/env groovy

node('master') {
    properties([
        [$class: 'BuildDiscarderProperty', strategy: [$class: 'LogRotator', numToKeepStr: '10']]
    ]);

    stage 'Checkout'
        checkout scm

    stage 'Build'
        sh([script: "make build"]);

    archive("bin/*");
}

2 个答案:

答案 0 :(得分:31)

nodestagestep的概念不同:

  • node指定其中会发生什么。你给出一个名字或标签,Jenkins在那里运行。

  • stage将您的脚本构建为高级序列。阶段在“管道舞台”视图中显示为列,具有平均阶段时间和阶段结果的颜色。

  • step是指定将发生什么的一种方法。 sh具有相似的品质,是一种不同的行为。 (您也可以将build用于已指定为项目的内容。)

因此step可以位于node内,(如果他们不是,他们在主人身上执行),nodestep可以使用stage s将结构化为整体序列。

答案 1 :(得分:6)

这取决于。任何node声明都会分配执行程序(在Jenkins主服务器或从服务器上)。这需要您stashunstash工作区,因为另一个执行程序没有可用的签出源。

Pipeline DSL的几个步骤在flyweight执行程序中运行,因此不需要在node块内。 这可能对以下示例有帮助,您需要分配多个节点:

stage("Checkout") {
  checkout scm
}

stage("Build") {
  node('linux') {
    sh "make"
  }
  node('windows') {
    bat "whatever"
  }
}

stage("Upload") {
  ...

另一个(可能更现实的例子)是在parallel中分配多个节点。然后,没有必要让stage调用在另一个已分配的执行程序中执行(也就是在node内)。

你的榜样对我很好。没有必要在单node内分配多个stage,因为这只是额外的开销。