感谢:
Spinnaker调用Jenkins API 返回403错误 - 走看看
https://www.jianshu.com/p/6c7ae50e1784
前段时间,k8s生产环境中选择使用Spinnaker + Jenkins实现CI/CD,但是我在Spinnaker执行构建走到调用jenkins的时候出错

然后我去检查一下Jenkins的日志发现,出现以下报错:
[root@hdss7-22 ~]# kubectl logs -f jenkins-56d9fd55f9-xrtgz -n infra
WARNING hudson.security.csrf.CrumbFilter#doFilter: No valid crumb was included in request for /job/dubbo-demo-slave/buildWithParameters by admin. Returning 403.
因为Spinnaker是通过跨站的方式调用Jenkins,那么Jenkins默认是开启CSRF保护,所以jenkins就会返回一个403报错
把CSRF保护的勾取消即可。


老版本Jenkins的CSRF保护功能只需要在 系统管理 > 全局安全配置 中便可进行打开或者关闭。让人头疼的是较高版本的Jenkins竟然在管理页面关闭不了CSRF,网上搜索到的资料有写通过 groovy代码 实现取消保护,但是笔者操作未成功,最后,Get到了一种成功的解决姿势。
在Jenkins启动前加入相关取消保护的参数配置后启动Jenkins,即可关闭CSRF,配置内容如下:
-Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true
Jenkins若是跑在Tomcat下,只需在tomcat启动脚本中加入配置即可;若是以jar包形式部署的,只需在启动时加上配置参数即可。
笔者Jenkins是部署在k8s环境中,故启动参数配置在yaml文件中,如下:
cat dp.yaml |grep csrf -C5

整个配置文件:
- kind: Deployment
- apiVersion: extensions/v1beta1
- metadata:
- name: jenkins
- namespace: infra
- labels:
- name: jenkins
- spec:
- replicas: 1
- selector:
- matchLabels:
- name: jenkins
- template:
- metadata:
- labels:
- app: jenkins
- name: jenkins
- spec:
- volumes:
- - name: data
- nfs:
- server: hdss7-200
- path: /data/nfs-volume/jenkins_home
- - name: docker
- hostPath:
- path: /run/docker.sock
- type: ''
- containers:
- - name: jenkins
- image: harbor.od.com:180/infra/jenkins:v2.319.1
- imagePullPolicy: IfNotPresent
- ports:
- - containerPort: 8080
- protocol: TCP
- env:
- - name: JAVA_OPTS
- value: -Xmx512m -Xms512m -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true
- volumeMounts:
- - name: data
- mountPath: /var/jenkins_home
- - name: docker
- mountPath: /run/docker.sock
- imagePullSecrets:
- - name: harbor
- securityContext:
- runAsUser: 0
- strategy:
- type: RollingUpdate
- rollingUpdate:
- maxUnavailable: 1
- maxSurge: 1
- revisionHistoryLimit: 7
- progressDeadlineSeconds: 600