Openshift Jenkins

诉求

  1. 使用Openshift的pipeline构建流水线,在Openshift上统一管理
  2. 使用一个公共的Jenkins,而不需要每个Project下都创建一个新的jenkins。以节约资源
  3. 在创建新的项目时,尽量少地改动完成以上的需求

问题

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的权限

解决方法

  1. 部署Jenkins作为公共的Jenkins,例如部署在jenkins project下

  2. 创建Project新建模板

    1
    $ oc adm create-bootstrap-project-template --name=bootstrap-project-template -o yaml > project-template.yaml

    在以上导出的配置中添加默认的jenkins Service/Route/RoleBinding

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    - 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.example.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

    结果展示:

  3. 将Openshift的Master中添加以下设置

    • 设置Project默认模板为default/bootstrap-project-template
    • 关闭JenkinsPipeline默认在project下创建的机制
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      ...

      projectConfig:
      defaultNodeSelector: node-role.kubernetes.io/compute=true
      projectRequestMessage: ''
      projectRequestTemplate: 'default/bootstrap-project-template'

      ...

      jenkinsPipelineConfig:
      autoProvisionEnabled: false
      templateNamespace: openshift
      templateName: jenkins-ephemeral
      serviceName: jenkins
  4. 在Jenkins中的系统管理->系统设置中的OpenShift Jenkins Sync中的Namespace中添加 ${PROJECT_NAME},之间是以空格分隔的.
    添加project名.png

结果展示:
在Testx中创建一个简单的PipelineConfigBuild进行测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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
Testx项目下可以使用Jenkins项目下的Jenkins服务来执行Pipeline

参考文章

DevOps的核心内功心法:OpenShift中实现共享Jenkins