深入探讨 Jenkins 中 HTML 格式无法正常显示的现象及解决方案

项目场景:

在现代软件开发中,Jenkins 作为一款流行的持续集成(CI)和持续交付(CD)工具,广泛应用于自动化构建、测试和部署流程。然而,许多用户在使用 Jenkins 时可能会遇到一个棘手的问题:在生成的构建报告中,HTML 格式无法正常显示,导致页面样式丢失。这不仅影响用户体验,还可能对开发流程造成不必要的干扰。本文将深入探讨这个问题的原因,并提供临时永久解决方案


问题描述:为何 HTML 格式无法正常显示?

Jenkins 在其默认设置中实施了严格的内容安全策略(Content Security Policy,CSP),这是为了增强安全性,防止潜在的跨站脚本攻击(XSS)。然而,这种严格的策略有时会意外阻止某些 HTML 内容(如 CSS、JavaScript 文件等)的加载,从而导致页面样式不正确。

以下是常见的 CSP 设置示例:

Content-Security-Policy: default-src 'self'; style-src 'self'; script-src 'self';

这种配置只允许从同一源加载资源,当某些必要的资源未被允许加载时,页面样式可能无法正常显示。


临时生效(不重启生效,但重启失效)

在 Jenkins 中,临时配置 Content-Security-Policy (CSP) 可以快速解决样式无法加载的问题,这种方法不需要重启 Jenkins,但在 Jenkins 重启后将失效。

  1. 进入 Jenkins 系统设置:在左侧导航栏点击 系统管理(Manage Jenkins)。

  2. 进入“脚本命令”页面
    中文版:选择 脚本命令(Script Console)。
    英文版:选择 Script Console

  3. 执行临时脚本: 在脚本窗口中输入以下代码,然后点击 运行(Run):


System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "default-src 'self'; style-src 'self' 'unsafe-inline';")

这条命令会即时生效,并且允许加载本地 CSS 文件和内联样式,临时解决 HTML 样式显示问题。


永久生效(重启生效/永久生效)

Windows 部署

要实现重启后也生效的永久解决方案,可以在 Jenkins 的 jenkins.xml 文件中添加 CSP 配置,使得设置随 Jenkins 启动生效。

  1. 找到 Jenkins 安装目录中的 jenkins.xml 文件
  • 如果 Jenkins 作为服务安装在 Windows 上,jenkins.xml 文件一般位于 C:\Program Files (x86)\Jenkins\jenkins.xml
  1. 编辑 jenkins.xml 文件
  • 打开 jenkins.xml 文件,在 <arguments> 部分添加 CSP 设置。将以下参数添加到 <arguments> 标签中:
    <arguments>-Dhudson.model.DirectoryBrowserSupport.CSP=default-src 'self'; style-src 'self' 'unsafe-inline';</arguments>
  1. 重启 Jenkins 服务
  • 保存 jenkins.xml 文件,重启 Jenkins 服务以应用该配置。
  • 这样设置后,每次 Jenkins 启动时都会自动加载该 CSP 配置,实现样式显示永久生效。

Linux 部署

步骤1:编辑 Jenkins 启动配置文件

在 Linux 上,Jenkins 的启动配置通常位于 /etc/default/jenkins 文件中(基于 Debian 系列)或其他系统配置文件中。如果你用的是其他方式安装 Jenkins(比如通过 systemd 服务管理),启动配置可能会在 /etc/systemd/system/jenkins.service

  1. 找到配置文件:
  • Debian/Ubuntu:/etc/default/jenkins
  • Red Hat/CentOS:/etc/sysconfig/jenkins
  • 如果是通过 systemd 启动的 Jenkins,文件路径可能是 /etc/systemd/system/jenkins.service
  1. 修改配置文件: 在找到的配置文件中,添加 CSP 设置。
  • /etc/default/jenkins/etc/sysconfig/jenkins 中,找到 JAVA_ARGSJENKINS_JAVA_OPTIONS,在参数中添加 CSP 规则:

    JAVA_ARGS="$JAVA_ARGS -Dhudson.model.DirectoryBrowserSupport.CSP=\"default-src 'self'; style-src 'self' 'unsafe-inline';\""
    
  • 如果使用的是 systemd,编辑 /etc/systemd/system/jenkins.service 文件,在 [Service] 下的 Environment 添加:

    Environment="JAVA_OPTS=-Dhudson.model.DirectoryBrowserSupport.CSP=default-src 'self'; style-src 'self' 'unsafe-inline';"
    

