热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

OpenShift4HandsonLab(7)用JenkinsPipeline实现在不同运行环境中升迁部署应用

《OpenShift4.xHOL教程汇总》说明:本文已经在OpenShift4.8环境中验证在DevOps过程中CICD是最主要的工具,通过它的Pip

《OpenShift 4.x HOL教程汇总》
说明:本文已经在OpenShift 4.8环境中验证

在DevOps过程中CI/CD是最主要的工具,通过它的Pipeline可以驱动整个开发、测试、交付和部署过程。在OpenShift 4.x中自带两个CI/CD引擎:Jenkins和Tekton。其中Jenkins是目前最为常用的CI/CD工具,而Tekton是是直接运行在Kubernetes上的原生CI/CD。我们在本章节介绍如何部署运行一套Jenkins的环境,进而利用Pipeline将应用在开发、测试和生产环境中进行升迁部署。在这里插入图片描述


  1. 执行以下命令创建相关项目。其中一个项目用来运行Jenkins的Pipeline,其它项目用来模拟3个阶段的应用环境。

$ export USER_ID=YOUR-USER-ID
$ oc new-project ${USER_ID}-pipeline-jenkins
$ oc new-project ${USER_ID}-pipeline-dev
$ oc new-project ${USER_ID}-pipeline-test
$ oc new-project ${USER_ID}-pipeline-prod

  1. 执行以下命令,在USER-ID-cicd项目中根据OpenShift预制的模板创建Jenkins运行环境。

$ oc new-app jenkins-ephemeral -n ${USER_ID}-pipeline-jenkins

  1. 执行执行命令,查看cicd 的pod创建进度是否问running。

$ oc get pod -w -n ${USER_ID}-pipeline-jenkins
NAME READY STATUS RESTARTS AGE
jenkins-1-deploy 0/1 Completed 0 8h
jenkins-1-tpwtq 1/1 Running 0 8h

  1. 查看Jenkins的访问route,然后用浏览器访问它。

$ oc get route jenkins -o template --template '{{.spec.host}}' -n ${USER_ID}-pipeline-jenkins

  1. 执行以下命令,允许USER-ID-pipeline-jenkines项目的Jenkins系统账号可以访问其它项目,同时允许USER-ID-pipeline-test和USER-ID-pipeline-prod系统账号从USER-ID-pipeline-dev项目中拉取镜像。

$ oc policy add-role-to-user edit system:serviceaccount:${USER_ID}-pipeline-jenkins:jenkins -n ${USER_ID}-pipeline-dev
$ oc policy add-role-to-user edit system:serviceaccount:${USER_ID}-pipeline-jenkins:jenkins -n ${USER_ID}-pipeline-test
$ oc policy add-role-to-user edit system:serviceaccount:${USER_ID}-pipeline-jenkins:jenkins -n ${USER_ID}-pipeline-prod
$ oc policy add-role-to-group system:image-puller system:serviceaccounts:${USER_ID}-pipeline-test -n ${USER_ID}-pipeline-dev
$ oc policy add-role-to-group system:image-puller system:serviceaccounts:${USER_ID}-pipeline-prod -n ${USER_ID}-pipeline-dev

  1. 将https://github.com/liuxiaoyu-git/cotd.git复制一份到自己的github账号。
  2. 执行以下命令,在USER-ID-pipeline-dev项目中创建myapp测试应用,然后可通过route验证应用可访问。

$ oc new-app --name=myapp openshift/php:latest~https://github.com/MY-GITHUB/cotd.git --as-deployment-config -n ${USER_ID}-pipeline-dev

  1. 查看pod状态,当运行myapp的pod为Running状态后在创建route,最后用浏览器访问route。

$ oc get pod -w -n ${USER_ID}-pipeline-dev
NAME READY STATUS RESTARTS AGE
myapp-1-build 0/1 Completed 0 2m45s
myapp-1-deploy 0/1 Completed 0 36s
myapp-1-fgh9v 1/1 Running 0 27s
$ oc expose service myapp -n ${USER_ID}-pipeline-dev
$ oc get route myapp -o template --template '{{.spec.host}}' -n ${USER_ID}-pipeline-dev

  1. 页面会随机显示一个动物的照片。
    在这里插入图片描述
  2. 执行命令,禁止自动deployment。

