CI/CD前世今生(持续集成、持续交付、持续部署、Jenkins、Github Actions)

文章目录

从手工作坊到软件工厂:CI/CD 的诞生

远古时代(2000年前后)

当时开发流程大概是:

text 复制代码
开发A
    ↓
开发B
    ↓
开发C
    ↓
手动上传服务器
    ↓
线上炸了

典型情况:

bash 复制代码
scp app.jar server:/opt/app

或者:

bash 复制代码
ftp upload

然后:

bash 复制代码
ssh server
./restart.sh

问题:

每个人环境不同

A电脑:

text 复制代码
Java 8

B电脑:

text 复制代码
Java 11

结果:

text 复制代码
我这里能运行
你那里为什么报错?

合并后才发现冲突

开发A:

python 复制代码
def pay():

开发B:

python 复制代码
def payment():

上线前才发现:

text 复制代码
Merge Conflict

发布依赖人工

运维:

text 复制代码
今天晚上11点发布

然后所有人等待:

text 复制代码
别动代码!

整个公司进入戒严状态。


第一次革命:持续集成(CI)

Martin Fowler 提出了一个理念:

不要等一个月再合并代码。

应该:

text 复制代码
每天合并
甚至每小时合并

于是出现:

Continuous Integration

持续集成

流程:

text 复制代码
提交代码
    ↓
自动构建
    ↓
自动测试
    ↓
发现问题

而不是:

text 复制代码
提交代码
    ↓
一个月后
    ↓
项目炸掉

CI 的核心哲学

不是:

text 复制代码
自动运行脚本

而是:

text 复制代码
尽可能早发现问题

英文里有个说法:

Shift Left

把问题往左移动。

时间线:

text 复制代码
开发 → 测试 → 上线

改成:

text 复制代码
编码时 → 发现问题

因为:

text 复制代码
越晚发现问题
修复成本越高

Jenkins 时代

大约 2010 年前后。

出现了:

Jenkins

它几乎统治了 CI 世界十几年。

当时流程:

text 复制代码
Git Push
    ↓
Jenkins
    ↓
编译
    ↓
测试
    ↓
发送邮件

Jenkins 本质:

text 复制代码
自动化任务调度器

例如:

groovy 复制代码
Build
Test
Deploy

串起来。


为什么 Jenkins 后来被嫌弃?

因为太重。

需要:

text 复制代码
自己买服务器
自己维护
自己升级
自己装插件

最后:

text 复制代码
维护 Jenkins 的成本
比维护业务系统还高

很多公司都有:

text 复制代码
Jenkins 专家

专门修 Jenkins。


第二次革命:CI 即代码

后来大家发现:

text 复制代码
流程配置
也是代码

于是出现:

Pipeline as Code

例如:

yaml 复制代码
build:
  test:
  deploy:

写进仓库。

这样:

text 复制代码
代码
+ 流程

一起版本管理。


GitHub Actions 的出现

2019年以后。

GitHub Actions

把 CI 彻底平民化。

以前:

text 复制代码
GitHub
+
Jenkins

现在:

text 复制代码
GitHub
+
GitHub Actions

一步到位。


Actions 本质是什么

很多人以为:

text 复制代码
GitHub 帮我运行代码

其实不是。

本质:

text 复制代码
GitHub 提供临时服务器

当你:

bash 复制代码
git push

时。

GitHub:

text 复制代码
创建一个全新的虚拟机

例如:

yaml 复制代码
runs-on: ubuntu-latest

就是:

text 复制代码
启动 Ubuntu

然后:

yaml 复制代码
- checkout
- install
- test

一步步执行。

执行完:

text 复制代码
虚拟机销毁

你看到的 Workflow 到底是什么

例如:

yaml 复制代码
name: CI

on:
  push:

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - run: npm install

      - run: npm test

翻译成人话:

text 复制代码
有人 Push
    ↓
开一台临时 Ubuntu
    ↓
下载代码
    ↓
安装依赖
    ↓
执行测试
    ↓
销毁机器

仅此而已。


CI 为什么和 Docker 越来越绑定

因为:

text 复制代码
环境不一致

一直是软件工程最大问题之一。

于是出现:

Docker

理念:

text 复制代码
把运行环境一起打包

过去:

