Skip to content

第10章 CI/CD 基础(课程口径) ​

对应简历:技能第14条「熟悉 Git、Jenkins、Ansible 等自动化工具」

诚实口径(全章总基调,先读):简历动词是"熟悉"——CI/CD 流水线部分按课程项目实操 + 理解讲(GitLab+Jenkins 流水线我在课程里从零搭过一遍);生产上的关联点是我配套过业务发布(项目二镜像双轨体系、K8s 滚动更新与回滚、全节点标准化初始化的 IaC 思想)。被问"生产上 CI/CD 跑了多少条流水线"就按这个口径答,不编造——实施岗面试官反感虚,不反感"如实分层"。深度内容(Jenkins 权限加固、分支模型细节、playbook 工程化)回查运维版第 10 章。

10.1 CI/CD 概念与一条典型流水线(课程口径) 【必背】 ​

标准回答(60–90 秒标准讲法): 先给定义:CI 持续集成是开发频繁把代码合入主干,每次提交自动触发构建和测试,让问题在很小很早的阶段暴露;CD 有两个含义——持续交付是构建产物自动流转到准生产、随时可上线但最后发布留人工确认,持续部署是测试通过后全自动上生产,绝大多数企业做到持续交付就停了,因为生产发布必须留人工卡点。一条典型流水线我总结成五个字"提、拉、编、测、查":提,开发 push 到 GitLab,Webhook 触发流水线;拉,Jenkins 拉取指定分支代码;编,mvn 或 npm 构建加 docker build 打镜像;测,单元测试和接口测试,不过就中断并通知开发;查,质量扫描加部署后健康检查,全绿才算发布成功。

这套流水线是我在课程项目里从零搭的,过程完整讲:部署 GitLab 社区版建仓库配 master 保护分支;部署 Jenkins 装 Git/Docker/Pipeline 插件、Credentials 存令牌,写 Jenkinsfile——拉代码、mvn 构建、docker build、推 Harbor、kubectl set image 滚动更新到 K8s、rollout status 等就绪;GitLab 配 Webhook 自动触发。中间踩的典型坑:Jenkins 拉 GitLab 报权限不足——排查是访问令牌没给 api 权限加防火墙未放行端口,补齐解决;部署后服务起不来——旧服务没停端口被占,在流程里加"启动前强制停止旧服务加端口检测"根治。这条课程流水线的价值是把"提交到上线"全流程的手感和原理打通了——工具会换,流程思想是通用的。 实操模板(Jenkinsfile 骨架,可背):

groovy
pipeline {
  agent any
  parameters { choice(name: 'ENV', choices: ['dev','test','prod'], description: '部署环境') }
  environment { REGISTRY = '内网私有仓库地址'; IMAGE = "${REGISTRY}/project/app:${env.BUILD_ID}" }
  stages {
    stage('拉取代码') { steps { checkout scm } }
    stage('构建镜像') { steps { sh 'docker build -t $IMAGE .' } }
    stage('推送仓库') { steps { sh 'docker push $IMAGE' } }
    stage('部署K8s') {
      when { expression { return params.ENV == 'prod' } }
      steps { input '确认发布?'; sh 'kubectl set image deploy/app app=$IMAGE && kubectl rollout status deploy/app' }
    }
  }
  post { always { cleanWs() } }
}

