本文由 简悦 SimpRead 转码, 原文地址 blog.csdn.net

现象

gitlab 连接 安装在容器中的 jenkins 时,如果使用的是高版本的 jenkins ,会出现 403 错误,Error 403 No valid crumb was included in the request

原因

实际上这是因为 jenkins 的防止跨站点请求伪造(Prevent Cross Site Request Forgery exploits)阻拦了请求
本来低版本的 jenkins 可以在界面把这个关掉,但是高版本的 jenkins 认为这个是必要的,直接把关闭这个的界面干掉了,orz…

解决办法

如果是在虚拟机上安装的 jenkins 很好解决,直接修改/usr/local/bin/jenkins.sh配置文件重启服务即可,但是容器化的 jenkins 已经在容器里了就比较尴尬, 不过还是有办法的

1. 设置 jenkins 授权策略

2. 修改容器中的配置文件

修改容器配置文件,首先先想到的是 configMap , 但是 configMap 是用来修改容器进程配置文件的,只读权限没法执行 shell 脚本去修改文件,所以,只能进入容器手工改

进入容器有 2 种方式:

  • kubectl 命令进入
  • docker 命令

不要选择 kubectl 进入,进去之后会发现修改之后无法保存没有 root 权限,用 docker 命令进入(加上 root 权限参数)

# 注意是容器id不是 pod id,还有如果是多节点,那么容器调度到那个节点上就去那个节点上执行
$ docker exec -u root  -it <容器id>  bash

查看容器 id 的办法

# 首先查到pod中容器的名称
$ kubectl describe pod -n kube-ops < pod id >

# 通过名称查询容器id
docker ps -a | grep <容器名称>

无论那种方式进入,都会惊喜的发现没有 vim ,也没有 vi , 所以得先装一个,用 apt-get 还是 yum ,取决于你这个容器的基础镜像是 ubuntu 还是 centOS

# 我这是 ubuntu ,所以用 apt-get
$ apt-get install vim 

# 如果提示没有 vim 
$ apt-get upgrade

然后就可以改了,修改/usr/local/bin/jenkins.sh , 找到exec java那行, 添加-Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true,保存退出

# 最终效果
exec java -Duser.home="$JENKINS_HOME" -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true "${java_opts_array[@]}" -jar ${JENKINS_WAR} "${jenkins_opts_array[@]}" "$@"

然后 jenkins 全局安全设置下就可以看到这个

gitlab 那边 webhook 测试就可以成功了