使用Groovy脚本插件从Jenkins运行Groovy命令

15

我想在Jenkins中强制实现以下情况:

  1. 我有工作A和工作B
  2. 当执行工作B时,我希望禁用工作A,并在工作B执行后再次启用工作A。

为了启用/禁用工作A,我使用了Groovy插件:Groovy插件

Groovy插件提供两种可能性:执行Groovy脚本执行系统Groovy脚本

我在执行工作B的开头添加了以下代码片段:

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

执行作业B后:

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

使用执行 Groovy 脚本

当我运行作业 B 时,它失败并抛出以下异常:

Caught: groovy.lang.MissingPropertyException: No such property: Jenkins for class: hudson7198966217090520732
    at hudson7198966217090520732.run(hudson7198966217090520732.groovy:1)

使用Execute system Groovy script

当我运行作业B时,它失败并显示以下异常:

FATAL: No such property: Jenkins for class: Script1
groovy.lang.MissingPropertyException: No such property: Jenkins for class: Script1
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:50)
    at org.codehaus.groovy.runtime.callsite.PogoGetPropertySite.getProperty(PogoGetPropertySite.java:49)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java:231)
    at Script1.run(Script1.groovy:1)
    at groovy.lang.GroovyShell.evaluate(GroovyShell.java:682)
    at groovy.lang.GroovyShell.evaluate(GroovyShell.java:666)
    at hudson.plugins.groovy.SystemGroovy.perform(SystemGroovy.java:80)
    at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:19)
    at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:804)
    at hudson.model.Build$BuildExecution.build(Build.java:199)
    at hudson.model.Build$BuildExecution.doRun(Build.java:160)
    at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:586)
    at hudson.model.Run.execute(Run.java:1576)
    at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:46)
    at hudson.model.ResourceController.execute(ResourceController.java:88)
    at hudson.model.Executor.run(Executor.java:241)

有什么想法可能是问题所在吗? 此外,当从Jenkins脚本控制台运行此代码片段时,它可以正常工作,没有任何问题。 提前致谢。


21
你在脚本顶部导入了 import jenkins.model.Jenkins 吗? - tim_yates
1
它与使用“执行系统Groovy脚本”选项的组合一起工作。 不确定为什么在使用“执行Groovy脚本”选项时无法识别此导入,但之前的选项对我有效。 感谢您的理解。谢谢。 - Bakir Jusufbegovic
系统 Groovy 命令在 Jenkins 主 JVM 上运行,非系统 Groovy 命令在节点/代理上以分叉的 JVM 运行。非系统 Groovy 命令无法访问 Jenkins 或任何内部对象。这就是为什么除非它是系统 Groovy 命令,否则它不起作用的原因。 - Brandon
4个回答

40

针对未来读者,Tim在上面的评论中给出了解决方案:

import jenkins.model.Jenkins


我来这里是为了寻找关于Jenkins DSL插件的信息。这个答案也解决了我的问题。 - Amedee Van Gasse

6

我遇到了和@iloveretards评论中提到的相同问题“无法解决类jenkins.model.Jenkins”,直到我意识到我尝试使用构建步骤“执行Groovy脚本”。在切换到构建步骤“执行系统Groovy脚本”后,此问题实际上得到了解决:

import jenkins.model.Jenkins
Jenkins.instance.getItem("job-name").disable()

1
哇,我找了太久了才找到这个。你真是太棒了! - barna10

3

我认为如果您运行系统Groovy脚本,Jenkins对象默认可用。 您正在运行的是Groovy脚本。因此,需要导入包/类。


0

对我来说,上述提供的解决方案并没有起作用,但我尝试了以下方法,它可以正常工作 :)

import jenkins.*
import jenkins.model.*
Jenkins.instance.getItemByFullName('folder/Sub_Folder/jobName').setDisabled(false)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接