jenkins 是如何做到实时日志显示的?

这篇具有很好参考价值的文章主要介绍了jenkins 是如何做到实时日志显示的?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

jenkins简介

Jenkins 是一款非常流行的 CI/CD 工具,它提供了实时日志显示功能,使得用户可以在构建和部署过程中实时查看日志输出。

在 Jenkins 中,实时日志显示是通过控制台输出实现的。当用户启动构建任务时,Jenkins 会在后台执行构建过程,并将输出的日志信息实时显示在 Jenkins 的 Web 页面上。这样用户就可以在不离开 Jenkins 页面的情况下,实时查看构建任务的执行过程和输出信息。

Jenkins 的实时日志显示功能基于 HTTP 和 Ajax 技术实现。Jenkins 在后台使用一个持续的 HTTP 连接来不断传输控制台输出信息,而 Web 页面则使用 Ajax 技术来接收和显示这些信息。通过这种方式,Jenkins 可以实现高效的、实时的日志输出。

总的来说,Jenkins 的实时日志显示功能是通过持续的 HTTP 连接和 Ajax 技术来实现的,它可以帮助用户实时查看构建和部署过程中的日志输出,从而更好地了解任务的执行情况。

源码分析

Jenkins的实时日志显示是通过WebSocket实现的。Jenkins基于Java实现,使用了Jetty作为内嵌Web容器,因此使用Jetty提供的WebSocket API来实现实时日志显示功能。

具体来说,Jenkins在Web页面中使用了一个JavaScript库Stapler来处理Web请求。当用户请求查看某个Job的构建日志时,Jenkins会向后端发送一个异步请求,请求某个Controller来处理该请求。Controller会调用Build.getLogText()方法获取构建日志的文本内容,并通过Jetty提供的WebSocket API将文本内容以小块的形式发送给前端。前端通过WebSocket接收到文本块后,即可在Web页面中动态地显示出构建日志。

以下是大致的代码流程:文章来源地址https://www.toymoban.com/news/detail-506518.html

  1. 后端Controller处理Web请求:
public void doLog(StaplerRequest req, StaplerResponse rsp) throws IOException {
    // 获取构建对象
    Run<?, ?> build = getBuild();
    if (build == null) {
        rsp.sendError(HttpServletResponse.SC_BAD_REQUEST);
        return;
    }

    // 获取请求参数
    String start = req.getParameter("start");
    String end = req.getParameter("end");

    // 获取构建日志
    BuildLogStreamer streamer = new BuildLogStreamer(build.getLogText(), start, end);
    // 设置WebSocket响应头
    rsp.addHeader("X-Text-Size", String.valueOf(streamer.length()));
    rsp.addHeader("X-More-Data", "true");
    // 开始发送构建日志文本
    streamer.stream(req, rsp);
}
  1. BuildLogStreamer类实现构建日志的流式发送:
public class BuildLogStreamer extends AbstractStream {

    private final String logText;
    private final long offset;
    private final int maxLength;

    public BuildLogStreamer(String logText, String start, String end) {
        this.logText = logText;
        // 解析请求参数,计算文本起始偏移量和文本最大长度
        this.offset = StringUtils.isBlank(start) ? 0 : Long.parseLong(start);
        int endOffset = StringUtils.isBlank(end) ? logText.length() : Integer.parseInt(end);
        this.maxLength = endOffset > logText.length() ? logText.length() : endOffset;
    }

    @Override
    protected void write(OutputStream os) throws IOException {
        // 发送文本块
        try (Writer writer = new OutputStreamWriter(os, StandardCharsets.UTF_8)) {
            writer.write(logText.substring((int) offset, maxLength));
        }
    }

    @Override
    public void doIndex(StaplerRequest req, StaplerResponse rsp) throws IOException {
        rsp.setStatus(HttpServletResponse.SC_OK);
    }

    @Override
    public long length() throws IOException, InterruptedException {
        return maxLength - offset;
    }

}
  1. 前端JavaScript代码实现WebSocket接收文本块并更新Web页面:
