如何通过Jenkins实现Openshift 4中Deployment的滚动发布
OpenShift 4 原生Deployment滚动发布Jenkins实现方案
方案1:复用现有OpenShift Jenkins插件
OpenShift Jenkins插件本身兼容Kubernetes原生资源,仅需对原有代码做少量调整即可使用:
openshift.withCluster() { openshift.withProject("project") { // 场景1:更新镜像触发滚动发布(适合新版本镜像构建完成的场景) openshift.selector("deploy", app).objects().each { deploy -> deploy.spec.template.spec.containers[0].image = "新镜像地址:版本标签" openshift.apply(deploy) } // 场景2:无镜像变更时强制触发滚动重启 def restartAnnotation = new Date().format("yyyy-MM-dd'T'HH:mm:ss'Z'") openshift.raw( "patch", "deployment", app, "-p", """{"spec":{"template":{"metadata":{"annotations":{"kubectl.kubernetes.io/restartedAt":"${restartAnnotation}"}}}}}""" ) // 等待滚动完成,逻辑可按需调整 timeout(5) { openshift.selector("deploy", app).related('pods').untilEach(1) { // 新增容器就绪状态判断,比单纯Running更准确 def podObj = it.object() return podObj.status.phase == "Running" && podObj.status.containerStatuses.every { it.ready } } } } }
注:原代码中的
rollout()方法是插件针对OpenShift专属DeploymentConfig对象的封装,Kubernetes原生Deployment没有对应封装接口,因此需要通过原生API调用实现。
方案2:直接调用oc命令行(代码最精简)
如果Jenkins运行环境预装了oc客户端(OpenShift官方提供的Jenkins agent镜像默认自带),可以直接用原生oc命令完成操作,代码更简洁易维护:
openshift.withCluster() { openshift.withProject("project") { timeout(5) { // 触发滚动重启 sh "oc rollout restart deployment/${app}" // 等待滚动完成,命令自带超时逻辑,无需自行实现循环校验 sh "oc rollout status deployment/${app} --timeout=5m" } } }
可选优化点
- 如果需要指定特定容器更新镜像,可以用
oc set image deployment/${app} 容器名=镜像地址:标签命令实现 - 滚动策略(最大不可用实例数、最大超发实例数)可以提前在Deployment的
spec.strategy.rollingUpdate中配置,无需在流水线中额外处理
内容的提问来源于stack exchange,提问作者openshift-noob
相关产品推荐
相关产品推荐

