Jenkins (Hudson) 有没有办法从另一个工作中禁用一个工作?
基本上我们有一个执行标准构建/测试的构建环境。我们还使用相同的 Jenkins 实例来执行其他一些操作,例如自动安装我们产品的新版本(这是某些自动化测试所需要的)。 当我们运行一些“额外”作业时,我们希望暂时禁用“标准”作业(然后稍后自动启用它们)。
理想情况下,作业上会有一些额外的构建步骤来表示“禁用 XYZ 作业”。 或者,如果有办法通过 ANT 或其他方式告诉 Jenkins 禁用某个作业,那也可以。
更新: 看起来有几个插件可以防止两个作业同时运行,但我真的需要:
您可以执行 Groovy 脚本作为预构建步骤。我在我的公司已经做过几次这样的事了。您必须安装Groovy 插件。然后您可以添加预构建步骤“执行系统 groovy 脚本”,然后您可以执行类似的操作:
Jenkins.instance.getItem("jobname").disable()
要在构建后启用作业,请添加构建后步骤并执行
Jenkins.instance.getItem("jobname").enable()
如果您想要一个仅启用或禁用其他构建作业的作业,那么您不需要选择构建前或构建后步骤,而是选择使用系统 Groovy 脚本的正常构建步骤。
您可以使用 Groovy 脚本进行更多思考。值得阅读更多相关内容。
我找到了一种使用 jenkins-cli(命令行界面)的可能方法。我添加了这个构建步骤(对我来说这是一个 Windows 批处理命令,尽管我可能会将其设为脚本或更优雅的东西):
java -jar C:\my\jenkins\path\jenkins-cli.jar -s %JENKINS_URL% disable-job "Job 1"
我还没有研究如何获得詹金斯的路径,但这应该不会太难。
这里有一些有关 CLI 的信息。您还可以访问 http://your-jenkins:8080/cli 了解一些可用的命令。
我们使用端口分配器插件来执行此操作。 它可以让您的作业在运行期间“抢占”一个 TCP 端口,这意味着在此期间没有其他作业可以抢占该端口,从而有效地阻止试图获取同一端口的两个作业的并行执行。
还有Locks and Latches Plugin,听起来很完美,但我们发现它很难使用,而且似乎不再维护了。
问题澄清后更新:
您可以使用 Jenkins 的 HTTP API 远程启用/禁用作业。 如果您浏览到任何作业,然后将
api
放在 URL 末尾,您将看到有关为此需要发出的 HTTP 请求的说明。 例如:http://ci.jruby.org/job/activerecord-jdbc-master/api(查看该页面的末尾 - 基本上是 POST 到 <job_url>/disable
)。
在作业中使用构建步骤来调用curl或类似的方法以及适当的请求数据应该是一件简单的事情。
我遇到了同样的问题,并使用 dunni's 答案解决了它,我需要指出,只有当我选择“执行系统 Groovy 脚本”作为构建步骤时,它才有效,如果我选择“执行 Groovy 脚本”,它会给出Arun Sangal报告的错误:“捕获:groovy.lang.MissingPropertyException:没有这样的属性:Jenkins类:hudson8158411085491171644”。
我的 Groovy 代码如下所示:
import jenkins.*
import jenkins.model.*
try {
Jenkins.instance.getItem("jobname").disable()
} catch (Exception ex) {
printf("Error disabling jobname. " + ex.getMessage())
}
可以使用 Job DSL Plugin 来执行此操作,无需指定凭据。
要使用的 DSL 脚本是:
job("jobname"){
using("jobname")
disabled(true)
}
pipelineJob
而不是 job
。"jobname"
需要包含文件夹,使用 Jenkins 根目录作为参考。disabled(false)
。Jenkins 的最新版本(2 及以上)更改了方法名称。
只需将
disable()
替换为 setDisabled(boolean)
发现这对我有用:
Jenkins.instance.getItem("jobname").setDisabled(false)
这就是 Jenkins 2.235.5 对我有用的方法。 我想禁用当前正在运行的作业。
运行
Execute system Groovy script
:
import jenkins.model.Jenkins
def build = this.getProperty('binding').getVariable('build')
def listener = this.getProperty('binding').getVariable('listener')
def env = build.getEnvironment(listener)
String jobNameEnv = env.JOB_NAME
println("jobNameEnv: ${jobNameEnv}")
Jenkins.instance.getItemByFullName(jobNameEnv).disable()
通过全名获取 Item 对象。全名就像路径名,每个 Item 的名称都由 '/' 组合而成。
退货: 如果给定全名下不存在此类项目,或者它存在但 它不是给定类型的实例。
投掷: org.springframework.security.access.AccessDeniedException - 根据 ItemGroup.getItem(java.lang.String)
这是简化的方式,无需安装任何东西。但需要脚本审批
stage('Disable job remotely') {
steps {
script {
Jenkins.instance.getItem("jobname").setDisabled(true)
}
}
}