Jenkins方式构建的定位是使用专门的CICD平台。

既支持把JenKins作为一个Pod部署到openshift内部,也支持部署在Openshift集群外部,操作上的区别是

  • openshift自己内部带的jenkins images包含了openshift的plugin
  • Jenkins放在openshift外,需要手工安装plugin了。具体的安装过程可以参考
  • https://blog.openshift.com/using-openshift-pipeline-plugin-external-jenkins/

为了演示方便仍然直接用openshift里面的imagestream了

jenkins  Plugin能直接触发openshift的构建和部署过程, 同时最吸引的特点是:

  • 支持流水线Pipeline这种模式,便于在同一集群的多个项目(对应开发,测试,生产)环境或者多个集群(对应开发集群,Stage集群,生产集群)中进行发布。
  • 流水线支持自定义不同的阶段,每个阶段完成不同的任务,比如可以定义阶段为: CI环境部署->Stage环境部署->Prd部署
  • 一条流水线支持包含多个微服务,针对项目中包含多个微服务,一旦定制好流水线,就可以重复运行

1.安装jenkins

CDK安装完成后暂时直接用里面带的Jenkins ImageStream

oc new-project ci

然后界面上部署jenkins,如果部署失败,除了删除deployment,service,route外,还需要删除ServiceAccount(jenkins),rolebinding(jenkins_edit)和pvc jenkins

ericdeMacBook-Pro:openshift-tomcat ericnie$ oc get sa;
NAME SECRETS AGE
builder 7h
default 7h
deployer 7h
jenkins 7h
ericdeMacBook-Pro:openshift-tomcat ericnie$ oc get rolebinding;
NAME ROLE USERS GROUPS SERVICE ACCOUNTS SUBJECTS
admin /admin developer
jenkins_edit /edit jenkins
system:deployers /system:deployer deployer
system:image-builders /system:image-builder builder
system:image-pullers /system:image-puller system:serviceaccounts:ci
ericdeMacBook-Pro:openshift-tomcat ericnie$ oc get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
jenkins Bound pv0012 100Gi RWO,ROX,RWX 7h

部署完成后,通过命令行查看

ericdeMacBook-Pro:openshift-tomcat ericnie$ oc get all
NAME REVISION DESIRED CURRENT TRIGGERED BY
deploymentconfigs/jenkins config,image(jenkins:) NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
routes/jenkins jenkins-ci.192.168.99.100.nip.io jenkins <all> edge/Redirect None NAME READY STATUS RESTARTS AGE
po/jenkins--f5gk7 / Running 7h NAME DESIRED CURRENT READY AGE
rc/jenkins- 7h NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
svc/jenkins ClusterIP 172.30.182.209 <none> /TCP 7h
svc/jenkins-jnlp ClusterIP 172.30.154.212 <none> /TCP 7h

点击链接跳转

授权其他项目访问

出现jenkins主页面

2.构建项目和Openshift集成

建立一个项目,选择

在构建处选择Trigger OpenShift Build,然后填入相关的选项

同时把jenkins用户加入访问命名空间的权限

oc policy add-role-to-user edit system:serviceaccount:ci:jenkins -n s2i-tomcat

手工触发立即构建后,触发s2i-tomcat项目的构建,同时把镜像更新到depolyment

3.pipeline流水线构建

建立一个pipeline文件

ericdeMacBook-Pro:pipeline ericnie$ cat s2itomcat-pipeline.yaml
apiVersion: v1
kind: BuildConfig
metadata:
annotations:
pipeline.alpha.openshift.io/uses: '[{"name": "s2itomcat", "namespace": "s2i-tomcat", "kind":
"DeploymentConfig"}]'
creationTimestamp: null
labels:
app: jenkins-pipeline-development
name: s2itomcat-development-pipeline
template: application-template-development-pipeline
name: s2itomcat-development-pipeline
spec:
output: {}
postCommit: {}
resources: {}
runPolicy: Serial
source:
type: None
strategy:
jenkinsPipelineStrategy:
jenkinsfile: |-
node('maven') {
stage 'build'
openshiftBuild(buildConfig: 's2itomcat', showBuildLogs: 'true', namespace: 's2i-tomcat')
stage 'deploy'
openshiftDeploy(deploymentConfig: 's2itomcat', namespace: 's2i-tomcat')
}
type: JenkinsPipeline
triggers:
- github:
secret: secret101
type: GitHub
- generic:
secret: secret101
type: Generic
status:
lastVersion:

切换到jenkins所在的项目ci, 然后通过命令行建立

ericdeMacBook-Pro:pipeline ericnie$ oc create -f s2itomcat-pipeline.yaml
buildconfig "s2itomcat-development-pipeline" created

可以看到在jenkins界面上基于OpenShift的CI project创建了一个pipeline

授权

ericdeMacBook-Pro:pipeline ericnie$ oc policy add-role-to-user edit system:serviceaccount:ci:jenkins -n s2i-tomcat
role "edit" added: "system:serviceaccount:ci:jenkins"

在openshift console中start pipeline开始构建,完成后可以看见s2itomcat项目deployment的更新。

每次构建jenkins会启动一个新的maven pod,然后进行构建工作,构建完成后会将pod删除。

4.一条流水线多组件部署配置

在实际项目中存在一条流水线构建多个组件,同时需要部署多个镜像和微服务的场景,因此下面这个例子演示一下多组件的流水线构建过程。

还是相同的项目,我们再建立一个组件nodejs-example

ricdeMacBook-Pro:minishift ericnie$ oc new-app https://raw.githubusercontent.com/ericnie2015/nodejs-ex/master/openshift/templates/nodejs-dev.json
--> Deploying template "s2i-tomcat/nodejs-example" for "https://raw.githubusercontent.com/ericnie2015/nodejs-ex/master/openshift/templates/nodejs-dev.json" to project s2i-tomcat Node.js
---------
An example Node.js application with no database. For more information about using this template, including OpenShift considerations, see https://github.com/openshift/nodejs-ex/blob/master/README.md. The following service(s) have been created in your project: nodejs-example. For more information about using this template, including OpenShift considerations, see https://github.com/openshift/nodejs-ex/blob/master/README.md. * With parameters:
* Name=nodejs-example
* Namespace=openshift
* Memory Limit=512Mi
* Git Repository URL=https://github.com/alezzandro/nodejs-ex.git
* Git Reference=
* Context Directory=
* Application Hostname=
* GitHub Webhook Secret=gk0fyAeT43s368qQIxkGvoeHbphK7XKkSXOMHKnf # generated
* Generic Webhook Secret=4rWULbanlnwLsm8x38S0BACQKxCwfvpnKrARfSUn # generated
* Database Service Name=
* MongoDB Username=
* MongoDB Password=
* Database Name=
* Database Administrator Password=
* Custom NPM Mirror URL= --> Creating resources ...
service "nodejs-example" created
route "nodejs-example" created
imagestream "nodejs-example" created
buildconfig "nodejs-example" created
deploymentconfig "nodejs-example" created
--> Success
Access your application via route 'nodejs-example-s2i-tomcat.192.168.99.100.nip.io'
Use 'oc start-build nodejs-example' to start a build.
Run 'oc status' to view your app.

现在项目中的bc和dc分别包括

ericdeMacBook-Pro:minishift ericnie$ oc get dc
NAME REVISION DESIRED CURRENT TRIGGERED BY
myapp config,image(s2itomcat:latest)
nodejs-example
s2itomcat config,image(s2itomcat:latest)
ericdeMacBook-Pro:minishift ericnie$ oc get bc
NAME TYPE FROM LATEST
nodejs-example Source Git
s2itomcat Source Git@master

修改yaml文件,或者直接在界面上将原有pipeline的jenkinsfile修改成

node('maven') {
stage 'build'
openshiftBuild(buildConfig: 's2itomcat', showBuildLogs: 'true', namespace: 's2i-tomcat')
openshiftBuild(buildConfig: 'nodejs-example', showBuildLogs: 'true', namespace: 's2i-tomcat')
stage 'deploy'
openshiftDeploy(deploymentConfig: 's2itomcat', namespace: 's2i-tomcat')
openshiftDeploy(deploymentConfig: 'nodejs-example', namespace: 's2i-tomcat')
}

同时可以选择Serial或者Parrell的编译部署模式,然后完成部署。

设置了并行,但还是串行跑,应该是jenkins只provision了一个maven pod的原因。

pipeline跨集群运行的例子参考

https://github.com/openshift/jenkins-client-plugin/

