英文:
How to view Jenkins console output during a build from the terminal after invoking build using curl from the terminal?
问题
我已经构建了一个Jenkins任务来运行自动化的ZAP-Proxy扫描。
我使用curl -X POST -u YOUR_USER:YOUR_USER_PASSWORD http://YOUR_JENKINS_URL/job/YOUR_JOB
来从终端构建该任务。是否有一种方法可以在任务正在构建时在终端中显示控制台输出?
英文:
I have built a Jenkins job to run automated ZAP-Proxy scans.
I used curl -X POST -u YOUR_USER:YOUR_USER_PASSWORD http://YOUR_JENKINS_URL/job/YOUR_JOB
to build the job from the terminal. Is there a way to display the console output in the terminal while the job is building?
答案1
得分: 2
可以的,但由于两个原因,这可能会稍微复杂一些:
-
当你通过
curl
触发一个新的构建时,构建不会立即启动。构建会进入构建队列,只有在Jenkins找到合适的执行者后才会开始执行。在此之前,根本没有构建URL。 -
从技术上讲,(持续的) 控制台输出以多个片段交付,必须通过HTTP单独检索。
因此,一旦触发了构建,你需要在它离开构建队列之后找到它的URL。这可以在Groovy中很好地完成——作为一个更简单的启发式方法,你可以等待一定的时间,然后使用 lastBuild
引用。
要获取控制台日志片段,你将使用 <buildUrl>/logText/progressiveText
终点。创建一个循环来获取该URL,并检查HTTP标头中的 X_More_Data
和 X_Text_Size
信息,以了解是否可用(以及什么)控制台输出。你可以在 bash
中使用 curl
在循环中执行这个操作;我在网络上找到了这个Groovy示例。
最后,最优雅的解决方案可能是:
- 通过提交一个Groovy脚本来触发一个新的构建,该脚本将触发构建,然后等待构建离开构建队列,并返回构建URL。
- 然后使用另一个脚本来轮询/获取/显示该构建的控制台输出。
如果你使用CLI界面来提交脚本,那么你可以在单个脚本中执行所有这些步骤。如果你使用REST API,那么第二部分("持续输出")可能不会工作,因为REST API端会进行输出缓冲。
英文:
It is possible, but it's a little more complicated for two reasons:
- When you trigger a new build via
curl
, then the build will not start immediately. The build will enter the build queue, and it will only start executing once Jenkins found a suitable executor. Before that time, there is no build URL at all. - Technically, the (continuous) console output is delivered in multiple fragments that must be retrieved individually via HTTP.
So, once you triggered the build, you need to find its URL after if left the build queue. It can be done nicely in Groovy -- as a simpler heuristic, you could just wait for certain time and then use the lastBuild
reference.
For fetching the console log fragments, you'll use the <buildUrl>/logText/progressiveText
end point. Create a loop fetching that URL and checking the X_More_Data
and X_Text_Size
HTTP headers for information on whether (and what) console output is available. You can do that in bash
with curl
in a loop; I found this Groovy example on the Web.
In the end, the most elegant solution is probably to
- trigger a new build by submitting a Groovy script that will trigger the build and then waits for the build to leave the build queue, returning the build URL.
- Then use another script that will poll/fetch/display that build's console output.
If you use the CLI interface for submitting the script, then you can do all those steps in a single script. If you use the REST API, then second part ("continuous output") probably won't work due to output buffering on REST API side.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论