Appearance
本模块聚焦 CI/CD 与流水线设计,涵盖 CI/CD 基础理念、工具选型、流水线架构、发布策略、制品管理和 GitOps 等核心主题,考察候选人的工程化能力和现代化交付理念。
Q1: 什么是CI/CD?CI和CD有什么区别? 「🟢 校招/初级」
考察点:考察 CI/CD 基础概念,筛掉对持续集成、持续交付、持续部署概念混淆的人。
参考答案:
- CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法,核心是持续自动化和持续监控。
CI(Continuous Integration,持续集成):
- 开发人员频繁地将代码变更合并到主干分支,每次合并都通过自动化构建和测试来验证。
- 核心目标:尽早发现问题,让代码始终处于可发布状态。
- 关键实践:
- 代码提交后自动触发构建。
- 自动化测试(单元测试、集成测试)。
- 快速反馈,构建失败立即通知开发者。
- 主干开发(Trunk-Based Development)。
CD(Continuous Delivery,持续交付):
- 在 CI 的基础上,将经过验证的代码自动部署到预发布环境或生产环境。
- 核心目标:让软件随时可以发布,任何时候都能一键部署到生产。
- 特点:部署到生产环境需要人工审批或手动触发。
CD(Continuous Deployment,持续部署):
- 持续交付的延伸,代码变更通过所有自动化验证后,自动部署到生产环境。
- 核心目标:完全自动化的发布流程,从代码提交到生产部署全程无人干预。
- 特点:没有人工审批环节,完全依赖自动化测试和监控保障质量。
CI/CD 流程递进:
代码提交 → 构建 → 测试 → 制品 → 预发布部署 → 生产部署
├── CI 阶段 ────┤
├────── 持续交付 ────────┤ (生产需手动)
└──────── 持续部署 ────────────────┘ (全自动)CI/CD 的价值:
- 快速反馈:问题尽早发现,修复成本更低。
- 降低风险:小步快跑,每次变更影响范围小,容易定位和回滚。
- 自动化效率:减少手动操作,提高交付效率,避免人为失误。
- 质量保障:标准化的构建测试流程,确保每次交付质量一致。
- 缩短上市时间:加快迭代速度,快速响应市场需求。
追问延伸:
- CI/CD 和 DevOps 是什么关系?
- 要实现持续部署需要具备哪些前提条件?
- 你们团队的 CI/CD 流程是怎样的?有哪些阶段?
Q2: 常用的CI/CD工具有哪些?各有什么特点? 「🟡 中级」
考察点:考察工具选型能力和视野广度,筛掉只会用一种工具、对其他方案不了解的人。
参考答案:
1. Jenkins:
- 特点:最老牌、最主流的 CI/CD 工具,Java 开发,开源免费。
- 优势:插件生态极其丰富(上千个插件),几乎可以做任何事情;高度灵活可定制;支持 Master-Agent 分布式架构。
- 劣势:配置复杂,维护成本高;UI 较老旧;插件管理和版本升级容易踩坑;需要自己维护服务器。
- 适用场景:复杂的企业级流水线、有大量定制化需求的团队。
2. GitHub Actions:
- 特点:GitHub 原生的 CI/CD 服务,与 GitHub 深度集成。
- 优势:配置简单(YAML 文件);与 GitHub 生态无缝集成(PR、Issue、Release);有丰富的社区 Actions 市场;支持矩阵构建;免费额度对开源项目友好。
- 劣势:重度使用成本较高;运行环境有限制;复杂场景定制能力不如 Jenkins。
- 适用场景:GitHub 托管项目、中小团队、快速上手。
3. GitLab CI:
- 特点:GitLab 内置的 CI/CD 功能,与 GitLab 仓库深度集成。
- 优势:一体化体验(代码 + CI + 制品 + 安全扫描);配置简洁(
.gitlab-ci.yml);内置 Docker 支持;有 Auto DevOps 功能;支持自托管和 SaaS。 - 劣势:自托管维护成本;功能多但深度不如专业工具。
- 适用场景:使用 GitLab 作为代码仓库的团队,一体化 DevOps 平台。
4. CircleCI:
- 特点:SaaS 为主的 CI/CD 服务,也支持私有部署。
- 优势:速度快、性能好;配置简洁;Docker 原生支持;Orbs 可复用配置包;与 GitHub/Bitbucket 集成好。
- 劣势:价格偏高;国内访问可能较慢。
- 适用场景:海外团队、对构建速度要求高的项目。
5. ArgoCD:
- 特点:声明式 GitOps 持续部署工具,专注于 K8s 部署。
- 优势:Git 作为唯一可信源;声明式配置;自动同步;可视化界面;支持多集群;应用状态可视化。
- 劣势:只做部署(CD),不做构建和测试(CI);需要 GitOps 理念配合。
- 适用场景:Kubernetes 环境下的应用部署、GitOps 实践。
6. 其他工具:
- Travis CI:老牌 SaaS CI,GitHub 项目常用,但近年逐渐式微。
- TeamCity:JetBrains 出品,企业级,功能强大,但商业付费。
- Bamboo:Atlassian 出品,与 Jira 集成好,商业付费。
- Drone:轻量级容器原生 CI,简单高效,社区版免费。
- Tekton:K8s 原生 CI/CD 框架,云原生方向。
选型建议:
- 代码仓库在哪 → 优先选同生态(GitHub → Actions,GitLab → GitLab CI)。
- 团队规模和复杂度 → 简单需求用 SaaS,复杂需求用 Jenkins/自托管。
- 部署目标是 K8s → 考虑 ArgoCD + GitOps 模式。
- 团队技术栈和运维能力 → 平衡功能丰富度和维护成本。
追问延伸:
- 你们团队用的什么 CI/CD 工具?为什么选择它?
- Jenkins 的 Pipeline 有哪两种写法?(声明式 vs 脚本式)
- GitHub Actions 的 runner 是什么?self-hosted runner 有什么风险?
- ArgoCD 的同步策略有哪些?(自动同步、手动同步、Sync Wave)
Q3: 一条完整的流水线应该包含哪些阶段? 「🟡 中级」
考察点:考察流水线设计能力,筛掉只会跑构建命令、对流水线全流程没有整体概念的人。
参考答案:
- 一条完整的 CI/CD 流水线通常包含以下阶段,具体可根据项目类型和需求调整:
1. 代码检出(Checkout / Clone):
- 从代码仓库拉取最新代码,切换到对应分支或 commit。
- 是流水线的起点。
2. 依赖安装(Install / Setup):
- 安装项目依赖(npm install、pip install、go mod download 等)。
- 通常配合缓存机制,加速后续构建。
3. 静态检查(Lint / Static Analysis):
- 代码风格检查(ESLint、Pylint、Checkstyle、golangci-lint)。
- 安全扫描(SonarQube、Semgrep、Gitleaks 检测密钥泄露)。
- 类型检查(TypeScript、mypy)。
- 越早发现问题成本越低,放在测试之前。
4. 单元测试(Unit Test):
- 运行单元测试,验证代码逻辑正确性。
- 生成测试覆盖率报告,设定覆盖率门槛。
- 快速反馈,失败则立即终止流水线。
5. 构建(Build):
- 编译代码、打包产物。
- 前端项目构建静态资源,后端项目编译二进制或 jar 包。
- 构建 Docker 镜像(容器化项目)。
6. 镜像构建与推送(Image Build & Push):
- 使用 Dockerfile 构建镜像。
- 打上正确的标签(版本号、commit hash)。
- 推送到镜像仓库(Harbor、Docker Hub、云厂商镜像服务)。
- 可选:镜像安全扫描(Trivy)。
7. 部署(Deploy):
- 部署到对应环境(开发、测试、预发、生产)。
- 部署方式:kubectl apply、Helm upgrade、ArgoCD 同步、Serverless 部署等。
- 生产环境部署通常需要人工审批。
8. 集成测试(Integration Test):
- 部署完成后运行集成测试,验证服务间交互。
- 接口测试、端到端测试(E2E)。
- 自动化回归测试。
9. 安全扫描(Security Scan):
- 依赖漏洞扫描(SCA)。
- 容器镜像扫描。
- 基础设施即代码(IaC)扫描。
- 可以根据严重程度决定是否阻断。
10. 通知(Notification):
- 流水线结果通知(成功/失败)。
- 通知渠道:邮件、企业微信/钉钉、Slack、飞书。
- 失败时及时通知相关责任人。
完整流水线示例:
Checkout → Install → Lint → Unit Test → Build → Image → Deploy(测试) → E2E → Deploy(生产) → Notify
↑
人工审批门最佳实践:
- 失败快速(Fail Fast):快的阶段放前面,尽早发现问题。
- 并行执行:独立的任务并行运行,减少总耗时。
- 缓存优化:依赖、构建缓存,加速重复执行。
- 环境一致性:构建环境标准化,避免"我本地能跑"问题。
- 可观测性:日志、指标、告警,流水线状态一目了然。
- 安全左移:安全检查尽早做,而不是留到最后。
追问延伸:
- 流水线太慢了怎么优化?(缓存、并行、按需触发、分布式构建)
- 什么是流水线即代码(Pipeline as Code)?有什么好处?
- 前端项目和后端项目的流水线有什么不同?
- 如何保证多环境部署的一致性?
Q4: 什么是蓝绿部署、金丝雀发布、滚动更新? 「🔴 高级」
考察点:考察发布策略的理解和选型能力,筛掉只会一键部署、不了解发布风险控制的人。
参考答案:
- 这三种是常见的应用发布策略,核心目标是降低发布风险、实现平滑过渡。
1. 滚动更新(Rolling Update):
- 原理:逐步用新版本替换旧版本,一个批次一个批次地更新实例,直到全部替换完成。
- 过程:启动少量新 Pod → 验证正常 → 增加新 Pod 比例 → 减少旧 Pod → 循环直到全部更新。
- 优点:
- 不需要额外的服务器资源。
- 实现简单,K8s Deployment 默认策略。
- 用户无感知,服务不中断。
- 缺点:
- 发布过程中两个版本同时运行,需要考虑兼容性问题。
- 回滚速度较慢(需要反向滚动)。
- 发布过程中无法精确控制流量比例。
- 适用场景:绝大多数常规发布,对兼容性有保障的应用。
2. 蓝绿部署(Blue/Green Deployment):
- 原理:同时部署两套完全相同的环境(蓝色=旧版本,绿色=新版本),通过流量切换实现发布。
- 过程:部署新版本到绿环境 → 测试验证 → 将流量全部切换到绿环境 → 蓝环境保留用于回滚。
- 优点:
- 发布瞬间完成(流量切换)。
- 回滚简单快速(切回蓝环境即可)。
- 新版本可以完整测试后再切流量。
- 缺点:
- 需要两倍的服务器资源,成本高。
- 数据库兼容性问题需要特别处理(两个版本共用数据库)。
- 流量是瞬间切换的,可能对系统造成冲击。
- 适用场景:对发布可靠性要求高、有充足资源、需要快速回滚能力的场景。
3. 金丝雀发布(Canary Release):
- 原理:先将一小部分流量(如 1%、5%)引导到新版本,观察新版本运行情况,如果正常则逐步扩大流量比例,直到 100%。
- 过程:部署少量新版本实例 → 导入少量流量 → 观察监控指标 → 逐步增加流量 → 全量发布。
- 优点:
- 风险最小,影响范围可控。
- 真实流量验证,发现问题影响小。
- 可以精细控制流量比例。
- 缺点:
- 实现复杂,需要流量控制能力(Ingress、服务网格、LB 权重)。
- 发布周期长,需要多轮观察和调整。
- 两个版本共存时间长,兼容性要求高。
- 适用场景:核心业务、重大版本更新、对稳定性要求极高的场景。
三种策略对比:
策略 资源开销 发布速度 回滚速度 风险控制 实现复杂度
滚动更新 低 中 中 中 低
蓝绿部署 高 快 快 高 中
金丝雀发布 中 慢 快 最高 高灰度发布 vs 金丝雀发布:
- 灰度发布是一个更宽泛的概念,指逐步放量的发布方式,金丝雀是灰度的一种具体实现。
- 灰度发布还可以按用户维度(如内部用户、白名单用户)进行,金丝雀通常按流量比例。
追问延伸:
- K8s Deployment 的滚动更新是怎么实现的?maxSurge 和 maxUnavailable 怎么配置?
- 金丝雀发布需要哪些基础设施支持?(Ingress Controller、服务网格、流量治理)
- 如何判断金丝雀发布是否成功?看哪些指标?(错误率、延迟、资源使用、业务指标)
- 数据库变更如何配合蓝绿/金丝雀发布?(双向兼容、分阶段 schema 变更)
Q5: 如何设计高质量的CI/CD流水线? 「🔴 高级」
考察点:考察流水线架构设计能力和工程化思维,筛掉只会写简单流水线、不关注效率和质量的人。
参考答案:
- 高质量的 CI/CD 流水线需要在速度、质量、成本、可靠性之间取得平衡。
1. 流水线架构设计:
- 分层设计:CI 阶段(构建测试)和 CD 阶段(部署)分离,CI 通过后才能进入 CD。
- 多环境流水线:开发 → 测试 → 预发 → 生产,逐级晋升,每级有质量门禁。
- 模块化/复用:将常用步骤封装为可复用组件(Jenkins Shared Library、GitHub Actions Reusable Workflow、GitLab CI Include)。
- Pipeline as Code:流水线定义代码化,和代码一起版本管理。
2. 速度优化:
- 缓存优化:
- 依赖缓存(node_modules、maven 仓库、go mod)。
- 构建缓存(Docker layer cache、构建产物缓存)。
- 工具缓存(SDK、CLI 工具)。
- 并行执行:
- 独立任务并行运行(如单元测试和代码检查并行)。
- 测试分片(Test Sharding):将测试用例拆分到多个 Job 并行执行。
- 矩阵构建:多版本、多平台并行构建。
- 增量构建:只构建变更影响的模块,适合 monorepo。
- 分布式构建:利用多台机器并行构建,提高吞吐量。
- 失败快速(Fail Fast):最快失败的步骤放前面,尽早终止无效执行。
3. 质量保障:
- 质量门禁(Quality Gate):
- 测试覆盖率门槛。
- 代码质量评分(SonarQube)。
- 安全漏洞阻断(高危漏洞不允许合并)。
- 性能基线(性能下降超过阈值阻断)。
- 测试金字塔:单元测试多、集成测试适中、E2E 测试少,平衡速度和覆盖。
- 安全左移(Shift Left):
- 代码提交前的 pre-commit 检查。
- 依赖漏洞扫描尽早做。
- IaC 安全扫描。
- 镜像漏洞扫描。
4. 可靠性设计:
- 环境一致性:
- 容器化构建,保证构建环境一致。
- 配置与代码分离,环境配置统一管理。
- 可重试机制:网络等偶发失败的步骤自动重试。
- 幂等性:流水线步骤可以安全重复执行,不会产生副作用。
- 版本可追溯:每个制品关联代码 commit、构建号、流水线记录,可追溯可回滚。
5. 可观测性:
- 结构化日志:流水线日志清晰、可搜索。
- 指标监控:构建时长、成功率、失败率、队列等待时间。
- 告警通知:失败及时通知,分级告警。
- 可视化看板:流水线状态一目了然。
6. 安全设计:
- 密钥管理:凭证使用专用的密钥管理服务,不硬编码在代码或配置中。
- 最小权限:流水线权限按需分配,不同环境不同权限。
- 签名校验:制品签名、镜像签名,防篡改。
- 供应链安全:SBOM(软件物料清单)、依赖签名验证。
高质量流水线特征:
快 ─── 缓存 + 并行 + 增量
稳 ─── 一致性 + 幂等 + 重试
准 ─── 质量门禁 + 安全左移
明 ─── 可观测 + 可追溯追问延伸:
- 什么是 monorepo?monorepo 下的流水线有什么挑战和优化手段?
- 如何衡量一条流水线的好坏?有哪些关键指标?(DORA 指标)
- 什么是 DORA 指标?(部署频率、变更前置时间、变更失败率、平均恢复时间)
- 流水线安全有哪些常见风险?(凭证泄露、供应链攻击、恶意代码注入)
Q6: 制品管理怎么做?有哪些注意事项? 「🟡 中级」
考察点:考察制品管理和 DevOps 工程化能力,筛掉对制品管理没有概念、构建完就不管的人。
参考答案:
- 制品(Artifact)是构建过程的产出物,如 jar 包、npm 包、Docker 镜像、二进制文件、Helm Chart 等。
- 制品管理是 CI/CD 的重要环节,负责制品的存储、版本管理、分发和安全。
常用制品仓库:
- Harbor:开源的容器镜像仓库,支持镜像扫描、复制、RBAC,云原生首选。
- Nexus Repository:Sonatype 出品,支持多种格式(Maven、npm、Docker、PyPI 等),功能全面。
- JFrog Artifactory:企业级制品仓库,支持格式最全,功能强大,商业付费。
- 云厂商制品服务:阿里云 ACR、腾讯云 TCR、AWS ECR、GCP GAR。
- 各语言官方仓库代理:npm、PyPI、Maven Central 等。
核心管理要点:
版本管理:
- 语义化版本(Semantic Versioning):
主版本.次版本.修订号。 - 镜像标签规范:版本号 + git commit hash,避免使用 latest 导致不可追溯。
- 构建号与版本关联,每个制品可追溯到源码和流水线。
- 语义化版本(Semantic Versioning):
元数据管理:
- 制品附带构建信息(构建时间、构建人、commit、流水线号)。
- 质量状态(是否通过测试、安全扫描结果)。
- 环境标记(dev/test/prod)。
权限控制:
- 基于角色的访问控制(RBAC)。
- 不同环境使用不同仓库或不同权限。
- 生产环境制品仓库严格控制写入权限。
清理策略:
- 定期清理过期快照版本(SNAPSHOT)。
- 保留策略:按版本数、按时间、按重要级别。
- Docker 镜像清理悬空镜像(dangling images)。
- 控制存储成本,避免仓库无限膨胀。
安全与校验:
- 镜像安全扫描(漏洞检测)。
- 制品签名与校验(防止篡改)。
- 软件物料清单(SBOM)。
- 敏感信息检测(防止密钥、密码打包进制品)。
分发与加速:
- 多地域镜像复制和同步。
- CDN 加速下载。
- 就近访问,提升部署速度。
最佳实践:
- 单一可信源:所有制品统一管理,来源可追溯。
- 不可变制品:制品一旦发布就不可修改,修改需要发新版本。
- 晋升机制:制品通过测试验证后,从开发仓库晋升(Promote)到生产仓库,而不是重新构建。
- 缓存与代理:对公共仓库设置代理缓存,加速下载,避免重复下载。
- 备份与容灾:重要制品定期备份,防止数据丢失。
追问延伸:
- 什么是制品晋升(Promotion)?为什么要做制品晋升?
- Docker 镜像的多层存储对清理策略有什么影响?
- 什么是软件物料清单(SBOM)?为什么越来越重要?
- 如何防范制品供应链攻击?(签名验证、来源可信、漏洞扫描)
Q7: GitOps是什么?和传统CI/CD有什么区别? 「🔴 高级」
考察点:考察现代化部署理念和云原生知识,筛掉对 GitOps 没有概念、还停留在传统 push 模式的人。
参考答案:
- GitOps 是一种以 Git 为核心的持续部署方式,将基础设施和应用配置以声明式的方式存储在 Git 仓库中,通过自动化工具使生产环境与 Git 中声明的状态保持一致。
GitOps 的核心理念:
- Git 是单一可信源(Single Source of Truth):所有基础设施和应用配置都在 Git 中管理,包括版本控制、代码审查、审计历史。
- 声明式配置:描述"期望状态"而非"执行步骤",由工具自动对齐实际状态。
- Pull 模式:部署代理(Operator)主动拉取 Git 中的变更并应用到集群,而不是 CI 系统推送。
- 持续调和(Continuous Reconciliation):不断对比实际状态和期望状态,不一致则自动修正。
GitOps vs 传统 CI/CD:
| 维度 | 传统 CI/CD | GitOps |
|---|---|---|
| 部署模式 | Push 模式:CI 系统执行部署命令推送到环境 | Pull 模式:集群内的 Agent 主动拉取并应用 |
| 配置位置 | 配置散落在 CI 脚本、流水线、环境变量中 | 所有配置统一在 Git 仓库中管理 |
| 环境一致性 | 依赖脚本正确性,容易出现配置漂移 | 声明式 + 自动调和,环境始终与 Git 一致 |
| 权限模型 | CI 系统需要所有环境的部署权限 | 集群内 Agent 操作,CI 不需要集群访问权限 |
| 可观测性 | 需要自己追踪部署状态 | 工具提供部署状态可视化,自动同步状态 |
| 回滚方式 | 重新执行部署脚本或重新运行流水线 | Git revert 即可回滚,操作简单一致 |
| 审计 | 需要整合 CI 日志和部署记录 | Git 提交历史就是完整的审计日志 |
GitOps 的工具:
- ArgoCD:最流行的 GitOps 工具,CNCF 毕业项目,功能丰富,UI 友好。
- Flux:CNCF 毕业项目,轻量级,K8s 原生,与 Helm/Kustomize 深度集成。
GitOps 的工作流程:
开发者提交代码 → CI 构建测试 → 推送镜像 → 更新 Git 配置仓库
↑
ArgoCD 监听变化
│
▼
同步到 K8s 集群
↑
持续调和状态GitOps 的优势:
- 安全性:CI 系统不需要集群访问权限,减少攻击面;Git 的提交历史天然是审计日志。
- 可靠性:声明式 + 自动调和,减少人为操作失误;配置漂移自动修正。
- 一致性:所有环境用同一套 Git 工作流,操作方式一致。
- 可回滚:Git revert 就是回滚,简单可靠。
- 协作友好:代码审查(PR/MR)流程同样适用于配置变更。
GitOps 的局限和挑战:
- 适合 K8s 和声明式基础设施,对传统部署方式不太适用。
- 学习曲线:需要理解声明式配置和 GitOps 工具。
- 密钥管理:Git 中不能明文存敏感数据,需要配合 Sealed Secrets、SOPS 或外部密钥管理。
- 多集群管理复杂度上升。
追问延伸:
- ArgoCD 和 Flux 怎么选?各有什么特点?
- GitOps 中如何管理敏感信息(Secret)?
- 什么是配置漂移(Configuration Drift)?GitOps 怎么解决?
- GitOps 只适合 K8s 吗?传统虚拟机环境能不能用 GitOps?