在Jenkins Job的结尾运行Groovy脚本

时间:2018-08-09 15:49:34

标签: jenkins groovy


我需要运行一个常规的Post-Build脚本进行清理,所以我安排了以下脚本:

def sout = new StringBuilder(), serr = new StringBuilder()
def proc = '/usr/bin/docker stop mysql'.execute()
proc.consumeProcessOutput(sout, serr)
proc.waitForOrKill(1000)

虽然如果我在机器上登录,命令'/ usr / bin / docker stop mysql'可以工作,但是当执行groovy脚本时,会引发以下错误:

java.io.IOException: Cannot run program "/usr/bin/docker": error=2, No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
    at java.lang.Runtime.exec(Runtime.java:620)
    at java.lang.Runtime.exec(Runtime.java:450)
    at java.lang.Runtime.exec(Runtime.java:347)
    at org.codehaus.groovy.runtime.ProcessGroovyMethods.execute(ProcessGroovyMethods.java:533)
    at org.codehaus.groovy.runtime.dgm$894.invoke(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:274)
    at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:56)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
    at org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:157)
    at org.kohsuke.groovy.sandbox.GroovyInterceptor.onMethodCall(GroovyInterceptor.java:23)
    at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onMethodCall(SandboxInterceptor.java:104)
    at org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:155)
    at org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.java:159)
    at org.kohsuke.groovy.sandbox.impl.Checker$checkedCall$0.callStatic(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallStatic(CallSiteArray.java:56)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:194)
    at Script1.run(Script1.groovy:2)

您知道为什么groovy引擎无法找到'docker'命令吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

Groovy Postbuild插件实际上在 master 上运行,而不是在构建节点上运行。该文档指出:

  

此插件在Jenkins JVM中执行groovy脚本

大概是要传达“而不是在代理JVM中”。 (有趣的一面:如果您在Groovy脚本中使用println,它将打印到Jenkins主日志,而不是作业的控制台日志中)

Post build task插件确实在构建节点上运行(并且您无需将shell命令包装在常规的脚本中)。该任务需要一个条件:要“始终运行”脚本,只需将日志文本留空。

您还可以考虑查看Jenkins Pipeline,它使您可以尝试使用try / catch类型的逻辑,并使用Jenkinsfile来将管道“作为代码”维护。