追问链:

  • 迭问1:这套流水线是你生产搭的还是课程搭的? → 答:诚实分层答:流水线整套是课程项目实操,从 GitLab、Jenkins 到 K8s 部署是我从零搭的;生产上我做的是配套环节——移动云集群的私有镜像仓库建设、ImagePullSecret 认证拉取、业务发布的滚动更新和回滚。所以我不虚报生产流水线数量;我讲的是"流水线两端我都有真实体感,中间的调度环节我完整搭过课程版"——对实施岗这个定位,重点是知道发布链路每一环在干什么、出问题找哪环。
  • 迭问2:为什么容器化发布比传 jar 包好? → 答:三个解决不掉的问题被镜像根治:环境一致性——jar 依赖目标机器的 JDK 版本配置,"我这能跑你那不能跑",镜像把代码加依赖加运行环境整体打包;回滚——传包回滚要重传旧包重启,镜像模式就是改一个 tag,秒级;弹性——K8s 的滚动更新、健康探针、副本伸缩都围绕镜像设计。这也是我在第 5 章讲镜像交付价值时的另一面:镜像既是交付物,也是发布策略的基础。
  • 迭问3:蓝绿/灰度/金丝雀一句话? → 答:蓝绿是两套环境整体切换、回滚快但要双倍资源;灰度是新旧并存按比例逐步放量;金丝雀是灰度的最小形态,先放一小撮真实流量探路。K8s 的 Deployment 滚动更新(maxSurge/maxUnavailable 加 readiness 探针)天然具备灰度特性——我们生产用的就是滚动更新,精细流量切分属于演进规划,我理解原理没有生产实操,如实说。

10.2 Git 与 Ansible:实施工程师的够用版 【理解】 ​

标准回答(两件工具各一段): Git 我是日常重度使用——我的部署脚本、初始化基线、Prometheus 配置、方案文档全部进 Git 仓库管理,配置变更前先 commit,出问题 git diff 看改了什么,这是处理"最近变更类"故障的固定习惯。核心概念按三个区域讲:工作区改文件、add 进暂存区、commit 成本地版本、push 到远程。高频命令组:clone/pull/status/add/commit/push 主干;branch/checkout -b/merge 分支;reset 和 revert 的区别必须会——reset 挪指针删历史只适合没 push 的本地提交,revert 生成反向提交保留历史,远程共享分支只能 revert;stash 存现场;reflog 找回丢失提交(HEAD 的操作历史,log 看不到被 reset 断开的提交)。分支与环境对应的概念(dev/test/master 对应三环境、master 保护分支走 MR 评审)我理解并认可,是发布信心的来源——主干永远保持可发布。

Ansible 我按"无 Agent 的批量配置管理工具"讲:被管机只需要 SSH 加 Python,控制节点通过 SSH 推模块执行、收结果——零侵入,不存在 Agent 自己要升级要维护的问题。核心三件:inventory 主机清单(按环境和角色分组,生产测试严格分开,从入口杜绝"打错环境");playbook 用 YAML 描述"对哪组主机按什么顺序执行什么任务",handlers 被 notify 且任务真变更才执行(配置没改不白重启);幂等性——同一剧本跑一次和跑 N 次结果一致,环境漂移了再跑一遍自动收敛回期望状态。我的生产关联:移动云 7 台节点的标准化初始化就是 Ansible 思想的手工版——统一定义期望状态(关 swap、内核模块、sysctl、chrony、containerd 三配置)、先一台验证再全节点一致执行、清单沉淀成文档,新环境照着重放即可复制。这是我能拿出来的 IaC 实证。 追问链:

  • 迭问1:幂等性怎么验证? → 答:最直接的办法:连续执行两次 playbook,第二次输出所有任务 ok、changed 等于 0 就是幂等;哪个任务第二次还 changed 就不幂等——改法是换幂等模块或给 command 加 creates 参数。我的手工版等价验证就是"第二台节点按清单重放,结果与第一台完全一致"——实施交付里"环境一致性"就是幂等性的业务表达。
  • 迭问2:Git 事故急救一句口径? → 答:核心心法"只要提交过,数据大概率还在,先别慌":reset 错了用 reflog 找到哈希再 reset 回去或建救援分支;分支删了同样走 reflog;rebase 搞乱用 rebase --abort 回到开始前。预防三条:重要分支配保护、大操作前先记当前哈希、出事先停手再查,千万别病急乱投医继续操作把现场破坏了。
  • 迭问3:pull 冲突了怎么处理? → 答:Git 会把冲突文件标出 <<<<<<<、=======、>>>>>>> 三段记号,打开文件看清楚两边内容,手工保留正确的内容删掉记号,git add 标记已解决,git commit 完成合并;rebase 中的冲突解决后要 git rebase --continue。预防冲突的办法是勤拉勤推、小步提交——这和实施交付"每步即验"是同一个纪律:变更颗粒度越小,冲突和事故的半径越小。
  • 迭问4:Ansible 常见报错怎么分类处理? → 答:按报错类别对号入座:UNREACHABLE 是 SSH 连不上——先手动 ssh 目标机验证,查免密、防火墙、inventory 地址;权限类报错带 permission denied——加 --become 提权;YAML 语法错跑都不跑直接报行号——九成是缩进不一致或冒号后缺空格(YAML 用空格不用 tab);"could not find requested file"是 src 路径不对——相对路径按 playbook 所在目录解析。通用套路两步:先 ansible 主机 -m ping 分离"连不上",再 --check --list-tasks 干跑分离"跑不对"——把两类问题分开再对号入座。

10.3 诚实边界与生产关联点(主动亮牌) 【必背】 ​

标准回答(被问"你 CI/CD 到底做过什么"的总答案): 这题我主动把口径说清,反而拿分。我的 CI/CD 经验三层:第一层课程实操——GitLab+Jenkins+K8s 的完整流水线从零搭过一遍,包括 Webhook 触发、Jenkinsfile 编写、镜像构建推送、滚动部署,两个典型坑(令牌权限加网络策略、端口占用检测)都是亲手排的;第二层生产配套——这是我的真实强项:镜像双轨体系(公网拉取 → 内网私有仓库托管 → 集群 ImagePullSecret 认证拉取)是流水线"制品分发"环节的生产版,K8s 滚动更新、rollout status 观察、rollout undo 回滚是"部署回滚"环节的生产版——发布链路的两端我天天在用;第三层思想平移——全节点标准化初始化(期望状态统一定义、所有节点收敛一致、可重放复制)就是 IaC 在我交付流程里的落地。

所以面试官问"生产有几条流水线",我的答案是零条日常运维的流水线,但"从代码变成线上服务"这条链上,镜像供给、部署、回滚、环境一致性四个环节我都有生产实操,中间的 Jenkins 编排环节是课程级。这个组合对实施岗是匹配的——实施岗更多是"把别人开发的系统部署交付好",而不是"给开发团队建流水线";真要建,我的课程底子加上生产两端经验,上手没有障碍。主动讲清边界,比被追问穿更体面——这也是我三年实施生涯养成的口径纪律:知道哪实哪虚,虚的地方怎么补。 追问链:

  • 迭问1:如果新公司让你搭 CI/CD,你怎么开始? → 答:我的路径分四步:先问需求——几个环境、多少应用、发布频率,决定流水线的复杂度;再搭骨架——GitLab 私有部署加保护分支模型、Jenkins 加必要插件、私有镜像仓库(这三样我都搭过);然后落第一条流水线——选一个非核心应用做试点,"提拉编测查"跑通并做一次回滚演练;最后推广加纪律——发布窗口、变更四要素(改什么/影响面/验证方式/回退方案)写进制度。第一周出试点,一个月到可用——这个节奏我在课程环境验证过一遍,迁移成本主要在客户环境的权限和网络策略。
  • 迭问2:发布窗口和变更管理你怎么理解? → 答:工具解决"怎么自动发",变更管理解决"敢不敢发、出了事找谁"。我的实践五要素来自银行项目的纪律:发布集中在业务低峰窗口、重大变更避开节前;变更单写清四要素留痕(行业里六成故障和变更相关,排障第一问永远是"最近改了什么");灰度顺序先测试后生产;发布后盯观察期(错误率、延迟、资源、业务指标四类);回滚预案先行——回滚命令在发布前就准备好放手边。"能在五分钟内回滚的发布才是合格的发布",这句话是我在金融环境学到的、也是我自己执行了两年的。

10.4 本章案例 ​

  • 【课程项目】GitLab+Jenkins+Ansible 自动化部署平台(STAR,约 250 字):背景是课程实战,目标是把提交代码到应用上线全流程自动化。任务是我从零搭建整套平台。行动:部署 GitLab 建仓库配 master 保护分支;部署 Jenkins 配 Credentials、写 Jenkinsfile 流水线——拉代码、mvn 构建、docker build、推 Harbor、kubectl 滚动更新;GitLab 配 Webhook 自动触发;Ansible 做虚拟机场景批量部署(inventory 按环境分组,playbook 含停旧服务、分发制品、启动、健康检查)。解决两个问题:Jenkins 拉代码权限不足(令牌缺 api 权限加防火墙未放行);部署后服务起不来(旧服务占端口,增加强制停止加端口检测)。结果:全流程跑通,提交到上线分钟级,回滚一条 rollout undo,沉淀 Jenkinsfile 和 playbook 模板。
  • 【真实项目】移动云标准化初始化(IaC 思想的生产落地,STAR):背景是 7 台 ECS 建生产集群,手工逐台配置必然环境漂移。任务是我负责全节点标准化初始化。行动:制定统一初始化清单——关 swap、加载内核模块、sysctl 调优、chrony 时间同步、containerd 统一配置——先在一台验证,再按清单批量执行到全部节点,清单沉淀成建设方案文档。结果:7 台节点环境完全一致,集群一次搭建成功;后来扩容和重建按文档重放即可复制,资源交付从天级缩短到分钟级。这就是 Ansible"期望状态收敛"思想在我生产环境的真实投影。
  • 【真实项目】镜像双轨体系支撑业务发布(STAR 摘要):背景是业务发布需要安全可控的镜像分发通道。行动:建"公网拉取→内网私有仓库托管→集群认证拉取"双轨,业务 Deployment 挂 imagePullSecrets,配合 kubectl 滚动更新和 rollout undo。结果:节点不直连公网仓库、出口收敛到 NAT 网关,镜像分发全程带认证可审计——发布链路的分发与回滚两端都由我落地(详见第 5 章 5.6 案例)。

10.5 章末自测清单(快问快答) ​

  1. CI 和 CD 的定义? → CI 频繁合主干自动构建测试;持续交付留人工确认,持续部署全自动上生产。
  2. 流水线五字诀? → 提(触发)、拉(拉代码)、编(构建)、测(测试)、查(扫描与健康检查)。
  3. 声明式 Jenkinsfile 五要素? → agent、environment、parameters、stages、post。
  4. 生产发布前的卡点? → input 人工确认(生产环境 stage 加 when 条件)。
  5. Git 四个区域一条线? → 工作区 →add 暂存区 →commit 本地仓库 →push 远程。
  6. reset 和 revert? → reset 挪指针删历史仅本地用;revert 反向提交保留历史,远程共享分支用它。
  7. 找回丢失提交用什么? → reflog(HEAD 操作历史),不是 log。
  8. Ansible 为什么无 Agent 是优点? → 被管机零依赖零侵入,复用 SSH,没有 Agent 自身的运维负担。
  9. handlers 触发条件? → 被 notify 且任务实际 changed,play 结束统一执行一次。
  10. 幂等性怎么验证? → 连跑两次第二次 changed=0;手工版等价验证=第二台节点按清单重放结果一致。
  11. 我的生产关联四环节? → 镜像供给(双轨体系)、部署(滚动更新)、回滚(rollout undo)、环境一致性(标准化初始化)。
  12. 蓝绿/灰度/金丝雀一句话? → 双环境整体切换/按比例放量/最小流量探路;我们生产用滚动更新。
  13. 变更管理五要素? → 发布窗口、变更单四要素留痕、灰度顺序、观察期、回滚预案先行。
  14. 被问"生产几条流水线"怎么答? → 诚实分层:流水线课程实操零条日常运维;生产做过分发与回滚两端加 IaC 初始化——口径清楚不虚报。
  15. 课程流水线踩的两个坑? → 令牌缺 api 权限加防火墙未放行;旧服务占端口需强制停止加检测。