CI/CD 简介与持续集成基础概念

咱们先从一个最实际的问题聊起——你写代码,测试,然后合并。听起来挺简单,对吧?但就在这个过程中,我见过太多团队因为集成环节崩溃而焦头烂额。我自己也踩过坑,有一次提交了一个看似无害的小改动,结果整个 CI 环境启动就崩了,排查了大半天才发现是环境变量冲突。从那以后,我特别重视 CI/CD 的基础概念,因为这些底层逻辑对了,后面才能稳。

什么是持续集成?

持续集成,说白了就是:频繁地把代码变更合并到主干,并自动进行构建和测试。它的核心目标是尽早发现问题,而不是等到上线前一夜才发现冲突。

我记得早年做的一个项目,团队十几个人,每个人都在自己的分支上开发,一两个月才合并一次。结果每次合并都要花两天时间解决冲突,测试还经常漏掉关键错误。后来我们推行了 CI,每个提交都触发自动构建和测试,问题从“周末加班的噩梦”变成了“当天下午就能修好的小事”。

持续交付 vs 持续部署

这两个概念容易混淆。我画了个简单的对比表,你看一眼就明白:

概念 核心含义 是否自动部署到生产 典型场景
持续集成(CI) 自动构建+自动测试 否 每次提交代码后自动跑单元测试
持续交付(CD) CI + 自动部署到类生产环境 否(需要手动点按钮) 自动部署到测试环境,生产环境手工确认
持续部署(CD) CI + 自动部署到生产 是 每次通过测试的代码直接上线

你想想看,大部分团队其实做到 CI 就已经够用了。持续部署门槛高,需要非常完善的监控和回滚机制。我个人建议从 CI 开始,别急着一步到位。

CI 核心流程

一个典型的 CI 流水线包含这么几个环节:

  1. 代码提交——触发流水线
  2. 拉取代码——从仓库获取最新版本
  3. 构建——编译、打包、生成产物
  4. 静态检查——代码规范、安全扫描
  5. 单元测试——跑最快的测试
  6. 集成测试——混合模块一起测
  7. 发布——生成可部署的产物

嗯,这里要注意:很多人以为流水线越长越好,其实不然。我在项目里见过一条流水线跑了快一个小时,开发体验极差。正确做法是“快速反馈优先”,把单元测试和构建放在前面,耗时的集成测试和性能测试放在后面,甚至可以按需触发。

关键原则:每个环节保持可重复、可自动化、可追溯。如果某个环节需要人工干预,那它就不算真正的 CI。

常见工具一览

工具选择直接影响 CI 环境的稳定性。我整理了一些主流工具的特点:

工具 主要特点 适用场景
Jenkins 老牌、插件丰富、可自托管 大型企业、定制化需求高
GitLab CI 集成在 GitLab 中、配置简单 中小团队、全栈 CI/CD 平台
GitHub Actions 与 GitHub 无缝衔接、市场丰富 开源项目、小团队
CircleCI 速度优化、支持并行 快速迭代的 SaaS 团队
Travis CI 开源项目免费、简单 早期开源项目

我个人习惯先用 GitLab CI 或 GitHub Actions 起步,因为他们的 YAML 配置直观,出了问题也容易排查。等团队规模大了,再考虑 Jenkins 的自定义能力。

一个简单的 CI 配置示例

以 GitLab CI 为例,一个基础的流水线配置长这样:

stages:
  - build
  - test
  - deploy

build_job:
  stage: build
  script:
    - npm install
    - npm run build
  artifacts:
    paths:
      - dist/

test_job:
  stage: test
  script:
    - npm run test
  dependencies:
    - build_job

deploy_job:
  stage: deploy
  script:
    - echo "Deploying to staging..."
  only:
    - main

注意看,artifacts 可以把构建产物传递给后续阶段,避免重复构建。我曾经因为没配置 artifacts,导致测试阶段又从头编译一次,浪费了不少时间。

避坑指南

我曾经踩过一个坑:直接把测试环境配置写死在流水线里。后来一迁移服务器,所有环境变量都要改,排查到崩溃。从那以后,我坚持把所有敏感信息(、数据库密码、环境差异)都用 CI 的变量管理功能,再也不要硬编码。

还有一个常见问题:依赖缓存。如果你用的包管理工具(npm、pip、maven)没有配置缓存,每次构建都会重新下载依赖,直接拉长流水线几分钟。我建议在 CI 配置中加上缓存策略,比如 GitLab CI 的 cache 关键字:

cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - node_modules/

本章知识体系

为了让你对整体有个直观印象,我画了一张流程图,把 CI/CD 的核心概念串联起来:

CI/CD 核心概念框架 持续集成(CI) ① 代码提交 ② 构建(编译、打包) ③ 测试(单元+集成) ④ 代码检查 & 安全扫描 持续交付 / 持续部署(CD) 持续集成通过后 ⑤ 集成测试 / 环境部署 ⑥ 验收测试 / 性能测试 ⑦ 发布(生产/类生产) ⑧ 监控 & 反馈 🔁 每个阶段发现问题,立即回退流水线,开发者得到快速反馈

实践要点总结

  • 快速反馈——流水线越短越好,10分钟内给出结果
  • 可重复环境——用容器化(Docker)统一开发、测试、生产环境
  • 分支策略——建议用 Trunk-based 或短生命特性分支,别让分支活太久
  • 失败优先——一旦构建失败,立即停止下游流程,通知相关人

一个小建议:第一次搭建 CI 时,别追求完美。先跑通最简单的“提交即构建”,再逐步加测试、加代码检查。我见过不少团队一开始就想把所有环节都塞进去,结果光调配置就花了一周,反而失去了启动的动力。

好了,这一章的基础概念就聊到这里。后面我们会深入 CI 环境启动时崩溃的具体场景,以及如何用持续集成的手段去排查和修复。到时候我会分享更多真实案例,包括我自己遇到的那些“血泪教训”。