// 初始化WebSocket连接
var socket = new WebSocket(url);
socket.onopen = function(event) {
    // 连接成功,发送初始请求参数
    socket.send("start=" + startOffset + "&end=" + endOffset);
}
socket.onmessage = function(event) {
    // 接收到文本块,更新Web页面
    var data = event.data;
    outputBuffer.push(data);
   

到了这里,关于jenkins 是如何做到实时日志显示的?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 重写 AppiumService 类,添加默认启动参数,并实时显示启动日志

    在Appium的1.6.0版本中引入了AppiumService类,可以很方便的通过该类来管理Appium服务器的启动和停止。经过测试,使用该类的实例执行关闭server时,并没有释放端口号,会导致第二次启动时失败。另外,使用该类启动server,不能在窗口中实时显示日志,不方便调试。因此,可以重

    2024年02月05日
    浏览(42)
  • org.apache.commons.io.monitor+logback.xml+vue实时显示当前日志信息

    -:后端使用ssemiter保持客户端链接:http 这里不用websocket的原因是,sse很轻,整合方便,可发送日志,消息,群发等都可以。 -:前端使用vue3+ansi_up做页面展示 第一: 刷新页面导致session问题 可以在java的session中记录,如果是同一个客户重新链接的话,直接返回java的session的数

    2024年02月08日
    浏览(71)
  • 电脑监控软件,做到实时监管

    企业在使用电脑办公期间,经常会遇到员工随意从互联网下载软件进行安装使用,对于不熟悉计算机的人员来说,这一过程存在感染病毒、恶意软件的风险,给企业网络带来安全隐患,增加运维人员工作难度。员工从网络下载盗版软件可能会携带恶意软件,使企业终端成为外

    2024年02月10日
    浏览(38)
  • 【QT】如何实时显示当前时间在UI上

    2024年02月15日
    浏览(31)
  • 实用教程丨如何将实时数据显示在前端电子表格中(一)

    本文由葡萄城技术团队于博客园原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前言 数据(包括股票、天气和体育比分)在不断更新为新信息时最为有用。比较通用的 JavaScript 电子表格组件,可以轻松地使用

    2024年02月05日
    浏览(44)
  • [chatGPT] 如何通过JNI在Android上显示实时视频流

    相机拍摄的画面通过local socket 获取,所以C++的代码可以轻易的获取到每一帧视频数据,需要通过JNI 让 Android显示出来,方法有两种,一种是在Android内创建回调函数使用Bitmap 和ImageView 进行赋值显示,另一种也就是ChatGPT完成的,Android将surface 传递到JNI层内,C++来完成赋值和渲

    2023年04月26日
    浏览(82)
  • 如何使用Django 结合WebSocket 进行实时目标检测呢?以yolov5 为例,实现:FPS 25+ (0: 系统简介与架构)

    访问:http://127.0.0.1:8000/ObjectDetection/ObjectDetection1/ 先看下效果:两个摄像头实时展示 之后更新了效果,打算加上检测结果和 FPS ,结果加上FPS 实测了一下,好家伙一秒30-40 帧都行 在我的3060 上,这是python 写的 前后端实时检测你敢信,还两个摄像头机位。

    2023年04月08日
    浏览(44)
  • 如何做到安全上网

    随着信息化的发展,企业日常办公越来越依赖互联网,而访问互联网过程中,会遇到各种各样不容忽视的风险,例如员工主动故意的数据泄漏,后台应用程序偷偷向外部发信息,木马间谍软件的外联,以及各种挖矿、病毒运行。 安全访问外网解决方案 深信达SDC沙盒-安全访问

    2024年02月08日
    浏览(36)
  • RabbitMQ如何做到不丢不重

    目录 MQTT协议 如何保证消息100%不丢失 生产端可靠性投递 ​编辑 RabbitMQ的Broker端投 (1)消息持久化 (2)设置集群镜像模式 (3)消息补偿机制 消费端 ACK机制改为手动 总结 MQTT协议 先来说下MQTT协议中的3种语义,这个非常重要。 在MQTT协议中,给出了三种传递消息时能够提供

    2024年02月04日
    浏览(30)
  • 如何做到专注且不错过重要事情

    现代人每天要处理的事情繁多,如何能专注于当下,保持高效,又不错过重要事情? 先说高效,如果你想着一小时后要给张三打个电话,下午两点半有个会,中午需要订高铁票,那么你就很难高度专注地投入手头的事情。 反之,如果你高度专注,怎么保证各种事情到点时,

    2024年03月25日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包