如何使用声明性Jenkins管道在同一节点上运行多个阶段?

时间:2017-07-02 12:46:52

标签: jenkins jenkins-pipeline

目标
在同一节点上运行声明性Jenkins管道的多个阶段。

设置
这只是显示问题的最小示例。有2个Windows节点" windows-slave1"和" windows-slave2"两者都标有标签" windows"。

注意:我真正的Jenkins文件无法使用全局代理,因为有一些阶段需要在不同的节点上运行(例如Windows与Linux)。

预期行为
Jenkins选择" Stage 1"中的一个节点。基于标签并在"阶段2"中使用相同的节点;因为变量 windowsNode 已更新为在"阶段1和#34;中选择的节点。

实际行为
"第2阶段"有时候运行在同一个网站上,有时候运行在与#34;阶段1和#34;不同的节点上。请参阅下面的输出。

Jenkinsfile

#!groovy

windowsNode = 'windows'

pipeline {
  agent none
  stages {
    stage('Stage 1') {
      agent {
        label windowsNode
      }
      steps {
        script {
          // all subsequent steps should be run on the same windows node
          windowsNode = NODE_NAME
        }
        echo "windowsNode: $windowsNode, NODE_NAME: $NODE_NAME"
      }
    }
    stage('Stage 2') {
      agent {
        label windowsNode
      }
      steps {
        echo "windowsNode: $windowsNode, NODE_NAME: $NODE_NAME"
      }
    }
  }
}

输出

[Pipeline] stage
[Pipeline] { (Stage 1)
[Pipeline] node
Running on windows-slave2 in C:\Jenkins\workspace\test-agent-allocation@2
[Pipeline] {
[Pipeline] script
[Pipeline] {
[Pipeline] }
[Pipeline] // script
[Pipeline] echo
windowsNode: windows-slave2, NODE_NAME: windows-slave2
[Pipeline] }
[Pipeline] // node
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Stage 2)
[Pipeline] node
Running on windows-slave1 in C:\Jenkins\workspace\test-agent-allocation
[Pipeline] {
[Pipeline] echo
windowsNode: windows-slave2, NODE_NAME: windows-slave1
[Pipeline] }
[Pipeline] // node
[Pipeline] }
[Pipeline] // stage
[Pipeline] End of Pipeline
Finished: SUCCESS

任何想法设置有什么问题?我想它是如何解析和执行Jenkins文件的。

其他建议?也许有一个Jenkins API可以根据" windows"选择一个节点。最初设置 windowsNode 时的标签。

4 个答案:

答案 0 :(得分:12)

自声明性管道插件版本1.3开始,此功能正式受支持。 正式称为“顺序阶段”。

pipeline {
    agent none

    stages {
        stage("check code style") {
            agent {
                docker "code-style-check-image"
            }
            steps {
                sh "./check-code-style.sh"
            }
        }

        stage("build and test the project") {
            agent {
                docker "build-tools-image"
            }
            stages {
               stage("build") {
                   steps {
                       sh "./build.sh"
                   }
               }
               stage("test") {
                   steps {
                       sh "./test.sh"
                   }
               }
            }
        }
    }
}

此处为官方公告:https://jenkins.io/blog/2018/07/02/whats-new-declarative-piepline-13x-sequential-stages/

答案 1 :(得分:7)

您可以在脚本块中定义阶段。这些阶段是在给定代理中运行的父阶段的一些子阶段。这是我必须在类似用例中使用的方法而不是你的方法。

vattrib_df$inst[is.na(vattrib_df$motherinst == TRUE)]

roots = which(sapply(sapply(V(g),
                    function(x) neighbors(g, x, mode = 'in')), length) == 0)

terminals = which(sapply(sapply(V(g),
                    function(x) neighbors(g, x, mode = 'out')), length) == 0)

答案 2 :(得分:2)

我发现这可以按照您的预期工作

#!groovy

windowsNode = 'windows'

pipeline {
    agent none
    stages {
        stage('Stage 1') {
            steps {
                node(windowsNode) {
                    script {
                        // all subsequent steps should be run on the same windows node
                        windowsNode = NODE_NAME
                    }
                    echo "windowsNode: $windowsNode, NODE_NAME: $NODE_NAME"
                }
            }
        }
        stage('Stage 2') {
            steps {
                node(windowsNode) {
                    echo "windowsNode: $windowsNode, NODE_NAME: $NODE_NAME"
                }
            }
        }
    }
}

答案 3 :(得分:-3)

agent none替换为agent any

相关问题