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

news/2024/11/5 13:10:04 标签: jenkins, html, servlet

项目场景:

在现代软件开发中,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 的 html" title=jenkins>jenkins.xml 文件中添加 CSP 配置,使得设置随 Jenkins 启动生效。

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

Linux 部署

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

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

  1. 找到配置文件:
  • Debian/Ubuntu:/etc/default/html" title=jenkins>jenkins
  • Red Hat/CentOS:/etc/sysconfig/html" title=jenkins>jenkins
  • 如果是通过 systemd 启动的 Jenkins,文件路径可能是 /etc/systemd/system/html" title=jenkins>jenkins.service
  1. 修改配置文件: 在找到的配置文件中,添加 CSP 设置。
  • /etc/default/html" title=jenkins>jenkins/etc/sysconfig/html" title=jenkins>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/html" title=jenkins>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 html" title=jenkins>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 html" title=jenkins>jenkins \
  html" title=jenkins>jenkins/html" title=jenkins>jenkins:lts

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

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

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

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

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

3. 检查效果

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

部署例子(Kubenetes)

比如,我的 deployment.yaml 如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: html" title=jenkins>jenkins
  namespace: <namespace>
spec:
  replicas: 1
  selector:
    matchLabels:
      app: html" title=jenkins>jenkins
  template:
    metadata:
      name: html" title=jenkins>jenkins
      labels:
        app: html" title=jenkins>jenkins
    spec:
      nodeSelector:
        group: it
      containers:
      - name: html" title=jenkins>jenkins
        image: html" title=jenkins>jenkins/html" title=jenkins>jenkins:lts
        ports:
        - name: html" title=jenkins>jenkins
          protocol: TCP
          containerPort: 8080
        volumeMounts:
          - name: html" title=jenkins>jenkins
            mountPath: /var/html" title=jenkins>jenkins_home
            subPath: html" title=jenkins>jenkins_home
        env:
          - name: JAVA_OPTS
            value: "-Djava.util.logging.config.file=/var/html" title=jenkins>jenkins_home/log.properties"
      volumes:
        - ...

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

apiVersion: apps/v1
kind: Deployment
metadata:
  name: html" title=jenkins>jenkins
  namespace: <namespace>
spec:
  replicas: 1
  selector:
    matchLabels:
      app: html" title=jenkins>jenkins
  template:
    metadata:
      name: html" title=jenkins>jenkins
      labels:
        app: html" title=jenkins>jenkins
    spec:
      nodeSelector:
        group: it
      containers:
      - name: html" title=jenkins>jenkins
        image: html" title=jenkins>jenkins/html" title=jenkins>jenkins:lts
        ports:
        - name: html" title=jenkins>jenkins
          protocol: TCP
          containerPort: 8080
        volumeMounts:
          - name: html" title=jenkins>jenkins
            mountPath: /var/html" title=jenkins>jenkins_home
            subPath: html" title=jenkins>jenkins_home
        env:
          - name: JAVA_OPTS
            value: "-Djava.util.logging.config.file=/var/html" title=jenkins>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.niftyadmin.cn/n/5739502.html

相关文章

JVM基本结构和垃圾回收机制

一、JVM基本结构 Java虚拟机&#xff08;JVM, Java Virtual Machine&#xff09;是Java程序执行的环境&#xff0c;其基本结构可以分为以下几个主要部分&#xff1a; 类加载器子系统&#xff08;Class Loader Subsystem&#xff09;&#xff1a; 负责加载Java类文件到内存中。…

第七部分:1. STM32之ADC实验--单通道实验

主要利用一个模拟量的电位器来实时改变电压值&#xff0c;通过STM32自带的ADC通道来采集这个数据&#xff0c;并打印出来&#xff01; 一句话&#xff0c;学完STM32&#xff0c;我就往南走&#xff0c;我的工资只有5000.~~~~Whappy

缓存-基础概念

1、缓存的基本思想 缓存的基本思想就是空间换时间&#xff0c;用更多的存储空间来存储一些可能重复使用或计算的数据&#xff0c;从而减少数据的重新获取或计算的时间。空间换时间的例子 索引&#xff1a;将数据库表中的默写列或字段按照一定的排序规则组织成一个单独的数据结…

人工智能技术在网络安全领域被恶意利用

知识图谱 1. 量子信息技术├── 1.1 量子计算│ └── 威胁现有密码学│ └── 抗量子攻击的密码算法├── 1.2 量子通信│ └── 极高的安全性│ └── 量子密钥分发 (QKD)│ └── 检测窃听行为2. 云计算├── 2.1 多…

Python详细实现快速幂算法

目录 Python详细实现快速幂算法引言一、快速幂算法的理论基础1.1 幂运算1.2 快速幂算法的基本思想1.3 快速幂算法的时间复杂度 二、Python实现快速幂算法2.1 基本实现代码解析&#xff1a; 2.2 非递归实现代码解析&#xff1a; 2.3 优化&#xff1a;带模运算的快速幂模快速幂算…

动态代理-整理

1. JDK 动态代理 JDK 自带的动态代理基于 接口 实现。它主要依赖 java.lang.reflect.Proxy 类和 InvocationHandler 接口。 InvocationHandler&#xff1a;用于定义代理类中方法的处理逻辑。代理对象的方法调用会被重定向到 InvocationHandler 的 invoke 方法。Proxy.newProxyI…

软件测试学习笔记丨Flask框架-集成Swagger文档

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/23424 介绍 接口文档对于前后端开发人员都十分重要。尤其近几年流行前后端分离后&#xff0c;编写接口文档更是重中之重。但是由于项目周期等原因后端人员经常出现无法及时更新&#xff0c;导…

github - ssh 配置 key、下载repo

1、设置位置 https://github.com/settings/keys 2、生成 Key ssh-keygen -t rsa -b 4096 -C "xx@x.com" 成功后,查看 cat ~/.ssh/id_rsa.pub 得到数据类似: ssh-rsa AAAAB3NzaC1yc2EA...4thQm4FKtB/c= xx3、下载代码 下载方式,选择 ssh,但使用 git clone 下…