我需要运行一个常规的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'命令吗? 谢谢!
答案 0 :(得分:1)
Groovy Postbuild插件实际上在 master 上运行,而不是在构建节点上运行。该文档指出:
此插件在Jenkins JVM中执行groovy脚本
大概是要传达“而不是在代理JVM中”。 (有趣的一面:如果您在Groovy脚本中使用println
,它将打印到Jenkins主日志,而不是作业的控制台日志中)
Post build task插件确实在构建节点上运行(并且您无需将shell命令包装在常规的脚本中)。该任务需要一个条件:要“始终运行”脚本,只需将日志文本留空。
您还可以考虑查看Jenkins Pipeline,它使您可以尝试使用try / catch类型的逻辑,并使用Jenkinsfile
来将管道“作为代码”维护。