目前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调用不影响。