从另一个作业禁用 Jenkins 作业

问题描述 投票:0回答:9

Jenkins (Hudson) 有没有办法从另一个工作中禁用一个工作?

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

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

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

  1. 运行作业 A,禁用作业 1
  2. 根据作业 A 的输出在 Jenkins 之外做一些事情
  3. 运行作业 B,这会再次启用作业 1
jenkins
9个回答
28
投票

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

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

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

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

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

您可以使用 Groovy 脚本进行更多思考。值得阅读更多相关内容。


7
投票

我找到了一种使用 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 了解一些可用的命令。


4
投票

我们使用端口分配器插件来执行此操作。 它可以让您的作业在运行期间“抢占”一个 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
投票

我遇到了同样的问题,并使用 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())
}

2
投票

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

要使用的 DSL 脚本是:

job("jobname"){
    using("jobname")
    disabled(true)
}
  1. 这适用于自由式作业。例如,如果您需要禁用管道作业,请使用
    pipelineJob
    而不是
    job
  2. 通常,
    "jobname"
    需要包含文件夹,使用 Jenkins 根目录作为参考。
  3. 要重新启用作业,请使用
    disabled(false)

2
投票

Jenkins 的最新版本(2 及以上)更改了方法名称。
只需将

disable()
替换为
setDisabled(boolean)

发现这对我有用:

Jenkins.instance.getItem("jobname").setDisabled(false)


0
投票

0
投票

这就是 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()

https://javadoc.jenkins-ci.org/jenkins/model/Jenkins.html#getItemByFullName(java.lang.String,java.lang.Class)

通过全名获取 Item 对象。全名就像路径名,每个 Item 的名称都由 '/' 组合而成。

退货: 如果给定全名下不存在此类项目,或者它存在但 它不是给定类型的实例。

投掷: org.springframework.security.access.AccessDeniedException - 根据 ItemGroup.getItem(java.lang.String)


0
投票

这是简化的方式,无需安装任何东西。但需要脚本审批

stage('Disable job remotely') {
    steps {
        script {
            Jenkins.instance.getItem("jobname").setDisabled(true)
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.