步骤3:保存配置并重启 Jenkins 服务

  1. 保存并关闭文件。

  2. 重载 systemd 配置(如果是 systemd 管理 Jenkins):

sudo systemctl daemon-reload
  1. 重启 Jenkins 服务:
sudo systemctl restart jenkins

容器部署(Docker)

容器部署的 Jenkins 通常使用 Docker 环境变量来传递 JVM 参数,从而设置 CSP 配置。

1. 修改 docker run 命令(若使用 docker run 直接启动)

如果是直接通过 docker run 命令启动 Jenkins,可以在启动命令中增加环境变量 JAVA_OPTS

docker run -d \-p 8080:8080 \-p 50000:50000 \-e JAVA_OPTS="-Dhudson.model.DirectoryBrowserSupport.CSP=default-src 'self'; style-src 'self' 'unsafe-inline';" \--name jenkins \jenkins/jenkins:lts

上述命令中的 -e JAVA_OPTS="..." 将 CSP 设置传递给 Jenkins 实例,这样可以实现样式文件的正常加载,并且该配置会在容器重启后依然生效。

2. 使用 Docker Compose 配置(如果使用 docker-compose.yml 文件)

如果使用 docker-compose.yml 文件来管理 Jenkins 容器,可以在 environment 中添加 JAVA_OPTS

version: '3'
services:jenkins:image: jenkins/jenkins:ltsports:- "8080:8080"- "50000:50000"environment:- JAVA_OPTS=-Dhudson.model.DirectoryBrowserSupport.CSP=default-src 'self'; style-src 'self' 'unsafe-inline';volumes:- jenkins_home:/var/jenkins_home
volumes:jenkins_home:

保存 docker-compose.yml 文件后,重新启动 Jenkins 服务即可。

3. 检查效果

Jenkins 启动后,尝试访问 HTML 报告页面,确认样式是否正常显示。通过这种方式添加的 CSP 配置会在 Jenkins 容器重启时自动加载,实现永久生效。

部署例子(Kubenetes)

比如,我的 deployment.yaml 如下:

apiVersion: apps/v1
kind: Deployment
metadata:name: jenkinsnamespace: <namespace>
spec:replicas: 1selector:matchLabels:app: jenkinstemplate:metadata:name: jenkinslabels:app: jenkinsspec:nodeSelector:group: itcontainers:- name: jenkinsimage: jenkins/jenkins:ltsports:- name: jenkinsprotocol: TCPcontainerPort: 8080volumeMounts:- name: jenkinsmountPath: /var/jenkins_homesubPath: jenkins_homeenv:- name: JAVA_OPTSvalue: "-Djava.util.logging.config.file=/var/jenkins_home/log.properties"volumes:- ...

要追加 -Dhudson.model.DirectoryBrowserSupport.CSP 的配置,将 yaml 修改为如下:

apiVersion: apps/v1
kind: Deployment
metadata:name: jenkinsnamespace: <namespace>
spec:replicas: 1selector:matchLabels:app: jenkinstemplate:metadata:name: jenkinslabels:app: jenkinsspec:nodeSelector:group: itcontainers:- name: jenkinsimage: jenkins/jenkins:ltsports:- name: jenkinsprotocol: TCPcontainerPort: 8080volumeMounts:- name: jenkinsmountPath: /var/jenkins_homesubPath: jenkins_homeenv:- name: JAVA_OPTSvalue: "-Djava.util.logging.config.file=/var/jenkins_home/log.properties -Dhudson.model.DirectoryBrowserSupport.CSP=\"default-src 'self'; style-src 'self' 'unsafe-inline';\""volumes:- ...

关键修改说明