text 复制代码
代码

现在:

text 复制代码
代码 + 环境

CI 流程变成:

text 复制代码
Push
   ↓
Test
   ↓
Build Docker Image
   ↓
Push Registry

(Push Registry 是将构建好的Docker镜像推送到镜像仓库)

例如:

text 复制代码
Docker Hub 	# Docker官方镜像仓库,最大的公共镜像平台
GHCR 		# GitHub容器镜像仓库,与GitHub深度集成
ECR			# AWS容器镜像仓库,企业级私有仓库服务

第三次革命:持续交付(CD)

大家后来发现:

CI 只能发现问题。

但:

text 复制代码
上线还是人工

于是:

Continuous Delivery

持续交付

流程:

text 复制代码
Push
   ↓
Test
   ↓
Build
   ↓
生成可发布版本

到这里结束。

是否上线:

text 复制代码
人工点击

第四次革命:持续部署(CD)

进一步:

Continuous Deployment

流程:

text 复制代码
Push
   ↓
Test
   ↓
Build
   ↓
Deploy

完全自动。


例如:

text 复制代码
Push main

text 复制代码
Actions

text 复制代码
Docker Build

text 复制代码
Deploy AWS

text 复制代码
线上更新

无需人工。


现代互联网公司的流水线

今天的大厂基本都是:

text 复制代码
Developer
    ↓
Git Push
    ↓
CI
    ↓
Unit Test
    ↓
Lint
    ↓
Security Scan
    ↓
Build Image
    ↓
Push Registry
    ↓
Deploy Staging
    ↓
E2E Test
    ↓
Deploy Production

AI Coding 时代为什么更需要 CI/CD

以前:

text 复制代码
程序员每天写100行代码

现在:

text 复制代码
Claude Code 一天改5000行

问题变成:

text 复制代码
代码增长速度
远超人工审查速度

所以很多团队反而更依赖:

  • CI
  • 自动测试
  • 自动检查
  • 自动部署

因为:

人工 Review 已经无法验证所有改动。


作为 AI 工程师,你应该掌握什么

不需要成为 DevOps 专家。

但至少要理解:

第一层

能看懂:

yaml 复制代码
.github/workflows/*.yml

第二层

知道:

text 复制代码
Trigger    # 触发条件,启动工作流的事件或条件

Job        # 作业任务,工作流中独立的执行单元

Step       # 执行步骤,作业中具体的单个操作

Runner     # 运行器,执行作业的计算资源或代理

Artifact   # 构建产物,作业生成的输出文件或资源

Cache      # 缓存机制,存储临时数据以加速后续执行

是什么意思。


第三层

能自己写:

text 复制代码
测试
Docker Build
Release
Deploy

流水线。


第四层

理解整个工程链路:

text 复制代码
Git
 ↓
GitHub Actions
 ↓
Docker
 ↓
Registry
 ↓
Cloud
 ↓
Production

当你真正理解这一条链路后,再看 GitHub Actions 的 YAML 文件,会发现它们不再是一堆神秘配置,而只是把软件从开发机运送到生产环境的"流水线说明书"。

相关推荐
委婉待续1 小时前
登录github出现ERR_CONNECTION_TIMED_OUT问题
github
洛星核2 小时前
Aider 安装、使用方法详细全解
人工智能·github·人机交互·ai编程·agi
法欧特斯卡雷特2 小时前
从 Kotlin 编译器 API 的变化开始: 2.4.0
android·开源·github
Hical612 小时前
百万 TCP 长连接内存实测:50 万点回归,R²=1.0000,每连接 7.58 KB
后端·github
uhakadotcom2 小时前
get_event_loop(),和 get_running_loop() + ThreadPoolExecutor 有啥区别
后端·面试·github
工一木子2 小时前
GitHub 入门:从代码托管到认识技术世界的一扇门
github
Java 码思客2 小时前
【ElasticSearch从入门到架构师】第7章-聚合查询——实现数据统计与分析
大数据·elasticsearch·jenkins
小雨青年2 小时前
GitHub Copilot 上下文工程:让 AI 编程更接近真实项目
人工智能·github·copilot
七夜zippoe3 小时前
OpenClaw 节点命令执行:远程Shell与系统操作实战
github·shell·openclaw·nodes·系统操作