Openshift Jenkins共享并支持pipeline
2019-04-16 本文已影响110人
潘晓华Michael
Openshift Jenkins
诉求
- 使用Openshift的pipeline构建流水线,在Openshift上统一管理
- 使用一个公共的Jenkins,而不需要每个Project下都创建一个新的jenkins。以节约资源
- 在创建新的项目时,尽量少地改动完成以上的需求
问题
openshift默认的BuildConfig如果设置为jenkinsPipelineStrategy策略,将会在当前project下查找jenkins服务,如果没有的话,将会使用master-config中设置的默认jenkins模板所在位置在当前project下创建一个新的jenkins应用,便使用该应用执行相关的pipeline。
每个项目都会创建一个新的jenkins。
解决思路
- 禁用Openshfit默认的JenkinsPipeline机制,不在当前项目下面自动创建Jenkins
- 在创建一个新的project时,创建名为jenkins的service,同时将它指向公共的Jenkins服务。
- 同时为了在当前Project界面下能够跳转到jenkins的界面,再创建一个jenkins Route,支持跳转到jenkins进行查看运行日志与过程
- 项目要被jenkins控制,需要让公共jenkins具有操作当前项目的权限,所以还需要创建system:serviceaccount:jenkins:jenkins编辑当前Project的权限
解决方法
- 部署Jenkins作为公共的Jenkins,例如部署在jenkins project下
- 创建Project新建模板
$ oc adm create-bootstrap-project-template --name=bootstrap-project-template -o yaml > project-template.yaml
在以上导出的配置中添加默认的jenkins Service/Route/RoleBinding
- apiVersion: v1
kind: Service
metadata:
name: jenkins
namespace: ${PROJECT_NAME}
selector: {}
spec:
externalName: jenkins.jenkins.svc.cluster.local
type: ExternalName
- apiVersion: route.openshift.io/v1
kind: Route
metadata:
name: jenkins
namespace: ${PROJECT_NAME}
spec:
host: jenkins-jenkins.apps.it.mbcloud.com
to:
kind: Service
name: jenkins
- apiVersion: authorization.openshift.io/v1
kind: RoleBinding
metadata:
name: edit
namespace: ${PROJECT_NAME}
roleRef:
name: edit
subjects:
- kind: ServiceAccount
name: jenkins
namespace: jenkins
userNames:
- system:serviceaccount:jenkins:jenkins
结果展示:
- 将Openshift的Master中添加以下设置
- 设置Project默认模板为
default/bootstrap-project-template
- 关闭JenkinsPipeline默认在project下创建的机制
- 设置Project默认模板为
...
projectConfig:
defaultNodeSelector: node-role.kubernetes.io/compute=true
projectRequestMessage: ''
projectRequestTemplate: 'default/bootstrap-project-template'
...
jenkinsPipelineConfig:
autoProvisionEnabled: false
templateNamespace: openshift
templateName: jenkins-ephemeral
serviceName: jenkins
- 在Jenkins中的系统管理->系统设置中的
OpenShift Jenkins Sync
中的Namespace
中添加${PROJECT_NAME}
,之间是以空格分隔的.
添加project名.png
结果展示:
在Testx中创建一个简单的PipelineConfigBuild进行测试
apiVersion: build.openshift.io/v1
kind: BuildConfig
metadata:
name: test-pipelinex
namespace: testx
spec:
strategy:
jenkinsPipelineStrategy:
jenkinsfile: |-
pipeline {
agent any
stages {
stage("测试"){
steps {
echo "打印一下"
}
}
}
}
type: JenkinsPipeline
在Testx项目下创建以上的BuildConfig,前提是testx项目名已在jenkins中的系统设置中的OpenShift Jenkins Sync中添加
Testx项目下的PipelineJenkins可以使用Jenkins项目下的Jenkins服务来执行Pipeline