代码之家  ›  专栏  ›  技术社区  ›  Carla

在Jenkins作业结束时运行groovy脚本

  •  0
  • Carla  · 技术社区  · 7 年前


    我需要运行一个groovy后期构建脚本来进行一些清理,因此我已经安排了以下脚本:

    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 回复  |  直到 7 年前
        1
  •  1
  •   bto    7 年前

    这个 Groovy Postbuild 插件实际上运行在 主人 ,不在生成节点上。文件规定:

    这个插件在Jenkins JVM中执行groovy脚本

    这大概是为了传达“而不是在代理JVM中”。(有趣的一点是:如果你使用 println 在Groovy脚本中,它输出到Jenkins主日志,而不是作业的控制台日志)

    这个 Post build task 插件 在构建节点上运行(不需要将shell命令包装在groovy脚本中)。该任务需要一个条件:若要“始终运行”脚本,只需将 日志文本 空白。

    你也可以考虑看看 Jenkins Pipeline ,它允许您烘焙try/catch类型逻辑,并使用 Jenkinsfile .