声明性詹金斯管道中的检查点

时间:2018-08-08 18:44:47

标签: jenkins jenkins-pipeline cloudbees checkpointing

我正在看Cloudbees documentation,上面写着:

  

正确的方法是始终将检查点步骤保留在任何节点块之外,而不与代理程序或工作空间相关联

给出的示例示例是针对脚本化管道的。我尝试在声明性管道中实现此功能,但始终出错。使它起作用的唯一方法是:

stage ('Promotion Checkpoint') {
    steps {
        checkpoint 'Ready for Manual intervention'
        timeout(time: 60, unit: 'SECONDS') {
            input message: 'Do you want to proceed?'
        }
    }
}

我的理解是,声明式管道中的一个阶段类似于脚本式管道中的节点。我无法在阶段或步骤之外进行检查点的工作,这似乎是我对Cloudbees的建议的解释。有人可以在检查点之外提供正确用法的帮助吗?

1 个答案:

答案 0 :(得分:3)

您面临的是声明式管道的问题,该管道会使应在代理程序和工作空间之外运行的事物有些混乱。

“常规”声明管道的顶部定义了一个代理

pipeline {
  agent any
  stages {
    stage("Build") {
      echo 'Build' 
    }
  }
}

但是现在所有的阶段标签都将使用相同的代理和工作空间。这使编写“标准”管道更加容易,但使命令无法使用任何代理变得不可能。因此,使用checkpoint时使用input或编写不阻塞执行程序的管道是不可能的。

因此,声明性管道的建议正确方法是在顶层管道中使用agent none并在每个agent any中指定agent nonestage

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'
      }
    }
  }
}