$ oc get dc myapp -o yaml -n ${USER_ID}-pipeline-dev | sed 's/automatic: true/automatic: false/g' | oc replace -f -
deploymentconfig.apps.openshift.io/myapp replaced

  1. 下载https://raw.githubusercontent.com/liuxiaoyu-git/OpenShift-HOL/master/jenkins-pipeline-demo1.yaml文件。

$ curl -LO https://raw.githubusercontent.com/liuxiaoyu-git/OpenShift-HOL/master/jenkins-pipeline-demo1.yaml

  1. 将jenkins-pipeline-demo1.yaml文件中的“USERID变量内容改为自己的用户名。另外还可确认这个Pipeline中包括2个stage,一个用来做build操作,一个用来做deploy操作。

...
def USERID = "user1"
def devProj = "$USERID-pipeline-dev"
pipeline {agent anystages{stage("Build") {steps{script{openshift.withCluster() {openshift.withProject("${devProj}") {echo '*** Build Starting ***'openshift.selector('bc', 'myapp').startBuild("--wait").logs('-f')echo '*** Build Complete ***'}}}}}stage("Deploy and Verify in Development Env"){steps{script{openshift.withCluster() {openshift.withProject("${devProj}") {echo '*** Deployment Starting ***'openshift.selector('dc', 'myapp').rollout().latest()echo '*** Deployment Complete ***'}}}}}}
}
...

  1. 然后执行以下命令,在USER-ID-pipeline-jenkins项目中创建BuildConfig,然后启动基于Pipeline的构建。

$ oc create -f jenkins-pipeline-demo1.yaml -n ${USER_ID}-pipeline-jenkins
start-build jenkins-pipeline-dembuildconfig.build.openshift.io/jenkins-pipeline-demo created
$ oc start-build jenkins-pipeline-demo -n ${USER_ID}-pipeline-jenkins
build.build.openshift.io/jenkins-pipeline-demo-1 started

  1. 在OpenShift控制台上进入“开发者”视图的“构建”菜单,然后切换到“user1-pipeline-jenkins”项目,进入名为“jenkins-pipeline-demo”的BuildConfig,再进入到“构建”标签,最后再进入“jenkins-pipeline-demo-1”的构建。此时会显示Pipeline的构建进度。
    在这里插入图片描述

  2. 点击上图的“View logs”链接会进入Jenkins(首次需要用OpenShift的用户登录,然后选择赋权访问),查看Pipeline的运行日志。
    在这里插入图片描述

  3. 在构建完后在浏览器中刷新应用页面,点击右上方的灰色图标,在弹出框中会显示当前运行的应用版本,此时赢还是“Version 1”。
    在这里插入图片描述

  4. 用浏览器访问https://github.com/MY-GITHUB/cotd.git,打开item.php页面,然后通过点击“Edit”图标编辑这个文件。在代码中找到“

    Version”并修改版本号,然后“Commit Changes”。

  5. 然后再次执行(12)中的start-build命令,在Jenkins Pipeline运行成功后可刷新并查看页面是否发生变化。

  6. 查看USER-ID-pipeline-test和USER-ID-pipeline-prod项目,确认没有任何对象。这是因为上面操作我们是通过手动部署的。

$ oc get all -n ${USER_ID}-pipeline-test
No resources found in pipeline-test namespace.
$ oc get all -n ${USER_ID}-pipeline-prod
No resources found in pipeline-prod namespace.

  1. 要将myapp部署运行到USER-ID-pipeline-test和USER-ID-pipeline-prod项目,还要执行以下命令,将名为“myapp:latest”的ImageStream新打两个标签“myapp:testready”和“myapp:prodready”。

