2017年1月27日星期五

OpenShift_046:RoadShow 回顾之六:使用 CI/CD Pipeline 自动化部署

环境:OCP 3.4

本实验使用 Pipeline 来实现自动化部署,模拟了开发和生产环境,比之前的 S2I 更复杂,更适合真实情况。

当配置或源代码被修改后,Pipeline 将会做以下事情,来决定此次改变是否适合从开发到生产环境。

  • 克隆 Git 仓库代码
  • 编译代码,运行单元测试
  • 运行 S2I,生成应用的镜像
  • 部署应用的镜像到开发环境
  • 运行自动化测试,测试开发环境中的应用镜像
  • 人工测试,测试开发环境中的应用镜像
  • 等待开发经理同意或不同意把此次构建的应用镜像部署到生产环境

1. 由于 node2 资源紧张,增加 node1 上的label:app=yes
oc label node node1.example.com app=yes

2. 创建 jenkins 应用

选择 Jenkins (Ephemeral) 模板,按默认参数部署即可。
部署成功后,会自动创建一个 jenkins sa,为其赋予 edit 权限
oc policy add-role-to-user edit -z jenkins

3. 去除 nationalparks service 的 label: type=parksmap-backend
这样做的目的是为将来使用 nationalparks-live 替代 nationalparks。
oc describe svc nationalparks
oc label svc nationalparks type-

4. 创建 Live 环境

4.1 创建 Live MongoDB
选择 MongoDB (Ephemeral) 模板,参数如下:

4.2 部署 nationalparks:live 
创建 nationalparks:live Image Stream
oc tag nationalparks:latest nationalparks:live
说明:创建一个 Tag:nationalparks:live,其指向 nationalparks:latest 所指向的镜像。
将来自动构建只会更新 nationalparks:latest tag,手工命令(人工确认触发的自动构建)才会更新 nationalparks:live tag。

创建完 nationalparks:live tag,还要发布与之相对应的镜像。


为 nationalparks-live 创建 route

为 nationalparks-live 的 DeploymentConfig 增加环境变量
oc env dc nationalparks-live -e MONGODB_USER=mongodb -e MONGODB_PASSWORD=mongodb -e MONGODB_DATABASE=mongodb -e MONGODB_SERVER_HOST=mongodb-live

为 nationalparks-live 的 Service 增加 label:type=parksmap-backend
oc describe svc nationalparks-live
oc label svc nationalparks-live type=parksmap-backend

为 Live MongoDB 加载数据
http://nationalparks-live-applications.apps.example.com/ws/data/load
确认 Live MongoDB 加载数据成功
http://nationalparks-live-applications.apps.example.com/ws/data/all

访问并刷新 http://parksmap-applications.apps.example.com/,能看到来自 nationalparks-live 的数据。

5. 创建 OpenShift Pipeline
不允许自动部署 nationalparks (dev)
默认情况下,每构建一次 nationalparks,都会重新部署 nationalparks:latest 镜像。
以后将使用 Pipeline 方式构建,因此就不再允许自动部署 nationalparks (dev)。
oc set triggers dc/nationalparks --from-image=nationalparks:latest --remove

创建 dev-live-pipeline template
cd /tmp;
git clone http://git.example.com/git/nationalparks.git;
cd /tmp/nationalparks/ose3
oc create -f pipeline-template.yaml -n openshift

根据 dev-live-pipeline template 创建 nationalparks-pipeline

查看 nationalparks-pipeline 配置
node {
  stage 'Build'
  openshiftBuild(buildConfig: 'nationalparks', namespace: 'applications', showBuildLogs: 'true')
  
  stage 'Deploy Dev'
  openshiftDeploy(deploymentConfig: 'nationalparks', namespace: 'applications')

  stage 'Test Dev'
  sh 'curl -s http://nationalparks.applications.svc.cluster.local:8080/ws/data/load'
  sh 'curl -s http://nationalparks.applications.svc.cluster.local:8080/ws/data/all | grep -q "Grand Canyon National Park"'
  
  stage 'Deploy Live'
  input 'Promote the Dev image to Live?'
  openshiftTag(srcStream: 'nationalparks', srcTag: 'latest', destStream: 'nationalparks', destTag: 'live', namespace: 'applications', destinationNamespace: 'applications')
  // openshiftDeploy(deploymentConfig: 'nationalparks-live', namespace: 'applications')
}

点击 Start Pipeline,开始构建,jenkins 会报下面这个错误:
......
Proceeding
[Pipeline] sh
[workspace] Running shell script
+ curl -s http://nationalparks.applications.svc.cluster.local:8080/ws/data/load
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
ERROR: script returned exit code 7
Finished: FAILURE

参考文献:
1. http://labs.openshift3roadshow.com/roadshow/

没有评论: