jenkins升级对jenkins api影响以及解决办法

本文档详细记录了将Jenkins从2.174版本升级到更高版本(如2.204.6、2.224和2.274)的过程,以及在不同版本中遇到的兼容性和CSRF验证问题。测试表明,通过禁用CSRF保护,可以解决API调用失败的问题,确保升级后的Jenkins能够正常使用并保持API调用的稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目前jenkins使用版本 2.174,会遇到安装使用其它插件或使用某些较新的功能,无法在2.174版本上兼容使用,主要原因是jenkins版本过低。因此,测试其它高版本(>2.174)jenkins是否可以在对接使用且功能不受影响。
jenkins使用docker方式部署,且目录/var/jenkines_home挂载到了主机上,原有数据不会随着容器删除而消失。因此测试升级原有数据是否会影响以及jenkins api 是否可以正常调用。
jenkins容器启动命令

docker run -u root -d --restart=always \
           --name jenkins --net=host\
           -e ANT_HOME=/var/jenkins_home/tools/hudson.tasks.Ant_AntInstallation/apache-ant-1.10.1 \
           -e PATH=$PATH:/var/jenkins_home/tools/hudson.tasks.Ant_AntInstallation/apache-ant-1.10.1/bin:/var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/maven3.5/bin:/bin \
           -e JAVA_OPTS=-Duser.timezone=Asia/Shanghai \
           -v /root/.m2/:/root/.m2/ \
           -v /var/jenkins_home:/var/jenkins_home \
           -v /usr/lib64/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7 \
           -v $(which docker):/usr/bin/docker \
           -v /var/run/docker.sock:/var/run/docker.sock \
           -v /etc/localtime:/etc/localtime:ro \
           -v /etc/hosts:/etc/hosts \
           jenkins/jenkins:2.174
测试方法

先备份好jenkins目录下数据!

1、修改启动命令,修改环境变量PATH增加java的环境变量信息和使用的镜像。

docker run -u root -d --restart=always \
           --name jenkins-test-test --net=host\
           -e ANT_HOME=/var/jenkins_home/tools/hudson.tasks.Ant_AntInstallation/apache-ant-1.10.1 \
           -e PATH=$PATH:/var/jenkins_home/tools/hudson.tasks.Ant_AntInstallation/apache-ant-1.10.1/bin:/var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/maven3.5/bin:/bin:/usr/local/openjdk-8/bin \
           -e JAVA_OPTS=-Duser.timezone=Asia/Shanghai \
           -v /root/.m2/:/root/.m2/ \
           -v /abcsys/upload/jenkins_home:/var/jenkins_home \
           -v /usr/lib64/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7 \
           -v $(which docker):/usr/bin/docker \
           -v /var/run/docker.sock:/var/run/docker.sock \
           -v /etc/localtime:/etc/localtime:ro \
           -v /etc/hosts:/etc/hosts \
           jenkins/jenkins:2.204

需要添加java环境变量信息,否则启动失败,日志会出现exec: java: not found的问题。

java路径可以通过 docker insepct {image} | grep -i path查看

在这里插入图片描述

2、jenkins启动完成后,打开jenkins页面。选择jenkins管理 - 全局工具配置 - JDK,更改java目录。java目录信息是上一步获取到的信息。
这一步是由于jdk目录各个版本的jenkins可能不一致,导致会有问题。
在这里插入图片描述

三、已测试版本

1、jenkins 2.204.6

对应镜像信息jenkins/jenkins:2.204.6

结果:api 调用正常

2、jenkins 2.224

对应镜像信息jenkins/jenkins:2.224

结果:操作失败,无法通过jenkins api调用。jenkins 容器日志出现
no valid crumb was included in request for xxx by admin. Returning 403

此版本由于jenkins使用CSRF验证,默认不能直接通过jenkins api 调用。需要禁用CSRF。查看官方文档是jenkins从2.x版本开始就加入了CSRF验证。

需要设置禁用CSRF,修改启动命令参数环境变量,禁用CSRF。修改配置为
JAVA_OPTS="-Duser.timezone=Asia/Shanghai -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true"

这一步查看jenkins源码发现,会读取这个启动参数。如果为true,不进行拦截器处理。

// core/src/main/java/hudson/security/csrf/GlobalCrumbIssuerConfiguration.java

@Extension(ordinal=195) @Symbol("crumb") // immediately after the security setting
public class GlobalCrumbIssuerConfiguration extends GlobalConfiguration {
    
    /* .... */
    
    @Restricted(NoExternalUse.class)
    public static CrumbIssuer createDefaultCrumbIssuer() {
        // 如果为true,不不进行处理,直接返回null,即不进行拦截
        if (DISABLE_CSRF_PROTECTION) {
            return null;
        }
        return new DefaultCrumbIssuer(SystemProperties.getBoolean(Jenkins.class.getName() + ".crumbIssuerProxyCompatibility", false));
    }

	// 读取启动参数属性,属性名是当前类全名+.DISABLE_CSRF_PROTECTION
    @Restricted(NoExternalUse.class)
    @SuppressFBWarnings("MS_SHOULD_BE_FINAL")
    public static /* non-final */ boolean DISABLE_CSRF_PROTECTION = SystemProperties.getBoolean(GlobalCrumbIssuerConfiguration.class.getName() + ".DISABLE_CSRF_PROTECTION");
}

因此docker启动命令为

docker run -u root -d --restart=always \
           --name jenkins-test-test --net=host\
           -e ANT_HOME=/var/jenkins_home/tools/hudson.tasks.Ant_AntInstallation/apache-ant-1.10.1 \
           -e PATH=$PATH:/var/jenkins_home/tools/hudson.tasks.Ant_AntInstallation/apache-ant-1.10.1/bin:/var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/maven3.5/bin:/bin:/usr/local/openjdk-8/bin \
           -e JAVA_OPTS="-Duser.timezone=Asia/Shanghai -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true" \
           -v /root/.m2/:/root/.m2/ \
           -v /abcsys/upload/jenkins_home:/var/jenkins_home \
           -v /usr/lib64/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7 \
           -v $(which docker):/usr/bin/docker \
           -v /var/run/docker.sock:/var/run/docker.sock \
           -v /etc/localtime:/etc/localtime:ro \
           -v /etc/hosts:/etc/hosts \
           jenkins/jenkins:2.274

修改完成后,重新运行jenkins容器。进入jenkins页面,选择jenkins管理 - 全局安全配置 - CSRF,会查看到如下信息提示。说明CSRF已禁用。

在这里插入图片描述

随后测试api,调用正常。

3、jenkins 2.274

对应镜像信息jenkins/jenkins:2.274

结果:操作失败,无法通过jenkins api调用。

修改方式同2.224 版本,测试功能通过。

四、总结:

jenkins可以实现从低版本升级至高版本,且原有数据和api调用不影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值