$ oc tag myapp:latest myapp:testready myapp:prodready -n ${USER_ID}-pipeline-dev
Tag myapp:testready set to myapp@sha256:566ee55311f0cd0a80291c2345e7a1b72ca3eb84455a032433e2e3d11f39efbb.
Tag myapp:prodready set to myapp@sha256:566ee55311f0cd0a80291c2345e7a1b72ca3eb84455a032433e2e3d11f39efbb.
$ oc get is -n ${USER_ID}-pipeline-dev
NAME IMAGE REPOSITORY TAGS UPDATED
myapp default-route-openshift-image-registry.apps.cluster.example.opentlc.com/pipeline-dev/myapp prodready,testready,latest 9 seconds ago

  1. 执行以下命令,使用(19)的两个新ImageStreamTag在在USER-ID-pipeline-test和USER-ID-pipeline-prod项目中创建应用。

$ oc new-app ${USER_ID}-pipeline-dev/myapp:testready --name=myapp --as-deployment-config -n ${USER_ID}-pipeline-test
$ oc new-app ${USER_ID}-pipeline-dev/myapp:prodready --name=myapp --as-deployment-config -n ${USER_ID}-pipeline-prod
$ oc expose service myapp -n ${USER_ID}-pipeline-test
$ oc expose service myapp -n ${USER_ID}-pipeline-prod
$ oc get dc myapp -o yaml -n ${USER_ID}-pipeline-test | sed 's/automatic: true/automatic: false/g' | oc replace -f -
$ oc get dc myapp -o yaml -n ${USER_ID}-pipeline-prod | sed 's/automatic: true/automatic: false/g' | oc replace -f -

  1. 下载https://raw.githubusercontent.com/liuxiaoyu-git/OpenShift-HOL/master/jenkins-pipeline-demo2.yaml文件。此文件在jenkins-pipeline-demo1.yaml的基础让增加了将myapp部署到test和prod环境的步骤。

$ curl -LO https://raw.githubusercontent.com/liuxiaoyu-git/OpenShift-HOL/master/jenkins-pipeline-demo2.yaml

  1. 同样将jenkins-pipeline-demo2.yaml文件中的“USERID”变量内容改为自己的用户编号。
  2. 然后执行以下命令,在USER-ID-pipeline-jenkins项目中替换已有的BuildConfig,然后启动Pipeline构建。

$ oc replace -f jenkins-pipeline-demo2.yaml -n ${USER_ID}-pipeline-jenkins
$ oc start-build jenkins-pipeline-demo -n ${USER_ID}-pipeline-jenkins

  1. 在OpenShift控制台上查看名为“jenkins-pipeline-demo-2”的构建执行情况。当出现 “Input Required”,点击该链接进入Jenkins。
    在这里插入图片描述
  2. 在Jenkins中点击左侧的Console Output,在右侧找到下图位置,然后点击“Promote”链接,Pipeline继续得以运行直到显示“Finished: SUCCESS”。
    在这里插入图片描述
  3. 执行以下命令,访问3个环境的应用。

$ oc get route myapp -n ${USER_ID}-pipeline-dev -o template --template '{{.spec.host}}'
$ oc get route myapp -n ${USER_ID}-pipeline-test -o template --template '{{.spec.host}}'
$ oc get route myapp -n ${USER_ID}-pipeline-prod -o template --template '{{.spec.host}}'

  1. 根据(17)的说明修改程序中的Version,然后再次执行(17)中的start-build命令运行Pipeline。在Jenkins Pipeline运行成功后可刷新并查看三个环境的应用页面是否发生变化。

推荐阅读
  • 本文讨论了如何使用Web.Config进行自定义配置节的配置转换。作者提到,他将msbuild设置为详细模式,但转换却忽略了带有替换转换的自定义部分的存在。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 小程序wxs中的时间格式化以及格式化时间和date时间互转
    本文介绍了在小程序wxs中进行时间格式化操作的问题,并提供了解决方法。同时还介绍了格式化时间和date时间的互相转换的方法。 ... [详细]
  • 如何利用 Myflash 解析 binlog ?
    本文主要介绍了对Myflash的测试,从准备测试环境到利用Myflash解析binl ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
  • 总结一下C中string的操作,来自〈CPrimer〉第四版。1.string对象的定义和初始化:strings1;空串strings2(s1);将s2初始 ... [详细]
  • 本文整理了Java中org.apache.solr.common.SolrDocument.setField()方法的一些代码示例,展示了SolrDocum ... [详细]
  • 基于,docker,快速,部署,多,需求,spark ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
author-avatar
机智的树獭
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有