You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 22:57:04