Jenkins DSL 管道:从其管道中删除作业
Jenkins DSL Pipeline: delete a job from its pipeline
我有一个 Jenkins 管道作业,它(除其他外)使用 Job DSL plugin 创建另一个管道作业(之后清理所有内容)。
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 来完成,但不幸的是,我找不到任何开箱即用的解决方案。
是否有可能实现这一目标?
您可以使用 post 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 上工作
您应该在一个作业中完成所有这些工作,而不是创建和删除作业。为此使用多个阶段,例如部署测试系统,运行 测试/等待测试完成,取消部署。不需要额外的工作。此处发布的示例:
我有一个 Jenkins 管道作业,它(除其他外)使用 Job DSL plugin 创建另一个管道作业(之后清理所有内容)。
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 来完成,但不幸的是,我找不到任何开箱即用的解决方案。 是否有可能实现这一目标?
您可以使用 post 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 上工作
您应该在一个作业中完成所有这些工作,而不是创建和删除作业。为此使用多个阶段,例如部署测试系统,运行 测试/等待测试完成,取消部署。不需要额外的工作。此处发布的示例: