CI/CD · 自动化交付 · 运维工程师

CI/CD 自动化
发布平台建设

主导建设统一 CI/CD 自动化发布平台,实现从代码提交到生产部署全流程标准化与自动化,解决发版依赖人工、流程不规范、环境差异大、风险高的问题。

项目周期2024.06 – 2025.10
核心引擎Jenkins Pipeline
环境四套独立流水线
我的角色整体设计主导
⚠️ 提示:本页面试问答与代码示例为基于项目技术栈整理的草稿,请逐条核对,确认是你真实做过、能讲清楚的内容后再用于面试。
📋项目概述
背景、目标与我的职责
项目背景

研发团队发版依赖人工操作、流程不规范、各环境差异大、发布风险高、周期长。本项目主导建设统一 CI/CD 自动化发布平台,把从代码提交到生产部署的全流程标准化、自动化,让发布可控、可追溯、可回滚。

我的职责
  • 负责 Jenkins Pipeline 整体设计,基于 Jenkinsfile 实现全链路自动化
  • 设计开发/测试/预发/生产四套环境独立流水线,配置经 Ansible 统一管理
  • 基于 Docker + Harbor 构建统一镜像管理规范,推动全团队镜像标准化
  • 对接钉钉 API 实现发布通知与审批流程
  • 建立一键回滚机制,支持回滚至任意历史版本
技术栈
JenkinsDockerKubernetes GitGitLabHarbor AnsibleShell钉钉 API
🔀流水线设计
从代码提交到生产部署的全链路
CI 阶段(持续集成)
代码提交 GitLab
单元测试
代码扫描
镜像构建
推送 Harbor
CD 阶段(持续部署)
钉钉审批
自动部署 K8s
健康检查
一键回滚
四套环境独立流水线
开发 dev
测试 test
预发 staging
生产 prod
⚙️核心能力详解
平台的关键差异化能力
① Jenkinsfile 全链路自动化

用声明式 Pipeline 把代码提交→单元测试→代码扫描→镜像构建→推送 Harbor→自动部署串成一条流水线,全程无人工干预。

// Jenkinsfile 声明式流水线骨架 pipeline { agent any stages { stage('测试') { steps { sh 'mvn test' } } stage('代码扫描'){ steps { sh 'sonar-scanner' } } stage('构建镜像'){ steps { sh 'docker build -t $HARBOR/app:$TAG .' } } stage('推送') { steps { sh 'docker push $HARBOR/app:$TAG' } } stage('部署') { steps { sh 'kubectl set image ...' } } } }
② 四环境独立流水线

dev/test/staging/prod 四套环境各自独立流水线,环境差异(域名、副本数、配置)通过 Ansible 统一管理,避免"测试好的到生产就出问题"。

③ 钉钉审批与通知

对接钉钉 API:生产发布前推送审批卡片,负责人点同意才放行;关键节点(构建完成、部署成功/失败)自动推送通知,整个发布过程透明可追溯。

④ 一键回滚机制

每次发布的镜像版本和部署记录都留存,出问题时一键回滚到任意历史版本,大幅缩短发布失败的恢复时间。

# K8s 原生回滚(保留历史版本) kubectl rollout undo deployment/app --to-revision=3 # 回滚到指定版本 kubectl rollout history deployment/app # 查看版本历史
⑤ 统一镜像规范

Docker + Harbor 统一镜像命名、tag 规范(如 服务名:环境-commitID),推动全团队镜像标准化,缩短镜像构建时间。

📈项目成果
数值请按实际填写
发布周期
大幅缩短
人工干预
↓ 减少
回滚时间
分钟级
发布可追溯
100%
建议替换为量化数字,如「发版从半天缩到 X 分钟」「回滚从 X 分钟缩到 1 分钟」,越具体越有说服力。
🎤面试项目介绍话术
约 50 秒口述脚本
💬 推荐话术 · 50秒版本
"我主导建设过一个统一的 CI/CD 自动化发布平台(停顿) 之前团队发版靠人工,流程不规范、环境差异大、风险高。我基于 Jenkins Pipeline 设计了全链路自动化, 从代码提交、单元测试、代码扫描、镜像构建、推 Harbor 到自动部署,一条流水线跑完。 我做了 开发、测试、预发、生产四套独立流水线,环境配置用 Ansible 统一管理。 发布安全这块,我对接 钉钉 API 做审批和通知,生产发布要审批才放行,关键节点自动推送。 还建了 一键回滚机制,出问题能快速回滚到任意历史版本。 整体把发布周期大幅缩短,人工干预减少,发布过程透明可追溯。"
面试常见问题
点击展开查看答题思路(请核对真实性)
Q1这个 CI/CD 平台和你简历里 GitOps 流水线、ACK 项目有什么区别?+

这个问题很可能被问,因为三处都涉及 CI/CD,要讲清侧重点不同:

  • 本项目:聚焦"发布平台"本身——流水线设计、四环境规范、审批流、回滚机制,是把发布这件事产品化、标准化。
  • ACK 项目:聚焦"上云改造",CI/CD 只是其中一环,重点在容器化迁移和可观测。
  • GitOps:是发布模式的演进——以 Git 为唯一可信源,声明式同步,更偏理念。
关键:别让面试官觉得你"同一件事写了三遍"。强调本项目的差异化抓手是审批流 + 一键回滚 + 四环境治理。
Q2声明式 Pipeline 和脚本式 Pipeline 怎么选?+
  • 声明式:结构化、易读、有固定语法骨架(pipeline/stages/steps),团队协作和维护友好,大多数标准流水线用它。
  • 脚本式:本质是 Groovy,灵活度高,适合复杂逻辑、动态生成 stage 的场景。
  • 实践:主体用声明式保证规范统一,个别复杂逻辑用 script 块嵌入脚本式,两者可混用。
Q3生产发布失败了,怎么快速回滚?回滚要注意什么?+
  • K8s 层回滚:kubectl rollout undo 回滚 Deployment 到上一版本或指定 revision,靠 K8s 保留的 ReplicaSet 历史。
  • 镜像版本管理:每次发布镜像 tag 唯一(带 commitID),回滚就是把 Deployment 镜像换回旧 tag。
  • 注意数据库:代码能回滚,但数据库 schema 变更不能简单回滚——要做向前兼容的迁移,这是回滚最大的坑。
  • 回滚后告警:回滚也要走通知,让相关人知道,并触发故障复盘。
加分点:主动提"数据库变更不可逆"这个坑,说明你考虑过回滚的真实边界,不是只会敲命令。
Q4四套环境的配置差异是怎么管理的?怎么保证一致性?+
  • 配置外置:环境差异(域名、副本数、资源、外部地址)不写进镜像,镜像在所有环境完全一致,只有配置不同。
  • Ansible 统一管理:各环境基础配置用 Ansible Playbook 维护,可复现、可审计。
  • 镜像不可变:同一个镜像从 dev 一路晋级到 prod,杜绝"重新构建导致环境不一致"。
  • 预发兜底:staging 尽量贴近生产,上生产前最后一道验证。
Q5钉钉审批是怎么对接的?审批没通过流水线怎么处理?+
  • 对接方式:Jenkins 在生产部署 stage 前调用钉钉自定义机器人/工作流 API,推送审批卡片。
  • 阻塞等待:流水线用 input 步骤或轮询审批结果,等到审批通过才继续,超时则自动终止。
  • 未通过:审批拒绝则流水线标记为 ABORTED,不部署,并通知发起人。
  • 可追溯:谁发起、谁审批、什么时间,都有记录,满足合规要求。