OKD 实战:CI/CD 自动化流水线 (Jenkins + OpenShift)

摘要:在 DevOps 实践中,Jenkins 是调度大脑,OpenShift 是执行引擎。本实验不使用传统的 webhook 触发,而是通过编写 Jenkinsfile (Pipeline as Code),指挥 OpenShift 完成从源码拉取到应用部署的全自动化闭环。


1. 架构与流程图解

Kubernetes/OpenShift Cluster

oc start-build

触发

动态生成

Stage 1: Clone

Stage 2: Start Build

Push

Trigger

Stage 3: Verify

开发者

Pipeline BuildConfig

Jenkins Master

Maven Agent Pod

GitHub

S2I Build Pod

内部镜像仓库

Deployment

Node.js 应用 Pod


2. 核心技术点解析 (为什么这么做?)

2.1 为什么用 strategy: JenkinsPipeline

传统的 BuildConfig 只负责构建镜像。而 JenkinsPipeline 策略允许我们将构建逻辑托管给 Jenkins,从而利用 Jenkins 强大的插件生态(如代码扫描、人工审批、邮件通知)。

2.2 什么是 agent { label 'maven' }

这是 Kubernetes Plugin 的魔法。Jenkins Master 本身不干活,当流水线启动时,它会向 OpenShift 申请启动一个临时的 Pod(这里用的是预装了 Maven/Node 工具的镜像),所有脚本都在这个临时 Pod 里跑。用完即焚,资源零浪费。

2.3 openshift.startBuild 是什么?

这是 OpenShift DSL (领域特定语言)

  • 传统做法:在脚本里写 sh "oc start-build xxx"。这很笨重,还需要配置 kubeconfig。
  • DSL 做法:Jenkins 原生理解 OpenShift 对象。它不仅能触发构建,还能实时捕获构建日志并展示在 Jenkins 界面上,体验极其丝滑。

3. 环境准备

首先,为我们的 CI/CD 实验开辟一个独立空间。

# 1. 创建项目
oc new-project cicd-demo

# 2. 部署 Jenkins (使用持久化模板,防止重启丢配置)
oc new-app jenkins-persistent --param MEMORY_LIMIT=1Gi --param VOLUME_CAPACITY=5Gi -n cicd-demo
  • 发生了什么? OpenShift 启动了一个 Jenkins Master Pod,并自动配置了 OAuth 认证。您可以用 admin 账号直接登录 Jenkins,无需单独管理密码。

4. 准备目标应用 (占位符)

我们先创建一个“空壳”应用,等待流水线来填充它。

# 1. 部署 Node.js 应用 (明确指定镜像版本)
oc new-app openshift/nodejs:20-ubi8~https://github.com/sclorg/nodejs-ex.git \
    --name=nodejs-app \
    --as-deployment-config=true \
    -n cicd-demo

# 2. 暴露路由
oc expose svc/nodejs-app
  • 注意:这里虽然也触发了一次构建,但我们的目的是为了生成 ImageStreamDeploymentConfig 对象。稍后我们将用 Pipeline 来接管它的更新。

5. 编写与应用流水线 (Pipeline as Code)

这是本实验的核心。我们将 Jenkinsfile 嵌入到 OpenShift 的 BuildConfig 中。

5.1 创建 Pipeline 配置文件

在 132 节点上执行:

cat <<EOF > pipeline.yaml
apiVersion: build.openshift.io/v1
kind: BuildConfig
metadata:
  name: nodejs-pipeline
  namespace: cicd-demo
spec:
  strategy:
    type: JenkinsPipeline
    jenkinsPipelineStrategy:
      jenkinsfile: |
        pipeline {
          agent {
            label 'maven'  // 使用动态 Slave Pod
          }
          stages {
            stage('代码拉取') {
              steps {
                git url: 'https://github.com/sclorg/nodejs-ex.git'
              }
            }
            stage('S2I 构建') {
              steps {
                script {
                  // 触发 OpenShift 内部构建名为 'nodejs-app' 的任务
                  // 并等待其完成 (showBuildLogs: true)
                  openshift.startBuild(bldCfg: 'nodejs-app', showBuildLogs: 'true')
                }
              }
            }
            stage('部署验证') {
              steps {
                script {
                  // 验证名为 'nodejs-app' 的应用是否已滚动更新完毕
                  openshift.verifyDeployment(depCfg: 'nodejs-app')
                }
              }
            }
          }
        }
EOF

5.2 应用配置

oc apply -f pipeline.yaml

6. 触发与验证

6.1 启动流水线

oc start-build nodejs-pipeline

6.2 观察“多米诺骨牌”效应

  1. Build Pending: Jenkins 正在向 K8s 申请启动 Maven Agent Pod。
  2. Agent Running: Pod 启动,开始拉代码。
  3. S2I Build: Agent 指挥 OpenShift 开始构建镜像(你会看到另一个 Build Pod 启动)。
  4. Deployment: 镜像构建完成,DeploymentConfig 触发滚动更新。

查看 Jenkins 界面
通过 oc get route jenkins 获取地址,登录后可以看到炫酷的流水线进度条。

7. 总结

通过本次实战,我们深刻体会到了“云原生 CI/CD”的三个核心优势:

  1. 基础设施即代码:流水线逻辑 (Jenkinsfile) 直接存储在 K8s 资源对象中。

  2. 弹性 Agent:不再需要维护庞大的编译服务器,Agent 随用随建,用完释放。

  3. 深度集成:OpenShift DSL 让 Jenkins 能够像“本地人”一样操作集群资源。

这是从传统手工部署转向大规模微服务管理的必经之路。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