解决jenkins(本机部署或容器部署)安全机制【CSP】问题

背景

在Jenkins流水线执行pytest测试时,生成的allure报告在使用HTML Publisher 插件(懒得在jenkins中配置allure插件)展示allure报告时(测试在指定镜像的容器中执行的,对应的镜像已经安装java、allure,直接在测试完成后就生成了allure报告),Jenkins 的安全机制(Content Security Policy,简称 CSP)拦截了 HTML 中的自动刷新指令

解决方式

方式一【临时解决】

  1. 登录 Jenkins,在左侧菜单栏点击 "系统管理" (Manage Jenkins)。
  2. 找到并点击 "脚本命令行" (Script Console)。
  3. 在输入框中粘贴命令(System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", ""))并点击 "运行" (Run):
  4. 执行后,回到你的构建报告页面刷新一下,通常就能正常自动跳转了。

方式二【永久生效】

如果希望 Jenkins 重启后依然保持自动跳转功能,需要修改 Jenkins 的启动参数:

  1. 找到 Jenkins 的配置文件(如果是 Windows 安装的 Jenkins 服务,通常是安装目录下的 jenkins.xml;如果是 Linux 或 Docker 部署,通常在启动脚本或环境变量中)。(如果是容器部署,可以查看下文)
  2. 在启动参数( 标签或 JAVA_OPTS 环境变量)中加入以下参数:
    -Dhudson.model.DirectoryBrowserSupport.CSP= (注意等号后面是空的,表示清空所有限制)。
  3. 保存文件并重启 Jenkins 服务。

容器部署如何解决

方式一:删除重建容器

  1. 停止并删除当前的 Jenkins 容器
    首先,你需要停止当前正在运行的 Jenkins 容器。(注意:只要你在最初启动时使用了 -v 挂载了数据卷,删除容器不会丢失你的配置和任务数据)
shell 复制代码
docker stop <你的jenkins容器名称或ID>
docker rm <你的jenkins容器名称或ID>
  1. 使用包含 CSP 参数的命令重新启动容器
    在原有的 docker run 启动命令中,加入 -e JAVA_OPTS="..." 参数。完整的命令示例如下:
    可参考A01_create_jenkins.sh
shell 复制代码
docker run -d \
  --name jenkins \
  -u root \
  -p 9123:8080 \
  -p 50000:50000 \
  -v /home/jenkins:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /usr/bin/docker:/usr/bin/docker \
  -e JAVA_OPTS="-Dhudson.model.DirectoryBrowserSupport.CSP=\"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline';\"" \
  jenkins:latest

注:如果是使用 Docker Compose:

如果是通过 docker-compose.yml 文件来管理容器的,不需要敲很长的命令行。只需要在对应服务的 environment 下加入该配置即可:

yaml

yaml 复制代码
environment:
  - JAVA_OPTS=-Dhudson.model.DirectoryBrowserSupport.CSP="default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline';"

修改后执行 docker-comp重新创建容器即可生效。

方式二:已有容器中修改

不删除容器,修改容器内配置即可

  1. 将容器内jenkins.sh文件备份至宿主机
shell 复制代码
docker exec jenkins cat /usr/local/bin/jenkins.sh > jenkins.sh
docker exec jenkins cat /usr/local/bin/jenkins.sh > jenkins_bak.sh
  1. 编辑宿主机下的jenkins.sh文件, 在文件第二行插入以下内容
shell 复制代码
export JAVA_OPTS="-Dhudson.model.DirectoryBrowserSupport.CSP=\"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline';\""
  1. 将宿主机的jenkins.sh文件拷贝至容器内
shell 复制代码
docker cp /home/jenkins.sh  jenkins:/usr/local/bin/jenkins.sh
docker exec jenkins chmod 777 /usr/local/bin/jenkins.sh
  1. 验证容器内文件是否被覆盖:直接输出查看
shell 复制代码
docker exec jenkins cat /usr/local/bin/jenkins.sh
  1. 重启容器
shell 复制代码
docker restart jenkins 

Jenkinsfile 测试示例

shell 复制代码
pipeline {
    agent {
        // 需要安装插件:docker-workflow
        docker {
            image 'python310:v1'
        }
    }
        
    parameters { // 设置参数
        string(name: 'report_url', defaultValue: '', description: '报告链接地址')
    }
    
    stages {
        stage('生成HTML报告') {
            steps {
                // 假设你的脚本生成了一个 index.html 在 report 目录下
                sh '''
                    mkdir -p report
                    cat > report/index.html <<EOF
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <!-- 展示提示语,3秒后自动跳转 -->
    <meta http-equiv="refresh" content="3;url=${report_url}">
    <title>报告跳转中</title>
</head>
<body>
    <h2>测试报告已生成</h2>
    <!-- 2. 增加了手动跳转的兜底提示 -->
    <p>如果页面没有自动跳转,请<a href="${report_url}" target="_blank" rel="noopener noreferrer">点击查看最新测试报告</a></p>
</body>
</html>
EOF
                '''

            }
        }
    }
    post {
        always {
            // 发布 HTML 报告,左侧会出现 "自动化测试报告" 的跳转入口
            publishHTML([
                allowMissing: false,
                alwaysLinkToLastBuild: true, // 始终链接到最新构建
                keepAll: true,               // 保留每次构建的历史报告
                reportDir: 'report',         // HTML文件所在的目录
                reportFiles: 'index.html',   // 入口文件名
                reportName: '自动化测试报告', // 【这里定义左侧跳转入口的名称】
                reportTitles: ''
            ])
        }
    }
}

效果

相关推荐
烧饼Fighting2 小时前
Jenkins自动化编译部署Spring Boot项目
spring boot·自动化·jenkins
serve the people2 小时前
Elasticsearch(3) show me some examples
大数据·elasticsearch·jenkins
牛奶咖啡133 小时前
CI/CD——通过Jenkins插件实现与K8s集成并部署应用到k8s集群的实践保姆级教程
ci/cd·kubernetes·jenkins·jenkins安装k8s插件·jenkins对k8s配置凭据·jenkins配置pod模板·编写流水线脚本部署应用到k8s
serve the people3 小时前
Elasticsearch(4) show me some more advanced content
大数据·elasticsearch·jenkins
兄台の请冷静15 小时前
Linux 安装es
linux·elasticsearch·jenkins
江华森1 天前
Jenkins CI/CD 实战博客教程
servlet·ci/cd·jenkins
云原生指北1 天前
告别 Jenkins UI:jk 让 AI Agent 也能操控 Jenkins
jenkins·devops
杨某不才3 天前
内网环境下,使用Docker安装Elasticsearch分词器插件
elasticsearch·docker·jenkins
杨某不才3 天前
内网离线方式Docker安装Elasticsearch
elasticsearch·docker·jenkins