OpenShift应用镜像构建(3) - Jenkins的流水线构建的更多相关文章

  1. 使用Jenkins pipeline流水线构建docker镜像和发布

    新建一个pipeline job 选择Pipeline任务,然后进入配置页面. 对于Pipeline, Definition选择 "Pipeline script from SCM" ...

  2. OpenShift应用镜像构建(1) S2I tomcat 镜像定制

    参考并感谢https://www.jianshu.com/p/fd3e62263046 在对接项目制作应用镜像的过程中,经常发现避免不了的是需要写Dockerfile,(当然另外一种方式是直接run一 ...

  3. GitLab集成Jenkins、Harborn构建pipeline流水线任务

    一.计划 在jenkins中构建流水线任务时,从GitLab当中拉取代码,通过maven打包,然后构建dokcer镜像,并将镜像推送至harbor当中.Jenkins中含开发.测试.生产视图,开发人员 ...

  4. 有手就行5——jenkins项目构建类型(pipeline流水线项目构建推荐)

    有手就行5--jenkins项目构建类型(pipeline流水线项目构建推荐) Pipeline简介 1) 概念 Pipeline,简单来说,就是一套运行在 Jenkins 上的工作流框架,将原来独立 ...

  5. DevOps实践之一:基于Docker构建企业Jenkins CI平台

    基于Docker构建企业Jenkins CI平台 一.什么是CI 持续集成(Continuous integration)是一种软件开发实践,每次集成都通过自动化的构建(包括编译,发布,自动化测试)来 ...

  6. 构建gitlab+Jenkins+harbor+kubernetes的DevOps持续集成持续部署环境

    构建gitlab+Jenkins+harbor+kubernetes的DevOps持续集成持续部署环境 整个环境的结构图. 一.准备工作 gitlab和harbor我是安装在kubernetes集群外 ...

  7. 使用Docker构建企业Jenkins CI平台

    在如今的互联网时代,随着软件开发复杂度的不断提高,软件开发和发布管理也越来越重要.目前已经形成一套标准的流程,最重要的组成部分就是持续集成(Continuous Integration,CI)及持续部 ...

  8. 11.实战交付一套dubbo微服务到k8s集群(4)之使用Jenkins进行持续构建交付dubo服务的提供者

    1.登录到jenkins,新建一个项目 2.新建流水线 3.设置保留的天数及份数 4. 添加参数 # 参数 . name: git_repo type: string description: 项目在 ...

  9. 实战交付一套dubbo微服务到k8s集群(5)之使用Jenkins进行持续构建交付dubo服务的提供者

    1.登录到jenkins,新建一个项目 2.新建流水线 3.设置保留的天数及份数 4.添加第一个参数:设置项目的名称 5.添加第二个参数:docker镜像名称 6.添加第三个参数:项目所在的git中央 ...

随机推荐

  1. php中mvc新建页面

    PHP配置: <?phpclass appointmentController extends Controller{public function __construct(){parent:: ...

  2. 刷题中熟悉Shell命令之Tenth Line和Transpose File [leetcode]

    首先介绍题目中要用的4个Shell命令 sed awk head tail的常用方法.(打好地基,才能建成高楼!) sed:(转自:http://www.cnblogs.com/barrychiao/ ...

  3. java中的抽象方法与抽象类

    在继承时,会遇到一个问题.如果很多子类都要继承父类的一个方法,但是实现的逻辑都不一样. 这时候父类只提供了方法名,但是没有具体的方法体. 例如,男孩类和女孩类都继承人类这一个父类.人类有爱好这个方法, ...

  4. django使用JWT保存用户登录信息

    在使用前必须弄明白JWT的原理,原理可以看我的另一篇博文:https://www.cnblogs.com/chichung/p/9966027.html JWT的流程 1.签发JWT 在用户正确输入账 ...

  5. hive学习(一)hive架构及hive3.1.1三种方式部署安装

    1.hive简介 logo 是一个身体像蜜蜂,头是大象的家伙,相当可爱. Hive是一个数据仓库基础工具在Hadoop中用来处理结构化数据.它架构在Hadoop之上,总归为大数据,并使得查询和分析方便 ...

  6. PHP PDO类

    <?php //数据库连接类,不建议直接使用DB,而是对DB封装一层 //这个类不会被污染,不会被直接调用 class DB { //pdo对象 private $_pdo = null; // ...

  7. Linux下几个命令的技巧

    Ctrl的组合键+a,移动到一行命令的首部+e,移动到一行命令的尾部+左右键,以单词为单位左右移动+u,删除光标之前的所有内容+k,删除光标之后的所有内容Alt+.为引用上一个命令的最后一个参数 还有 ...

  8. 找不到 libgtk-x11-2.0.so.0

    找不到 libgtk-x11-2.0.so.0 安装 yum groupinstall "Development Tools" yum install gtk+-devel gtk ...

  9. Java Class对象详解

    要怎样在java里来使用一个类,首先必须先把类的.class字节码文件加载进来,然后再进行连接对该类里的域分配内存,最后再调用构造器,如果该类有基类的话,会先去调用基类的构造器,总的来说,分为以下三个 ...

  10. 【转载】Scroller源码解析

    原文地址:https://github.com/Skykai521/AndroidSdkSourceAnalysis/blob/master/article/Scroller%E6%BA%90%E7% ...