使用 Jenkins 实现镜像的 CI/CD
操作场景
在云原生应用持续交付过程中,您需要将代码提交后自动构建为容器镜像,推送到镜像仓库后自动部署到容器集群。Jenkins 作为主流的 CI/CD 工具,可以串联从源码构建到镜像推送再到集群部署的全流程。
容器镜像服务(SWR)提供镜像存储能力,与 Jenkins 结合可以实现完整的 CI/CD 流水线。
通过本章节的操作,您可以实现使用 Jenkins Pipeline 自动拉取源码、构建 Docker 镜像并推送到 SWR。
约束与限制
- Jenkins 需安装 Docker 插件,且 Jenkins agent 节点上需安装 Docker 运行环境。
- 在 Jenkins 中直接控制部署时机,可使用 kubectl 或 CCE API 直接部署。
前提条件
| 前提条件 | 确认方法 | 参考文档 |
|---|---|---|
| 已创建组织 | 在SWR控制台,确认组织已存在 | |
| 已获取SWR登录指令 | 在SWR控制台"总览"页面,单击"登录指令"可复制 | |
| 已创建CCE集群,且Jenkins节点可访问集群API Server | 在CCE控制台确认集群状态为"运行中",并在Jenkins节点执行kubectl cluster-info验证连通性 | |
| 已安装Jenkins(2.300及以上版本) | 访问Jenkins页面,在"系统管理 > 系统信息"中查看版本号 | |
| 已安装Jenkins插件 | 在"系统管理 > 插件管理"中确认以下插件已安装:
| |
| 已配置代码仓库Webhook | 在GitLab/GitHub仓库设置中,确认Webhook已配置,推送到指定分支时可触发Jenkins构建 | GitLab:Webhook官方文档 GitHub:Webhook官方文档 |
操作步骤
- 准备Jenkins环境
- 安装并配置Jenkins Master,详细操作请参见Jenkins Master安装部署。
- 配置Jenkins Agent,确保Agent节点具备Docker构建能力,详细操作请参见Jenkins Agent配置。
- 在Jenkins中添加SWR凭据。
- 在Jenkins页面,选择"系统管理 > Manage Credentials > Jenkins"。
- 单击"Global"域,然后单击"Add Credentials"。
- 配置以下参数:
表2 参数说明 参数
说明
Kind
选择"Username with password"
Username
SWR登录用户名,格式为{区域名}@{账号名}
Password
SWR登录密码
ID
凭据标识(用户自定义),如swr-credentials,后续Pipeline中引用
- 单击"Create"保存凭据。
- 添加 Git 仓库凭据
如果代码仓库为私有仓库,需按相同方式添加 Git 凭据,ID 设置为 git-credentials,与后续 Pipeline 中的 credentialsId 保持一致。
- 添加kubeconfig文件
- 从集群导出 kubeconfig 文件,参考配置文件下载。
- 存入 Jenkins 凭据
在Jenkins页面,选择"系统管理 > Manage Credentials > Jenkins"。
单击"Global"域,然后单击"Add Credentials"。
配置以下参数:表3 参数说明 参数
说明
Kind
选择"Secret file"
File
上传 kubeconfig-prod 文件
ID
凭据标识(用户自定义),如kubeconfig-prod,后续Pipeline中引用
- 创建Jenkins Pipeline
- 在Jenkins页面,单击"New Item"。
- 输入任务名称(如swr-cicd-pipeline),选择"Pipeline",单击"OK"。
- 在"Pipeline"配置区域,选择"Pipeline script",粘贴以下Jenkinsfile脚本。
请根据实际环境替换脚本中的占位符(如<SWR地址>、<命名空间>等)。
pipeline { agent any environment { SWR_REGISTRY = '<SWR地址>' // 如:swr.cn-north-4.myhuaweicloud.com IMAGE_NAME = '<命名空间>/<镜像名称>' // 如:my-namespace/my-app IMAGE_TAG = "${env.BUILD_NUMBER}" // 使用 Jenkins 构建号作为镜像版本 DOCKERFILE_PATH = '-f docker/Dockerfile .' // Dockerfile 路径,可根据实际修改 } stages { stage('Clone') { steps { checkout([ $class: 'GitSCM', branches: [[name: env.GIT_BRANCH ?: 'main']], userRemoteConfigs: [[ url: '<代码仓库地址>', credentialsId: 'git-credentials' ]] ]) } } stage('Build Docker Image') { steps { script { docker.withRegistry("https://${SWR_REGISTRY}", 'swr-credentials') { def app = docker.build( "${SWR_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}", "${DOCKERFILE_PATH}" ) } } } } stage('Push to SWR') { steps { script { docker.withRegistry("https://${SWR_REGISTRY}", 'swr-credentials') { docker.image("${SWR_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}").push() } } } } stage('Deploy to Prod') { steps { input message: '确认部署到生产环境?', ok: '确认部署' withCredentials([file(credentialsId: 'kubeconfig-prod', variable: 'KUBECONFIG')]) { sh """ kubectl set image deployment/<工作负载名称> \ <容器名称>=${SWR_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG} \ -n <生产命名空间> kubectl rollout status deployment/<工作负载名称> -n <生产命名空间> """ } } } } post { success { echo "Pipeline 执行成功!镜像 ${IMAGE_NAME}:${IMAGE_TAG} 已推送并部署。" } failure { echo "Pipeline 执行失败,请检查构建日志。" } } } - 单击"Save"保存Pipeline配置。
