【问题标题】:Jenkins DSL Pipeline: delete a job from its pipelineJenkins DSL Pipeline:从其管道中删除作业
【发布时间】:2019-01-16 00:48:33
【问题描述】:

我有一个 Jenkins 流水线作业(除其他外)使用 Job DSL plugin 创建另一个 pipelineJob(之后清理所有内容)。

pipeline {

    agent { label 'Deployment' }

    stages {
        stage('Clean working directory and Checkout') {
            steps {
                deleteDir()
                checkout scm
            }
        }

        // Complex logic omitted

        stage('Generate cleanup job') {
            steps {
                build job: 'cleanup-job-template',
                        parameters: [
                                string(name: 'REGION', value: "${REGION}"),
                                string(name: 'DEPLOYMENT_TYPE', value: "${DEPLOYMENT_TYPE}")
                        ]
            }
        }
    }
}

问题是我只需要构建这个新生成的作业一次,然后,如果构建成功,则应该删除该作业。

pipeline {
   stages {
        stage('Cleanup afterwards') {
            // cleanup logic
        }
   }
    post { 
        success { 
            // delete this job?
        }
    }

}

我想,这可以使用Pipeline Post Action 来完成,但不幸的是,我找不到任何开箱即用的解决方案。 有没有可能做到这一点?

【问题讨论】:

  • 你为什么需要这份额外的工作?为什么不能在同一份工作中进行清理工作?
  • @HendrikMHalkow,该作业创建了一些 AWS cloudformation 堆栈,然后对其进行测试。因此,一旦测试完成,此堆栈将被删除。清理工作就是为了这个。

标签: jenkins jenkins-pipeline jenkins-job-dsl


【解决方案1】:

您可以使用帖子 Groovy 来实现这一点,然后您需要编写一些 groovy 代码才能删除该作业:

#!/usr/bin/env groovy
import hudson.model.*
pipeline {
   agent none
   stages {
        stage('Cleanup afterwards') {
            // cleanup logic
            steps {
                node('worker') {
                    sh 'ls -la'
                }
            }
        }
   }
   post { 
       success { 
           script {
               jobsToDelete = ["<JOB_TO_DELETE"]
               deleteJob(Hudson.instance.items, jobsToDelete)
           }
       }
   }
}

def deleteJob(items, jobsToDelete) {
    items.each { item ->
      if (item.class.canonicalName != 'com.cloudbees.hudson.plugins.folder.Folder') {
        if (jobsToDelete.contains(item.fullName)) {
          manager.listener.logger.println(item.fullName)
          item.delete()
        }
      }
    }
}

测试了这两个案例并在 Jenkins 2.89.4 上工作

【讨论】:

  • 感谢您的回答。我没有得到第一部分 - 为什么我需要这个?关于第二部分 - 我基本上只需要删除当前工作(管道所在的工作),所以它可以简化,我假设。让我试试看。
  • 是的,基本上就是Hudson.instance.items.each { item -&gt; if (item.name == "${env.JOB_NAME}") { item.delete() } }
【解决方案2】:

您应该在一项工作中完成所有这些工作,而不是创建和删除工作。为此使用多个阶段,例如部署测试系统,运行测试/等待测试完成,取消部署。不需要额外的工作。此处发布的示例:Can a Jenkins pipeline have an optional input step?

【讨论】:

  • 好吧,我想我解释得很糟糕。测试是手动执行的,需要几天时间才能完成。这称为Canary release
  • 对。对于长时间运行的手动测试,您可以创建一个无代理阶段“等待测试完成”,其中包含链接示例中所示的输入步骤,询问用户测试是否成功。因此,您甚至可以将测试结果进行进一步处理。
  • 但这有点不直观。如果在此测试期间 Jenkins 需要重新启动怎么办?恕我直言,为cleanup 单独工作更清洁、更容易
  • Jenkins 2 Pipelines 正是为此而设计的。在您进行长期测试时,它们甚至可以在升级后幸存下来。
最近更新 更多