我正在尝试使用 Groovy 脚本(与 jenkins-cli.jar 一起运行)来验证一些 git 信息。
为此,我有以下简单的常规脚本:
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");
Run Code Online (Sandbox Code Playgroud)
我希望这能够构建一个命令行git show-ref origin/master --hash并在我的 git 存储库的工作目录中执行它。我希望它的输出是此存储库中我的 origin/master 分支的当前 SHA10d94325c8fc1050f3e362d2fbb9f9041e6b9360,并且代码断言情况确实如此。
大多数时候,这段代码完全按照预期运行,但有时我看不到任何原因,输出是空白的:
> 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)
Run Code Online (Sandbox Code Playgroud)
基于零退出代码,我假设该命令已正常执行,但我不明白为什么尚未收到输出。我认为这可能是因为我不明白waitFor应该如何工作,但我尝试将这条proc.waitFor()线放置在函数的各个点上,没有任何区别。
运行类似的脚本来验证似乎"pwd".execute().text.trim().equals("/")总是正确返回。
有任何想法吗?
我找到了一种有效的方法。该方法不会将 shell 输出可靠地传递到我的 groovy 脚本,而不是一个接一个地调用waitFor(consumeProcessOutput以任何顺序) 。waitForProcessOutput
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");
Run Code Online (Sandbox Code Playgroud)
这段代码会给我我想要的。waitFor我不明白为什么和的组合consumeProcessOutput不会做同样的事情。
| 归档时间: |
|
| 查看次数: |
3097 次 |
| 最近记录: |