groovy – 输出我的Job正在运行的Jenkins作业的控制台文本
我试着寻找
here和
here和
here.
我正在使用dsl流程.而且我希望能够看到控制台日志打印出我正在运行的工作中正在构建的工作.我试着四处寻找例子,我似乎无法找到我想要的东西.如果这个问题没有使用正确的术语,或者以不同的方式询问,我道歉.我只是想找到如何做到这一点的答案. A = build("Main Suites",SUITE: "qa_smoketests",OS: "mac") 下面我尝试这样做但它似乎没有用 OUTPUT = A.build.doConsoleText() out.println(OUTPUT) 更新: 我尝试了第二种方法来动态更新它,我不断收到网址的问题?奇怪的是,如果我点击错误中的url链接,它会将我带到相应的页面.我确实需要修改事情b / c作业名称中有空格.我还编辑了这篇文章的错误日志来说MYHOSTURL而不是我真正的Jenkins主机网址. ERROR: Failed to run DSL Script java.util.concurrent.ExecutionException: org.codehaus.groovy.runtime.InvokerInvocationException: java.io.IOException: Server returned HTTP response code: 401 for URL: http://MYHOSTURL/job/Main%20Suites/159/consoleText at java.util.concurrent.FutureTask.report(FutureTask.java:122) at java.util.concurrent.FutureTask.get(FutureTask.java:188) at java_util_concurrent_Future$get$7.call(Unknown Source) at com.cloudbees.plugins.flow.FlowDelegate$_parallel_closure6.doCall(FlowDSL.groovy:440) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233) at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:903) at groovy.lang.Closure.call(Closure.java:415) at groovy.lang.Closure.call(Closure.java:428) at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:1379) at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:1351) at org.codehaus.groovy.runtime.dgm$170.invoke(Unknown Source) at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:271) at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:53) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116) at com.cloudbees.plugins.flow.FlowDelegate.parallel(FlowDSL.groovy:438) at sun.reflect.GeneratedMethodAccessor10240.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1079) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:903) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:723) at com.cloudbees.plugins.flow.FlowDelegate.invokeMethod(FlowDSL.groovy) at hudson.util.spring.ClosureScript.invokeMethod(ClosureScript.java:83) at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:72) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:46) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:145) at Script1.run(Script1.groovy:12) at Script1$run.call(Unknown Source) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:42) at Script1$run.call(Unknown Source) at com.cloudbees.plugins.flow.FlowDSL.executeFlowScript(FlowDSL.groovy:84) at com.cloudbees.plugins.flow.FlowRun$FlyweightTaskRunnerImpl.run(FlowRun.java:219) at hudson.model.Run.execute(Run.java:1759) at com.cloudbees.plugins.flow.FlowRun.run(FlowRun.java:155) at hudson.model.ResourceController.execute(ResourceController.java:89) at hudson.model.Executor.run(Executor.java:240) at hudson.model.OneOffExecutor.run(OneOffExecutor.java:43) Caused by: org.codehaus.groovy.runtime.InvokerInvocationException: java.io.IOException: Server returned HTTP response code: 401 for URL: http://MYHOSTURL/job/Main%20Suites/159/consoleText at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:97) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233) at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:903) at groovy.lang.Closure.call(Closure.java:415) at groovy.lang.Closure.call(Closure.java:409) at java.util.concurrent.FutureTask.run(FutureTask.java:262) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745) Caused by: java.io.IOException: Server returned HTTP response code: 401 for URL: http://MYHOSTURL/job/Main%20Suites/159/consoleText at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1627) at sun.net.www.protocol.http.HttpURLConnection$getInputStream.call(Unknown Source) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:42) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:112) at Script1.responseFrom(Script1.groovy:82) at Script1$responseFrom.callCurrent(Unknown Source) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:46) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:141) at Script1.printConsoleOutputTextChunksFrom(Script1.groovy:62) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233) at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:361) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:903) at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:66) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:46) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:149) at Script1$_run_closure2.doCall(Script1.groovy:20) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233) at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:903) at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:66) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:46) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:141) at Script1$_run_closure2.doCall(Script1.groovy) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233) at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:903) at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:39) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:42) at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:54) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:112) at com.cloudbees.plugins.flow.FlowDelegate$_parallel_closure5_closure7.doCall(FlowDSL.groovy:427) at sun.reflect.GeneratedMethodAccessor8673.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233) at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:903) at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:66) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:141) at com.cloudbees.plugins.flow.FlowDelegate$_parallel_closure5_closure7.doCall(FlowDSL.groovy) at sun.reflect.GeneratedMethodAccessor8672.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90) ... 9 more } Finished: FAILURE 更新2: 所以我能够通过修改responseFrom函数来处理需要身份验证的页面来获得第一个方法. InputStream responseFrom(String url) { // See Using java.net.URLConnection to fire and handle HTTP requests // https://stackoverflow.com/a/2793153/1744774 URL myURL = new URL(url); HttpURLConnection connection = (HttpURLConnection)myURL.openConnection(); String userCredentials = "username:password"; String encoding = new sun.misc.BASE64Encoder().encode(userCredentials.getBytes()); String basicAuth = "Basic " + encoding; connection.setRequestProperty("Authorization",basicAuth); connection.setRequestProperty("Accept-Charset",StandardCharsets.UTF_8.name()); return connection.getInputStream(); } 但是我仍然遇到让第二种方法起作用的问题.我想这是用于从下游作业获取内部版本号的函数.
解决方法
有趣的问题.我无法理解这一点.
>您的第一个链接描述了您应该如何做到:通过“重复GET请求”. 我将尝试第一个,然后相应地更新这个答案. 更新1 下游构建完成后,以下内容将更新上游的日志. // From: Output the console text of a Jenkins job that my Job is running // https://stackoverflow.com/a/31573477/1744774 final String JENKINS_HOST = 'http://<your Jenkins host>' final String DOWNSTREAM_NAME = '<your downstream job's name>' final String SEPARATOR = new String(new char[8]).replace(' ','-') final int DOWNSTREAM_BUILD_NO = build(DOWNSTREAM_NAME).getBuild().getNumber() println("${SEPARATOR} Begin console HTML output of ${DOWNSTREAM_NAME} #${DOWNSTREAM_BUILD_NO} ${SEPARATOR}") printConsoleOutputHtmlFrom( "${JENKINS_HOST}/job/${DOWNSTREAM_NAME}/${DOWNSTREAM_BUILD_NO}/console") println("${SEPARATOR} Begin console text output of ${DOWNSTREAM_NAME} #${DOWNSTREAM_BUILD_NO} ${SEPARATOR}") printConsoleOutputTextFrom( "${JENKINS_HOST}/job/${DOWNSTREAM_NAME}/${DOWNSTREAM_BUILD_NO}/consoleText") println("${SEPARATOR} End console output of ${DOWNSTREAM_NAME} ${SEPARATOR}") import org.xml.sax.InputSource void printConsoleOutputHtmlFrom(String consoleUrl) { println(xPathExpression('//pre[contains(@class,"console-output")]') .evaluate(new InputSource(responseFrom(consoleUrl)))) } import java.nio.charset.StandardCharsets void printConsoleOutputTextFrom(String consoleTextUrl) { BufferedReader log = new BufferedReader( new InputStreamReader(responseFrom(consoleTextUrl),StandardCharsets.UTF_8.name())); while ((line = log.readLine()) != null) { println(line) } } InputStream responseFrom(String url) { // See Using java.net.URLConnection to fire and handle HTTP requests // https://stackoverflow.com/a/2793153/1744774 URLConnection connection = new URL(url).openConnection(); connection.setRequestProperty("Accept-Charset",StandardCharsets.UTF_8.name()); return connection.getInputStream(); } import javax.xml.xpath.XPath; import javax.xml.xpath.XPathExpression; import javax.xml.xpath.XPathFactory; XPathExpression xPathExpression(String expression) { // See How to read XML using XPath in Java // https://stackoverflow.com/a/2811101/1744774 XPathFactory xPathFactory = XPathFactory.newInstance(); XPath xPath = xPathFactory.newXPath(); return xPath.compile(expression); } 参考文献: > Build Flow Plugin 更新2 以下内容即时更新上游的日志. // From: Output the console text of a Jenkins job that my Job is running // https://stackoverflow.com/a/31573477/1744774 final String JENKINS_HOST = 'http://<your Jenkins host>' final String DOWNSTREAM_NAME = '<your downstream job's name>' final String SEPARATOR = new String(new char[8]).replace(' ','-') import java.util.concurrent.TimeUnit parallel( { build(DOWNSTREAM_NAME) },{ final String THIS_BUILD_NAME = build.getProject().getName() final int THIS_BUILD_NO = build.getNumber() final int DOWNSTREAM_BUILD_NO = downstreamBuildNoFrom( "${JENKINS_HOST}/job/${THIS_BUILD_NAME}/${THIS_BUILD_NO}/consoleText") println("${SEPARATOR} Begin console output of ${DOWNSTREAM_NAME} #${DOWNSTREAM_BUILD_NO} ${SEPARATOR}") printConsoleOutputTextChunksFrom( "${JENKINS_HOST}/job/${DOWNSTREAM_NAME}/${DOWNSTREAM_BUILD_NO}/consoleText",3L,TimeUnit.SECONDS) println("${SEPARATOR} End console output of ${DOWNSTREAM_NAME} #${DOWNSTREAM_BUILD_NO} ${SEPARATOR}") }) int downstreamBuildNoFrom(String thisBuildConsoleTextUrl) { int downstreamBuildNo = -1 while (downstreamBuildNo <= 0) { TimeUnit.SECONDS.sleep(1L) BufferedReader log = new BufferedReader( new InputStreamReader(responseFrom(thisBuildConsoleTextUrl),StandardCharsets.UTF_8.name())); while ((line = log.readLine()) != null) { if (line.matches('.* Build .* started')) { final int buildNoIdx = line.indexOf('#') + 1 downstreamBuildNo = Integer.parseUnsignedInt( line.substring(buildNoIdx,line.indexOf(' ',buildNoIdx))) break } /*if (log.lines().anyMatch(t -> t.matches(".* Build .* started"))) { // in case of Java >=8 }*/ } } return downstreamBuildNo } // downstreamBuildNoFrom() import java.nio.charset.StandardCharsets void printConsoleOutputTextChunksFrom(String consoleTextUrl,long updateInterval,TimeUnit updateIntervalUnit) { final int LINE_BREAK_LENGTH = System.getProperty("line.separator").length() int charsPrintedSoFar = 0 while (true) // effectively a do { ... } { int charsPrintedThisTime = 0 BufferedReader chunk = new BufferedReader( new InputStreamReader(responseFrom(consoleTextUrl),StandardCharsets.UTF_8.name())) chunk.skip(charsPrintedSoFar) while ((line = chunk.readLine()) != null) { println(line) charsPrintedThisTime = line.length() + LINE_BREAK_LENGTH charsPrintedSoFar += charsPrintedThisTime } updateIntervalUnit.sleep(updateInterval) if (charsPrintedThisTime == 0) break } } // printConsoleOutputTextChunksFrom() InputStream responseFrom(String url) { // See Using java.net.URLConnection to fire and handle HTTP requests // https://stackoverflow.com/a/2793153/1744774 URLConnection connection = new URL(url).openConnection(); connection.setRequestProperty("Accept-Charset",StandardCharsets.UTF_8.name()); return connection.getInputStream(); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |