我正在将Jenkins Pipeline与声明性语法一起使用,目前处于以下阶段:
对于步骤1、2、3和5,我需要和代理(执行者),因为它们在工作区上进行实际工作。对于步骤4,我不需要一个,并且我不想在等待用户输入时阻止我可用的执行程序。对于经典的脚本化语法,这似乎被称为“轻量级”执行器或“轻量级”执行器,但是我找不到有关如何使用声明性语法实现此信息的任何信息。
到目前为止,我已经尝试过:
agent none
parallel
这是我的Jenkinsfile的概述:
pipeline { agent { label 'build-slave' } stages { stage("Prepare build") { steps { // ... } } stage("Build") { steps { parallel( frontend: { // ... }, backend: { // ... } ) } } stage("Test") { steps { parallel( jslint: { // ... }, phpcs: { // ... }, ) } post { // ... } } stage("Select deploy target") { steps { script { // ... code that determines choiceParameterDefinition based on branch name ... try { timeout(time: 5, unit: 'MINUTES') { deployEnvironment = input message: 'Deploy target', parameters: [choiceParameterDefinition] } } catch(ex) { deployEnvironment = null } } } } stage("Deploy") { when { expression { return binding.variables.get("deployEnvironment") } } steps { // ... } } } post { // ... } }
我在这里缺少什么吗,还是在当前版本中不可能?
设置agent none在最高级别,然后agent { label 'foo' }在每个阶段设置,再设置在舞台agent none上,这input似乎对我来说是预期的。
agent { label 'foo' }
input
即,执行某些工作的每个阶段都在同一个代理上运行,而该input阶段不消耗任何代理上的执行程序。
pipeline { agent none stages { stage("Prepare build") { agent { label 'some-agent' } steps { echo "prepare: ${pwd()}" } } stage("Build") { agent { label 'some-agent' } steps { parallel( frontend: { echo "frontend: ${pwd()}" }, backend: { echo "backend: ${pwd()}" } ) } } stage("Test") { agent { label 'some-agent' } steps { parallel( jslint: { echo "jslint: ${pwd()}" }, phpcs: { echo "phpcs: ${pwd()}" }, ) } } stage("Select deploy target") { agent none steps { input message: 'Deploy?' } } stage("Deploy") { agent { label 'some-agent' } steps { echo "deploy: ${pwd()}" } } } }
但是,不能保证在管道中使用相同的代理标签将总是最终使用相同的工作空间,例如,当第一个构建正在等待时,作为同一作业的另一个构建input。
您将必须stash在构建步骤之后使用。如您所述,目前无法正常完成此操作parallel,因此您必须另外使用一个script块,以便在并行步骤之后/之前编写脚本管道的代码段以进行隐藏/取消隐藏。
stash
script