OKD 实战:CI/CD 自动化流水线 (Jenkins + OpenShift)
基础设施即代码:流水线逻辑 (Jenkinsfile) 直接存储在 K8s 资源对象中。弹性 Agent:不再需要维护庞大的编译服务器,Agent 随用随建,用完释放。深度集成:OpenShift DSL 让 Jenkins 能够像“本地人”一样操作集群资源。这是从传统手工部署转向大规模微服务管理的必经之路。
OKD 实战:CI/CD 自动化流水线 (Jenkins + OpenShift)
摘要:在 DevOps 实践中,Jenkins 是调度大脑,OpenShift 是执行引擎。本实验不使用传统的 webhook 触发,而是通过编写 Jenkinsfile (Pipeline as Code),指挥 OpenShift 完成从源码拉取到应用部署的全自动化闭环。
1. 架构与流程图解
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
- 注意:这里虽然也触发了一次构建,但我们的目的是为了生成
ImageStream和DeploymentConfig对象。稍后我们将用 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 观察“多米诺骨牌”效应
- Build Pending: Jenkins 正在向 K8s 申请启动 Maven Agent Pod。
- Agent Running: Pod 启动,开始拉代码。
- S2I Build: Agent 指挥 OpenShift 开始构建镜像(你会看到另一个 Build Pod 启动)。
- Deployment: 镜像构建完成,DeploymentConfig 触发滚动更新。
查看 Jenkins 界面:
通过 oc get route jenkins 获取地址,登录后可以看到炫酷的流水线进度条。
7. 总结
通过本次实战,我们深刻体会到了“云原生 CI/CD”的三个核心优势:
-
基础设施即代码:流水线逻辑 (Jenkinsfile) 直接存储在 K8s 资源对象中。
-
弹性 Agent:不再需要维护庞大的编译服务器,Agent 随用随建,用完释放。
-
深度集成:OpenShift DSL 让 Jenkins 能够像“本地人”一样操作集群资源。
这是从传统手工部署转向大规模微服务管理的必经之路。
更多推荐
所有评论(0)