Jenkins Pipeline:"输入"步骤阻止执行者

时间:2016-06-15 09:26:47

标签: jenkins jenkins-pipeline

完成pipelineJenkinsfile文档后,我对如何创建 Stage - >感到有些困惑。生产管道。

一种方法是使用{/ 1}}步骤,如

input

这看起来有点笨拙,因为这会一直阻止执行程序,直到你想部署到生产。是否有任何替代方式可以从Jenkins部署到生产。

3 个答案:

答案 0 :(得分:43)

编辑(2016年10月):请参阅下面的其他答案"Use milestone and lock",其中包括最近推出的功能。

使用timeout步骤

作为第一个选项,您可以将sh步骤包含在timeout步骤中。

node() {
  stage 'Build to Stage' {
    sh '# ...'
  }

  stage 'Promotion' {
    timeout(time: 1, unit: 'HOURS') {
      input 'Deploy to Production?'
    }
  }

  stage 'Deploy to Production' {
    sh '# ...'
  }
}

这会在超时后停止构建。

input步骤移至Flyweight Executor

另一个选择是不为input步骤分配重量级执行程序。您可以使用input块之外的node步骤执行此操作,如下所示:

stage 'Build to Stage' {
  node {
      sh "echo building"
      stash 'complete-workspace'
  }
}

stage 'Promotion' {
  input 'Deploy to Production?'
}

stage 'Deploy to Production' {
  node {
    unstash 'complete-workspace'
    sh "echo deploying"
  }
}

这个 was可能是更优雅的方式,但仍然可以与timeout步骤结合使用。

编辑:正如@a​​muniz指出的那样,你必须存储/取消暂存工作空间的内容,因为可能会为两个node步骤分配不同的节点和工作空间目录。

答案 1 :(得分:30)

鉴于Jenkins管道的最新进展,最好的方法可能如下(来源:jenkins.io/blog):

使用milestonelock

  • lock步骤(来自lockable-resources插件)允许锁定某些指定资源,以便只有一个管道执行可以同时进入此阶段(您不想运行两个部署同时,不是吗?)
  • milestone步骤(来自pipeline-milestone-step插件)将中止任何旧的管道执行,如果最近的提交已达到里程碑(您不想让旧的提交在CI中挂起更长时间会覆盖新提交的部署,不是吗?)。
stage('Deploy') {
  input "Deploy?"
  milestone()
  lock('Deployment') {
    node {
      echo "Deploying"
    }
  }
}
  

Deploy阶段不限制并发,但需要手动输入   来自用户。几个构建可能会到达此步骤等待输入。   当用户提升特定构建时,所有前面的构建都将中止,   确保始终部署最新代码。

我建议您阅读the whole story,其中包含更多有用的信息。

积分转到正在维护这些插件的@amuniz

答案 2 :(得分:13)

您必须在任何节点块之外使用输入步骤,因此它不包含任何执行程序:

stage 'Build'
node('build-node') {
  sh 'call you build tool'
  stash includes: 'target/my-output-artifact.whatever', name: 'built'
}

input 'Continue to deploy stage?'

stage 'Deploy'
node('deploy-node') {
  unstash 'built'
  sh 'scp target/my-output-artifact.whatever user@deploy-server:/deploy'
}

如果您只想要一次部署,则可以锁定部署阶段:

lock ('deploy-server') {
  stage 'Deploy'
  node('deploy-node') {
    unstash 'built'
    sh 'scp target/my-output-artifact.whatever user@deploy-server:/deploy'
  }
}

请注意,此处的关键部分是stash步骤,因为您可以工件从一个节点移动到另一个节点(您可以为两个操作共享同一节点但不授予工作空间在两个节点调用之间不受影响,特别是如果等待一段时间input)。