我正在看Cloudbees documentation,上面写着:
正确的方法是始终将检查点步骤保留在任何节点块之外,而不与代理程序或工作空间相关联
给出的示例示例是针对脚本化管道的。我尝试在声明性管道中实现此功能,但始终出错。使它起作用的唯一方法是:
stage ('Promotion Checkpoint') {
steps {
checkpoint 'Ready for Manual intervention'
timeout(time: 60, unit: 'SECONDS') {
input message: 'Do you want to proceed?'
}
}
}
我的理解是,声明式管道中的一个阶段类似于脚本式管道中的节点。我无法在阶段或步骤之外进行检查点的工作,这似乎是我对Cloudbees的建议的解释。有人可以在检查点之外提供正确用法的帮助吗?
答案 0 :(得分:3)
您面临的是声明式管道的问题,该管道会使应在代理程序和工作空间之外运行的事物有些混乱。
“常规”声明管道的顶部定义了一个代理
pipeline {
agent any
stages {
stage("Build") {
echo 'Build'
}
}
}
但是现在所有的阶段标签都将使用相同的代理和工作空间。这使编写“标准”管道更加容易,但使命令无法使用任何代理变得不可能。因此,使用checkpoint
时使用input
或编写不阻塞执行程序的管道是不可能的。
因此,声明性管道的建议正确方法是在顶层管道中使用agent none
并在每个agent any
中指定agent none
或stage
。
CloudBees documentation中有两个示例。您还可以在Jenkins文档中找到input
的此类解决方法。
因此,使用代理开关的一种解决方案如下所示:
pipeline {
agent none
stages {
stage("Build") {
agent any
steps {
echo "Building"
}
}
stage("Checkpoint") {
agent none //running outside of any node or workspace
steps {
checkpoint 'Completed Build'
}
}
stage("Deploy") {
agent any
steps {
sh 'Deploying'
}
}
}
}
在声明性管道中还有一个使用node
块的人。
pipeline {
agent none
stages{
stage("Build"){
// no agent defined will be solved with node
steps{
node('') { // this is equivalent to 'agent any'
echo "Building"
}
checkpoint "Build Done"
}
}
stage("Deploy") {
agent any
steps {
echo 'Deploy'
}
}
}
}