前言
普元devops需要对接jenkins,对接jenkins后,devops会调用jenkins的提供的API。
问题
新版本的jenkins提供跨域保护,即大名鼎鼎的CSRF问题。
因此,普元devops调用jenkins的时候,会出现跨域问题。
后台报错信息如下:
Caused by: com.primeton.devops.specs.exception.DevOpsRuntimeException: DEVOPS_COMMON_ACCESS_OTHER_APP_ERROR: URL[POST http://xxx.xxx.xxx.xxx:xxxx/createItem/api/json?name=build-2-PROJ001-xxljob%E6%9E%84%E5%BB%BA001-1-22] request error.[statusCode=403][errorMessage=No valid crumb was included in the request][responseDetails={
"servlet":"Stapler",
"message":"No valid crumb was included in the request",
"url":"/createItem/api/json",
"status":"403"
}]
可以看到,提示的信息是 No valid crumb was included in the request。这就是jenkins提示跨域问题。
解决办法
老版本Jenkins的CSRF保护功能只需要在 系统管理 > 全局安全配置 中便可进行打开或者关闭。让人头疼的是较高版本的Jenkins竟然在管理页面关闭不了CSRF,网上搜索到的资料有写通过 groovy代码 实现取消保护,但是笔者操作未成功,最后,Get到了一种成功的解决姿势。
在Jenkins启动前加入相关取消保护的参数配置后启动Jenkins,即可关闭CSRF,配置内容如下:
-Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true
我的启动命令如下:
#/bin/bash
export JINKINS_HOME=/works/devops/jenkins/home
nohup /works/apps/jdk17/bin/java -jar -Xms64M -Xmx256M -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true /works/devops/jenkins/jenkins.war --httpPort=9080 >/works/devops/jenkins/all.log 2>&1 &
Jenkins若是跑在Tomcat下,只需在tomcat启动脚本中加入配置即可;若是以jar包形式部署的,只需在启动时加上配置参数即可。