我正在将现有的构建管道重建为詹金斯声明性管道(多分支管道),并且在处理构建传播时遇到问题。
打包并存储所有相关文件后,管道应等待用户输入触发部署。
如果我只是添加一个输入步骤,则当前构建节点被阻止。由于该执行程序非常繁重,因此我想将此步骤转移到更轻巧的机器上。
最初,我以脚本管道的形式完成了工作,并创建了两个不同的node('label')块。有没有办法让我对声明式语法做类似的事情?
node('label')
node('spine') { stage('builder') { sh 'mvn clean compile' stash name: 'artifact', includes: 'target/*.war' } } node('lightweight') { stage('wait') { timeout(time:5, unit:'DAYS') { input message:'Approve deployment?' } } // add deployment stages }
我已经尝试了几件事:
在顶层配置代理,并在传播步骤中添加其他代理配置,但是由于顶层定义的构建节点未停止,因此我有两个执行程序受阻。
agent none在顶层进行设置并按步骤配置代理。则git checkout在第一个节点上不存在。
agent none
编辑1
我根据您的建议重新配置了管道,目前看起来像这样:
pipeline { agent none tools { maven 'M3' } stages { stage('Build') { agent { label 'spine' } steps { checkout scm // needed, otherwise the workspace on the first step is empty sh "mvn clean compile" } } stage('Test') { agent { label 'spine' } steps { sh "mvn verify" // fails because the workspace is empty aggain junit '**/target/surefire-reports/TEST-*.xml' } } } }
该构建将失败,因为工作空间不会在同一执行程序上运行,因此不会在步骤之间继续执行。
编辑2
显然,有时这些步骤是在同一执行程序上运行的,有时则不是。(我们根据需要在mesos / dcos集群上生成构建从属,因此在中间构建时更改执行程序将是一个问题)
我希望jenkins仅与当前执行程序一起运行,只要代理定义中的标签不变即可。
请参阅最佳实践7:请勿:在节点块内使用输入。在声明性管道中,通过agent指令完成节点选择。
agent
此处的文档描述了如何定义none管线,然后使用阶段级agent指令在所需节点上运行阶段。我也尝试了相反的方法(在某个节点上定义一个全局代理,然后none在输入的阶段级上定义),但这不起作用。如果管道分配了一个从站,则不能在一个或多个特定阶段释放该从站。
none
这是我们管道的结构:
pipeline { agent none stages { stage('Build') { agent { label 'yona' } steps { ... } } stage('Decide tag on Docker Hub') { agent none steps { script { env.TAG_ON_DOCKER_HUB = input message: 'User input required', parameters: [choice(name: 'Tag on Docker Hub', choices: 'no\nyes', description: 'Choose "yes" if you want to deploy this build')] } } } stage('Tag on Docker Hub') { agent { label 'yona' } when { environment name: 'TAG_ON_DOCKER_HUB', value: 'yes' } steps { ... } } } }
通常,构建阶段在标记为“ yona”的构建从属服务器上执行,但是输入阶段在主服务器上运行。