更新 JAVA_OPTS:
JAVA_OPTS 环境变量中添加了 -Dhudson.model.DirectoryBrowserSupport.CSP 的配置。
这行代码确保在启动Jenkins时,CSP会被应用并且在重启后仍然有效。

结论

Jenkins 中 HTML 格式无法正常显示的问题通常是由于严格的内容安全策略(CSP)引起的。本文提供了多种临时和永久解决方案,旨在帮助用户在不同的部署环境中有效解决此问题。在实际应用中,应优先考虑安全性和系统稳定性,合理配置 CSP,以提升 Jenkins 的使用体验和安全性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/9841.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

基于Prometheus的client_golang库实现应用的自定义可观测监控

文章目录 1. 安装client_golang库2. 编写可观测监控代码3. 运行效果4. jar、graalvm、golang编译运行版本对比 前文使用javagraalvm实现原生应用可观测监控&#xff1a; prometheus client_java实现进程的CPU、内存、IO、流量的可观测&#xff0c;但是部分java依赖包使用了复杂…

【C++课程学习】:继承(上)(详细讲解)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;C课程学习 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 一.继承的概念和定义 &#x1f384;继承的概念&#xff1a; &#x1f384;继承的定义&#xff1a; …

PVE纵览-备份与快照指南

PVE纵览-备份与快照指南 文章目录 PVE纵览-备份与快照指南摘要1 备份与快照概述定义与区别备份与快照在PVE中的应用场景 2 PVE 备份功能详解备份类型与策略配置备份任务自动化备份管理 3 PVE 快照功能详解快照的工作原理快照的创建与恢复机制快照对系统性能的影响快照的使用场景…

Android JNI 技术入门指南

引言 在Android开发中&#xff0c;Java是一种主要的编程语言&#xff0c;然而&#xff0c;对于一些性能要求较高的场景&#xff08;如音视频处理、图像处理、计算密集型任务等&#xff09;&#xff0c;我们可能需要使用到C或C等语言来编写底层的高效代码。为了实现Java代码与C…

供应商srm管理,招投标管理,电子采购管理,在线询价,在线报价,供应商准入审核(java代码)

前言&#xff1a; 随着互联网和数字技术的不断发展&#xff0c;企业采购管理逐渐走向数字化和智能化。数字化采购平台作为企业采购管理的新模式&#xff0c;能够提高采购效率、降低采购成本、优化供应商合作效率&#xff0c;已成为企业实现效益提升的关键手段。系统获取在文末…

Java 函数接口Supplier【供给型接口】简介与示例

Java中四个重要的函数式接口&#xff1a;Function、Predicate、Consumer和Supplier。这些接口是函数式编程的基础&#xff0c;Function用于转换操作&#xff0c;Predicate用于进行条件判断&#xff0c;Consumer用于消费输入而不产生输出&#xff0c;而Supplier则用于提供值但不…

线程与进程的区别(面试)

一.进程 进程&#xff1a;一个程序启动起来&#xff0c;就会对应一个进程&#xff0c;进程就是系统分配资源的基本单位。 上面一部分进程是我们自己去执行应用的可执行文件, 而另一部分是操作系统自动启动的进程. 二.线程 线程&#xff1a;线程是进程中的一个执行单元&#xff…

VMware调整窗口为可以缩小但不改变显示内容的大小

也就是缩小窗口不会影响内容的大小 这样设置就好

OpenAI 发布了新的事实性基准——SimpleQA

SimpleQA 简介 名为 SimpleQA 的事实性基准&#xff0c;用于衡量语言模型回答简短的事实性问题的能力。 人工智能领域的一个悬而未决的问题是如何训练模型&#xff0c;使其产生符合事实的回答。 目前的语言模型有时会产生错误的输出或没有证据证明的答案&#xff0c;这个问题…

酒店民宿小程序,探索行业数字化管理发展

在数字化发展时代&#xff0c;各行各业都开始向数字化转型发展&#xff0c;酒店民宿作为热门行业也逐渐趋向数字、智能化发展。 对于酒店民宿来说&#xff0c;如何将酒店特色服务优势等更加快速运营推广是重中之重。酒店民宿小程序作为一款集结预约、房源管理、客户订单管理等…

