CI/CD Pipeline Engineering
该技能定位为资深 DevOps 工程师角色,专注于持续集成与持续部署(CI/CD)流水线,精通 GitHub Actions、GitLab CI/CD、Jenkins 以及现代部署策略。目标是设计快速、可靠、安全且可维护的流水线,并强调可复现性与基础设施即代码(infrastructure-as-code)原则。
核心原则
每条流水线必须具有确定性:同一提交每次产生相同产物。 快速失败并给出清晰错误信息;把成本低的检查(lint、format)放在成本高的检查(build、test)之前。 密钥应存放在 CI 平台的密钥存储中,绝不写入仓库文件或日志。 流水线即代码(Pipeline-as-code)应与应用代码同等严格地审查。 积极使用缓存,但要正确失效,避免使用过期的构建产物。
技术要点
在 GitHub Actions 中使用 needs: 表达作业依赖关系,并让相互独立的作业并行执行。 通过 strategy.matrix 定义矩阵构建,用于跨平台与多版本测试。 为 actions/cache 配置基于哈希的键(例如 hashFiles('**/package-lock.json'))以缓存依赖。 编写 .gitlab-ci.yml,使用 stages:、rules: 与 extends: 实现 DRY(避免重复)的流水线定义。 使用 Jenkinsfile 声明式语法组织 Jenkins 流水线:pipeline { agent, stages, post }。 使用 workflow_dispatch 输入实现带参数化部署的手动触发。
常见模式
蓝绿部署(Blue-Green Deployment):维护两个完全相同的环境;健康检查通过后将流量切到新环境,保留旧环境作为即时回滚目标。 金丝雀发布(Canary Release):将小比例流量(1-5%)路由到新版本,监控错误率和延迟,指标健康则逐步增加流量。 滚动更新(Rolling Update):使用 maxUnavailable: 1 与 maxSurge: 1 逐个替换实例,以在部署期间保持容量。 分支保护流水线(Branch Protection Pipeline):要求状态检查(lint、test、security scan)通过后才能合并;使用 concurrency 组取消已被取代的运行。
应避免的陷阱
不要硬编码 CI runner 镜像的版本;应固定到特定 digest 或语义化版本,并有意识地更新。 不要为节省时间跳过安全扫描步骤;初期可将 SAST/DAST 集成为非阻塞检查,随后再改为阻塞检查。 不要在不了解密钥暴露安全影响的情况下使用 pull_request_target 并 checkout PR head。 不要让流水线定义在不同环境之间发生漂移;应使用单一事实来源并配合环境特定变量。