CI/CD 基础概念与流水线

这一章我们来聊聊 CI/CD 到底是个啥。说白了两件事:持续集成(CI) 和 持续部署(CD)。很多团队把 CI/CD 挂嘴边,但真到上线时才发现“我 Jenkins 跑完了手动点个部署按钮也叫 CD?”。嗯,这里要把概念先捋清楚。

持续集成(CI),你代码合进去了没?

持续集成不是某个工具,是一种开发实践。它要求开发人员频繁地将代码合并到主干,每次合并都触发自动化构建和测试,第一时间发现集成错误。

我记得刚入行时,公司还是两周一合并,Merge 时冲突能改一下午。后来我强行推了 CI,每天至少合两次,冲突几乎消失了,质量反而更稳。避坑指南:我曾经见过团队把 CI 当作“只编译不测试”的流水线,结果线上跑炸了才发现单元测试全失败。所以我建议——CI 流水线至少要包含:编译、单元测试、代码静态检查、安全扫描。

持续部署(CD),代码自动上线的最后一公里

持续部署是在 CI 的基础上,把通过测试的构建产物自动推送到生产环境。注意是自动,不需要人去点鼠标。很多人会把“持续交付”和“持续部署”混着用。我习惯这么区分:

概念 定义 关键特征
持续交付 代码随时可以发布到生产——但需要手动触发 人工审批+自动部署
持续部署 代码合并后直接自动部署到生产 全自动、无人工干预

你想想看,如果是金融支付类业务,你敢不敢全自动部署?我个人的经验:密码改造这种敏感改动,前期走持续交付更安全,灰度放量一两周后再切到持续部署。

CI/CD 流水线长什么样?

一条典型的 CI/CD 流水线包含下面几个阶段。我把它画成了一张图,方便你建立整体认识。

CI/CD 流水线核心阶段 代码提交 编译构建 自动化测试 制品归档 部署到测试环境 安全基线扫描 生产发布 密码改造关注点:安全基线扫描阶段会检查硬编码密码、弱加密算法、凭据泄露。

你看,从代码提交到生产发布,中间插入了安全基线扫描。密码改造正是在这个环节嵌入的。我参与的项目里,很多团队把安全扫描放在最后一步,结果发现问题时回滚成本巨大。我个人建议:“安全左移”,比如把密码静态扫描放到编译步骤之后、测试之前。

常用工具选型,怎么挑?

现在 CI/CD 工具多如牛毛,我挑几个主流的给你列一下。不是要你全用,而是根据团队规模和场景选。

工具 类型 部署方式 我使用过的场景
Jenkins 自建型 CI/CD 裸机/容器 老旧项目改造,插件生态丰富,但维护成本高
GitLab CI 托管+自建 容器/云 代码仓库自带流水线,配置简单,适合中小团队
GitHub Actions 托管型 云(GitHub) 开源项目+内部SaaS,市场模板多,但国内访问慢
Drone CI 轻量自建 容器 K8s 环境首选,配置用 YAML,简单高效
CircleCI 托管型 云 并行构建快,缓存机制好,收费较高

选型时我会问三个问题:

  • 团队有没有运维能力?有的话上 Jenkins 或 Drone,自定义强;没有就选 GitLab CI 或 GitHub Actions。
  • 密码改造需要引入第三方安全插件,工具对自定义插件的支持怎么样?Jenkins 插件市场最全,GitLab CI 可以通过自定义镜像解决。
  • 能不能和现有的密码管理平台(比如 HashiCorp Vault、CyberArk)集成?直接影响改造工程化程度。
Tip:我习惯在流水线的环境变量阶段把密码从 Vault 动态拉取,而不是写在 .env 文件里。GitLab CI 的 CI_JOB_ 配合 Vault Secret 插件,可以做到运行时注入,不留痕迹。

流水线配置示例(GitLab CI 片段)

下面是一个包含密码安全扫描的极简 .gitlab-ci.yml 示例。你复制到项目中就能跑起来。

stages:
  - build
  - test
  - security-scan
  - deploy

build-job:
  stage: build
  script:
    - echo "编译代码..."
    - npm ci

test-job:
  stage: test
  script:
    - echo "运行单元测试..."
    - npm test

security-scan-job:
  stage: security-scan
  image: registry.gitlab.com/security-tools/secrets-scanner:latest
  script:
    - secrets-scanner scan --path . --exclude node_modules
  artifacts:
    paths:
      - security-report.json
  only:
    - master

deploy-job:
  stage: deploy
  script:
    - echo "部署到 staging..."
  environment:
    name: staging
  needs:
    - test-job
    - security-scan-job
Warning:安全扫描如果发现密码硬编码(比如 “password=123456” 这种),流水线应该直接失败。我曾经见过一个团队把扫描结果只当告警,结果密码随着镜像一起流到生产 —— 不得不回滚三个版本,代价惨重。

项目中的选型决策清单

好了,说了这么多,接下来我给你一个可以直接抄作业的决策表。当你接到密码改造任务时,按照下表对号入座:

  1. 团队人数 < 20 人 → 选 GitLab CI 或 GitHub Actions,开箱即用,不必折腾。
  2. 团队人数 20-100 人 → 选 Jenkins 或 Drone CI,可定制、可审计、可集成密码扫描插件。
  3. K8s 环境占比高 → Drone CI + ArgoCD,真正的云原生流水线。
  4. 监管要求严格(金融、政务) → 自建 Jenkins,全部离线部署,安全扫描 stage 必须有强制阻断。
  5. 需要引入动态凭据管理 → 无论选哪个工具,确保它支持 Vault 或 CyberArk 的 secret 注入。

总结一下:CI/CD 不是买个工具装上就完事,它是一套工程化实践。密码改造的成败很大程度取决于流水线是否能把安全扫描变成“必过门”,而不是“可选步骤”。我建议你在正式改造前,先用一个小项目跑通上面示例的流水线,再逐步扩展到全量。