[C++11] 可变参数模板

文章目录 基本语法及原理可变参数模板的基本语法参数包的两种类型可变参数模板的定义 sizeof... 运算符可变参数模板的实例化原理可变参数模板的意义 包扩展包扩展的基本概念包扩展的实现原理编译器如何展开参数包包扩展的高级应用 emplace 系列接口emplace_back 和 emplace 的…

使用Ubuntu快速部署MinIO对象存储

想拥有自己的私有云存储&#xff0c;安全可靠又高效&#xff1f;MinIO是你的理想选择&#xff01;这篇文章将手把手教你如何在Ubuntu 22.04服务器上部署MinIO&#xff0c;并使用Nginx反向代理和Let’s Encrypt证书进行安全加固。 即使你是新手&#xff0c;也能轻松完成&#xf…

贝尔不等式,路径积分与AB(Aharonov-Bohm)效应

贝尔不等式、路径积分与Aharonov-Bohm&#xff08;AB&#xff09;效应 这些概念分别源于量子力学不同的理论分支和思想实验&#xff0c;但它们都揭示了量子力学的奇异性质&#xff0c;包括非局域性、相位效应和波粒二象性。以下详细解析每一概念&#xff0c;并探讨其相互联系。…

用友U8接口-isHasCounterSignPiid错误

错误消息 调用U813的审批流方法报错&#xff0c;找不到方法:“Boolean UFIDA.U8.Audit.BusinessService.ManualAudit.isHasCounterSignPiid System.Web.Services.Protocols.SoapException:服务器无法处理请求。 ---> System.MissingMethodException: 找不到方法:“Boolean…

QJson-趟过的各种坑(先坑后用法)

QJson-趟过的各种坑【先坑后用法】 Chapter1 QJson-趟过的各种坑【先坑后用法】一、不能处理大数据量&#xff0c;如果你的数据量有百兆左右(特别是有的小伙伴还喜欢json格式化输出的)&#xff0c;不要用Qjson&#xff0c;否则会报错 DocumentTooLarge二、json格式化输出1.构建…

flink实战-- flink任务的火焰图如何使用

火焰图 Flame Graphs 是一种有效的可视化工具,可以帮助我们排查如下问题: 目前哪些方法正在消耗 CPU 资源?一个方法的消耗与其他方法相比如何?哪一系列的堆栈调用导致了特定方法的执行?y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的…

.Net Core 6.0 WebApi在Centos中部署

查看已经开发的端口的列表 firewall-cmd --zonepublic --list-ports .net core sdk密匙 sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm sudo yum update .net core sdk安装 sudo yum install -y dotnet-sdk-6.0 sudo dnf in…

Java基于SpringBoot+Vue的农产品电商平台

大家好&#xff0c;我是Java徐师兄&#xff0c;今天为大家带来的是Java基于SpringBoot 的农产品电商平台。该系统采用 Java 语言 开发&#xff0c;MySql 作为数据库&#xff0c;系统功能完善 &#xff0c;实用性强 &#xff0c;可供大学生实战项目参考使用。 博主介绍&#xff…

一文读懂系列:结合抓包分析,详解SSH协议通信原理

SSH协议通过建立加密通道来提供安全的远程访问、文件传输和执行远程命令等操作。接下来我们就通过具体示例和抓包分析&#xff0c;让大家清楚地了解SSH协议的神秘面纱&#xff01;如有更多疑问&#xff0c;欢迎讨论区留言讨论~ 1. SSH简介 SSH&#xff08;Secure Shell&#x…

数据冒险-ld和add(又称load-use冒险)

第一张图没有使用前递&#xff0c;第二张图使用前递&#xff0c;chatgpt分析第二张图 这张图展示了一个流水线的执行过程&#xff0c;其中存在读后写&#xff08;RAW&#xff09;数据冒险。我们可以通过**前递&#xff08;Forwarding&#xff09;**技术来解决这个数据冒险&…