从另一个作业禁用Jenkins作业

uqjltbpv  于 2022-10-06  发布在  Jenkins
关注(0)|答案(7)|浏览(206)

在Jenkins(哈德逊),有没有办法禁止一项工作从另一项工作中进行?

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

理想情况下,作业上应该有一些额外的构建步骤来说明“禁用XYZ作业”。或者,如果有一种方法可以通过蚂蚁或其他方式告诉Jenkins禁用一项工作,那也是可行的。

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

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

zlhcx6iw

zlhcx6iw1#

您可以将Groovy脚本作为构建前步骤执行。在我的公司里,我已经这样做过几次了。您必须安装Groovy plugin。然后,您可以添加一个构建前步骤“执行系统groovy脚本”,在那里您可以执行类似的操作:

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

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

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

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

您可以使用Groovy脚本进行更多思考。关于它的更多信息值得一读。

7dl7o3gd

7dl7o3gd2#

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

java -jar C:myjenkinspathjenkins-cli.jar -s %JENKINS_URL% disable-job "Job 1"

我还没有研究如何找到Jenkins,但这应该不会太难。

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

azpvetkf

azpvetkf3#

我们已经使用Port Allocator Plugin完成了这项工作。它允许您的作业在其运行期间“抢占”一个TCP端口,这意味着在此期间没有其他作业可以抢占该端口,从而有效地阻止试图获取相同端口的两个作业的并行执行。

还有Locks and Latches Plugin,听起来很完美,但我们发现它很难使用,而且似乎不再维护了。

问题澄清后更新:

您可以使用Jenkins的HTTP API远程启用/禁用作业。如果您浏览到任何作业,然后将api放在URL的末尾,您将看到有关执行此操作所需的HTTP请求的说明。例如:http://ci.jruby.org/job/activerecord-jdbc-master/api(查看该页面的末尾-基本上是发布到<job_url>/disable)。

在作业中使用构建步骤调用cURL或类似的适当请求数据应该是一件很简单的事情。

8aqjt8rx

8aqjt8rx4#

我遇到了同样的问题,并使用dunni's Answer解决了它,我需要指出的是,只有当我选择“执行系统Groovy脚本”作为构建步骤时,它才能起作用,如果我选择“执行Groovy脚本”,它会给出Arun Sangal报告的错误:“Catch:groovy.lang.MissingPropertyException:No That Property:Jenkins for class:hudson8158411085491171644”。

我的Groovy代码如下所示:

import jenkins.*
import jenkins.model.*

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

wmvff8tz5#

可以使用JOB DSL插件来完成此操作,而无需指定凭据。

要使用的DSL脚本为:

job("jobname"){
    using("jobname")
    disabled(true)
}

1.这是针对自由式工作的。例如,如果需要禁用管道作业,请使用pipelineJob而不是job
1.通常情况下,"jobname"需要包含文件夹,使用Jenkins根作为引用。
1.要重新启用作业,请使用disabled(false)

vc9ivgsu

vc9ivgsu6#

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

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

相关问题