【问题标题】:groovy execute intermittently returns no output nor errorgroovy 执行间歇性地不返回输出也不返回错误
【发布时间】:2016-02-03 10:36:30
【问题描述】:

我正在尝试使用 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 10d94325c8fc1050f3e362d2fbb9f9041e6b9360 中我的 origin/master 分支的当前 SHA,并且代码断言就是这种情况。

大多数时候,这段代码完全按照预期运行,但有时我看不到任何原因,输出为空白:

 > 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)

基于零退出代码,我假设命令已经正常执行,但我不明白为什么没有收到输出。我认为这可能是因为我不明白 waitFor 应该如何工作,但我尝试将 proc.waitFor() 线放在函数的各个点上,没有任何区别。

运行一个类似的脚本来验证"pwd".execute().text.trim().equals("/") 似乎总是正确返回。

有什么想法吗?

【问题讨论】:

  • 如果您将new StringBuffer() 位更改为new StringWriter(),您会遇到同样的问题吗?
  • 我刚试过,它似乎做同样的事情。
  • 如果你写一个循环脚本直接运行git show-ref origin/master --hash(不运行脚本),是否有时会丢失输出?
  • 没有。我曾尝试过,但忽略了在问题中提及这一点。 while [ $(git show-ref master --hash) == "10d94325c8fc1050f3e362d2fbb9f9041e6b9360" ] ; do sleep 1 ; echo "kay" ; done 似乎永远运行没有任何问题。
  • 你能试试def gitcmd = ['/bin/bash', '-c', "git show-ref $branch --hash"]看看是不是shell问题吗?

标签: jenkins groovy


【解决方案1】:

我找到了一种可行的方法。 waitForProcessOutput 方法不会一个接一个地调用 waitForconsumeProcessOutput(以任何顺序),而是将 shell 输出可靠地传递到我的 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.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");

这段代码会给我我想要的。我不明白为什么 waitForconsumeProcessOutput 的组合不会做同样的事情。

【讨论】:

  • 这适用于 Groovy 2.5.2。我在 500+ mp3 文件上使用mp3info 命令,有时使用consumeProcessOutput(sout, serr) / waitFor() 没有输出更改为waitForProcessOutput(sout, serr) 后,它每次都在工作。
猜你喜欢
  • 2014-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多