在Jenkin的管道中重复使用多个节点

时间:2017-09-21 23:48:46

标签: jenkins jenkins-pipeline

我有一个应用程序,我需要在Windows和Linux上构建,测试和部署。

我有40个奴隶,其中20个是Linux,20个是分别由“Lin”和“Win”标签定义的Windows。

我首先分配两个节点(Linux和Windows)。问题是我需要通过多个阶段使用它们。但是,我还没有找到一个很好的方法去做这件事。

此代码应该有助于说明我需要做什么:

pipeline {
agent none

stages {
    stage('Build') {
        parallel (
            "Linux Build": {
                node('Lin') { // Say this allocates 'Jenkins-node-lin1'
                    ...
                }
            },
            "Windows Build": {
                node('Win') { // And this allocates 'Jenkins-node-win1'
                    ...
                }
            }
        )
    }
    stage('Test') {
        steps {
            parallel (
                "Linux Test": {
                    node('Lin') { // I need to reuse Jenkins-node-lin1 here 
                        ...
                    }
                },
                "Windows Test": {
                    node('Win') { // And Jenkins-node-win1 here as well
                        ...
                    }
                }
            )
        }
    }
    stage('Deploy') {
        steps {
            parallel (
                "Linux Deploy": {
                    node('Lin') { // Same story down here
                        ...
                    }
                },
                "Windows Deploy": {
                    node('Win') { // And this one too
                        ...
                }
            )
        }
    }
} // End stages
}

我已经尝试了很多'解决方案',但到目前为止还没有一个解决方案,说实话,我不确定这个功能是否融入了Jenkins。

1 个答案:

答案 0 :(得分:1)

我还没试过这个,但我认为你可以做点什么(顺便说一下,你错过了你的步骤{}块):

def linux_node
def windows_node

pipeline {
agent none

stages {
    stage('Build') {
        steps {
        parallel (
            "Linux Build": {
                node('Lin') { // Say this allocates 'Jenkins-node-lin1'
                    linux_node = env.NODE_NAME
                }
            },
            "Windows Build": {
                node('Win') { // And this allocates 'Jenkins-node-win1'
                    windows_node = env.NODE_NAME
                }
            }
        )
        }
    }
    stage('Test') {
        steps {
            parallel (
                "Linux Test": {
                    node(linux_node) { // I need to reuse Jenkins-node-lin1 here 
                        ...
                    }
                },
                "Windows Test": {
                    node(windows_node) { // And Jenkins-node-win1 here as well
                        ...
                    }
                }
            )
        }
    }
    stage('Deploy') {
        steps {
            parallel (
                "Linux Deploy": {
                    node(linux_node) { // Same story down here
                        ...
                    }
                },
                "Windows Deploy": {
                    node(windows_node) { // And this one too
                        ...
                }
            )
        }
    }
} // End stages
}

我不确定您是否要求与某个节点建立关联,但如果某个文件在工作区中可用,那么这样做会有一点风险。无法保证将使用相同的工作空间。它通常会,但有时工作空间可能会改变。

另一个选项是隐藏您需要在各个阶段之间保留的文件,并在下一阶段解除隐藏它们。那么他们最终会遇到什么代理并不重要。 (除非你有其他一些节点亲和力的原因)。