从另一个作业禁用Jenkins作业

时间:2011-12-28 21:09:31

标签: jenkins

詹金斯(哈德森)是否有办法禁止其他工作的工作?

基本上我们有一个构建环境,可以进行标准构建/测试。我们还使用相同的Jenkins实例来执行其他一些操作,例如自动安装我们产品的新版本(这是某些自动化测试所需的)。当我们运行一些“额外”作业时,我们想暂时禁用“标准”作业(然后在以后自动启用它们)。

理想情况下,在作业上会有一些额外的构建步骤来说“禁用XYZ作业”。或者,如果有通过ANT的方法或者告诉Jenkins禁用某个工作,那也可以。

更新 看起来有几个插件会阻止两个作业同时运行,但我真的需要:

  1. 运行作业A,禁用作业1
  2. 根据工作A的输出,在Jenkins之外做一些事情。
  3. 再次启用作业1的作业B

7 个答案:

答案 0 :(得分:25)

您可以执行Groovy脚本作为预构建步骤。我在公司做过几次这样的事。您必须安装Groovy plugin。然后你可以添加一个预构建步骤“Execute system groovy script”,你可以在那里执行类似的东西:

Jenkins.instance.getItem("jobname").disable()

在构建之后启用作业,添加后期构建步骤并执行

Jenkins.instance.getItem("jobname").enable()

如果您想要一个只启用或禁用其他构建作业的作业,那么您不会选择构建前或构建后的步骤,而是选择使用系统Groovy脚本的正常构建步骤。

你可以用Groovy脚本做更多的思考。值得仔细阅读。

答案 1 :(得分:7)

我找到了一种使用jenkins-cli(命令行界面)的方法。我添加了这个构建步骤(对我来说这是一个Windows批处理命令,虽然我可能会使它成为一个脚本或更优雅的东西):

java -jar C:\my\jenkins\path\jenkins-cli.jar -s %JENKINS_URL% disable-job "Job 1"

我没有研究如何获得Jenkins的路径,但这不应该太难。

这是一些information on the CLI。您也可以转到http://your-jenkins:8080/cli获取一些可用的命令。

答案 2 :(得分:4)

我们已经使用Port Allocator Plugin来执行此操作。它允许您的作业在其运行期间“抓取”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或类似的适当的请求数据应该是一件简单的事情。

答案 3 :(得分:3)

我遇到了同样的问题并使用dunni's回答解决了这个问题,我需要指出的是,只有当我选择&#34;执行系统Groovy脚本&#34;作为我的构建步骤,如果我选择&#34;执行Groovy脚本&#34;,它会给出Arun Sangal报告的错误:&#34;捕获:groovy.lang.MissingPropertyException:没有这样的属性:Jenkins用于类:hudson8158411085491171644&#34;。

我的Groovy代码如下所示:

import jenkins.*
import jenkins.model.*

try {
   Jenkins.instance.getItem("jobname").disable()
} catch (Exception ex) {
   printf("Error disabling jobname. " + ex.getMessage())
}

答案 4 :(得分:0)

答案 5 :(得分:0)

可以使用Job DSL Plugin执行此操作,而无需指定凭据。

要使用的DSL脚本是:

job("jobname"){
    using("jobname")
    disabled(true)
}
  1. 这适用于Freestyle的工作。如果您需要禁用(例如,管道作业),请使用pipelineJob代替job
  2. 通常,"jobname"需要包含文件夹,使用Jenkins根作为参考。
  3. 要重新启用作业,请使用disabled(false)

答案 6 :(得分:0)

Jenkins的最新版本(2及更高版本)更改方法名称。
只需将disable()替换为setDisabled(boolean)

发现这对我有用:
Jenkins.instance.getItem("jobname").setDisabled(false)