Jenkins groovy execute间歇性地不返回输出或错误

Jenkins groovy execute间歇性地不返回输出或错误,jenkins,groovy,Jenkins,Groovy,我试图使用Groovy脚本(与jenkins cli.jar一起运行)来验证一些git信息 为此,我有以下简单的groovy脚本: def getBranchSha = { branch -> def wd = new File('/my/git/repo'); def sout = new StringBuffer(), serr = new StringBuffer(); def gitcmd = 'git show-ref ' + branch + ' --hash';

我试图使用Groovy脚本(与jenkins cli.jar一起运行)来验证一些git信息

为此,我有以下简单的groovy脚本:

def getBranchSha = { branch ->
  def wd = new File('/my/git/repo');
  def sout = new StringBuffer(), serr = new StringBuffer();
  def gitcmd = 'git show-ref ' + branch + ' --hash';
  def proc = gitcmd.execute(null, wd);
  proc.consumeProcessOutput(sout, serr);
  proc.waitFor();

  def sha = sout.toString().trim();
  out.println("exitCode: " + proc.exitValue() + "\terror: " + serr.toString());
  out.println("input: " + branch + "\toutput: \"" + sha + "\"");
  assert sha.equals("10d94325c8fc1050f3e362d2fbb9f9041e6b9360");
}

getBranchSha("origin/master");
我希望它能构造一个命令行
git show ref origin/master--hash
,并在git repo的工作目录中执行它。我希望此报告的输出是我的原始/主分支机构在本报告中的当前SHA
10d94325c8fc1050f3e362d2fbb9f9041e6b9360
,代码断言情况就是这样

大多数情况下,此代码完全按照预期运行,但有时由于我看不到任何原因,输出为空:

 > while [ $? -eq 0 ] ; do java -jar jenkins-cli.jar -s http://localhost:8080 groovy tst.groovy ; done
exitCode: 0     error:
input: origin/master    output: "10d94325c8fc1050f3e362d2fbb9f9041e6b9360"
exitCode: 0     error:
input: origin/master    output: "10d94325c8fc1050f3e362d2fbb9f9041e6b9360"

...

exitCode: 0     error:
input: origin/master    output: "10d94325c8fc1050f3e362d2fbb9f9041e6b9360"
exitCode: 0     error:
input: origin/master    output: ""
java.lang.SecurityException: Rejected: org.codehaus.groovy.runtime.powerassert.PowerAssertionError
        at hudson.remoting.ClassFilter.check(ClassFilter.java:20)
        at hudson.remoting.MultiClassLoaderSerializer$Input.resolveClass(MultiClassLoaderSerializer.java:111)
        at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1612)
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1517)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
        at hudson.remoting.UserRequest.deserialize(UserRequest.java:184)
        at hudson.remoting.UserResponse.retrieve(UserRequest.java:217)
        at hudson.remoting.Channel.call(Channel.java:781)
        at hudson.remoting.RemoteInvocationHandler.invoke(RemoteInvocationHandler.java:250)
        at com.sun.proxy.$Proxy3.main(Unknown Source)
        at hudson.cli.CLI.execute(CLI.java:338)
        at hudson.cli.CLI._main(CLI.java:509)
        at hudson.cli.CLI.main(CLI.java:390)
基于zero exit代码,我假设命令已经正常执行,但我不理解为什么没有收到输出。我认为这可能是因为我不明白
waitFor
应该如何工作,但我已经尝试将
proc.waitFor()
行放置在函数中的各个点上,没有任何区别

运行类似的脚本以验证
“pwd”.execute().text.trim().equals(“/”)
似乎总是正确返回


有什么想法吗?

我找到了一种可行的方法。方法
waitForProcessOutput
将可靠地将shell输出传递给我的groovy脚本,而不是逐个调用
waitFor
ConsumerProcessOutput

def getBranchSha = { branch ->
  def wd = new File('/my/git/repo');
  def sout = new StringBuffer(), serr = new StringBuffer();
  def gitcmd = 'git show-ref ' + branch + ' --hash';
  def proc = gitcmd.execute(null, wd);
  proc.waitForProcessOutput(sout, serr);

  def sha = sout.toString().trim();
  out.println("exitCode: " + proc.exitValue() + "\terror: " + serr.toString());
  out.println("input: " + branch + "\toutput: \"" + sha + "\"");
  assert sha.equals("10d94325c8fc1050f3e362d2fbb9f9041e6b9360");
}

getBranchSha("origin/master");

这个密码会给我想要的。我不明白为什么
waitFor
consumeProcessOutput
的组合不能做同样的事情。

如果您将
new StringBuffer()
位更改为
new StringWriter()
,您会遇到同样的问题吗?我刚刚尝试过,它似乎也做了同样的事情。如果您编写一个循环脚本,直接运行
git show ref origin/master--hash
(不运行脚本),它有时会丢失输出吗?没有。我已经尝试过了,但在问题中忽略了这一点<代码>而[$(git show ref master--hash)=“10d94325c8fc1050f3e362d2fbb9f9041e6b9360”;做睡眠1;呼应“凯”;done似乎永远运行,没有任何问题。您可以尝试
def gitcmd=['/bin/bash','-c',“git show ref$branch--hash”]
看看这是否是一个shell问题吗?这在Groovy
2.5.2
中对我很有效。我正在对500多个mp3文件使用
mp3info
命令,有时在更改为
waitForProcessOutput(sout,serr)/waitFor()后,使用
ConsumerProcessOutput(sout,serr)/waitFor()时没有输出。
它每次都在工作。