如何在Jenkins工作流中重复一个阶段

时间:2015-10-02 03:16:35

标签: groovy jenkins cloudbees continuous-deployment jenkins-workflow

我试图在Cloudbees上使用Jenkins来自动部署我的软件。我将我的工作流程设置如下。

Jenkins Workflow

有时我可能需要重新部署。 (假设该阶段采用手动输入参数)。我如何在工作流程中这样做?这是我的Groovy脚本。

def src = 'https://git.repo.url/proj.git'

stage 'Build'
node {
    env.JAVA_HOME="${tool name: 'Pre-Installed OpenJDK 8 (Latest) on DEV@Cloud nodes', type: 'hudson.model.JDK'}"
    sh 'javac -version'
    git credentialsId: 'abcdef', url: src
    sh 'ant -f build.xml proj.jar report'
}

stage 'Generate Release Version'
input message: 'Create Tar and Push to S3', ok: 'Generate Release'
node {
    // TODO
}

stage 'QA Approved'
input message: 'Enter a Tag Name to approve this build and tag in GIT', ok: 'Approve and Tag', parameters: [[$class: 'StringParameterDefinition', defaultValue: '', description: 'Eg: Sprint73', name: 'TAG_NAME']]
node {
    // TODO
}

stage 'DevOps - Ansible'
input message: 'Release to Production', ok: 'Release'
node {
    // TODO
}

我尝试使用构建管道而不是工作流来使用作业链,以便我可以重复阶段,但这是另一个有太多工作的故事。

2 个答案:

答案 0 :(得分:4)

这仅适用于Jenkins的企业版。正如@ jesse-glick指出的那样,你可以使用Checkpoint插件,请参阅documentation

根据CloudBees,目前还没有计划在OSS版本中支持此功能。请参阅此问题:JENKINS-33846

答案 1 :(得分:3)

假设它是您希望能够重新启动的最后一个(Ansible)阶段,您可以在它之前放置checkpoint

checkpoint 'about to deploy'
stage 'DevOps - Ansible'
input message: 'Release to Production', ok: 'Release'
node {
    // TODO
}

如果要部署到可选目标,可以使用input

checkpoint 'about to deploy'
stage 'DevOps - Ansible'
def target = input message: 'Where to release?',
    parameters: [[$class: 'StringParameterDefinition', name: 'target']]
node {
    // TODO
}

更复杂的情况是您希望第一次总是部署到标准目标,但是当从检查点恢复时,您想要询问用户备用目标。为此,您需要知道何时恢复。目前checkpoint不直接提供此信息(CloudBees内部问题跟踪器中的CJP-1620),但有一种解决方法:

def origBuildNumber = env.BUILD_NUMBER
checkpoint 'about to deploy'
stage 'DevOps - Ansible'
def target
if (origBuildNumber == env.BUILD_NUMBER) { // original
    target = 'production'
} else { // resumed
    target = input message: 'Where to release?',
        parameters: [[$class: 'StringParameterDefinition', name: 'target']]
}
node {
    // TODO
}