TOP

Coding DevOps 与 Jenkins 迟暮

背景

尊敬的用户您好:

由于产品业务调整,【CODING DevOps】系列产品将计划于以下时间停止相关支持:

  1. 标准版产品下线:2025年9月1日;原免费版客户无法使用,订购方案调整
  2. 所有产品停止新购:2025年9月30日
  3. 所有产品停止续购:2026年3月30日
  4. 所有产品停止服务:2028年9月30日

为确保您的使用权益和资产数据安全,请及时关注并处理。

若您仍有类似需求,可选购我们下一代产品【云原生构建】(简称 CNB),能力更强、产品更聚焦于开发者。

随着这则公告,这个季度的 OKR 上自然新增了若干迁移工作,趁刚好完成这份 KR,顺带写篇文档记录一下,Coding 的迟暮。

Jenkins 基座的迟暮

Jenkins 的优点在于其灵活性与生态:几乎任何 CI 流程、任何外部系统都可以通过插件或自定义脚本接入。

但也有以下的一些缺点:

即需要 Jenkins Agent 需要占用一台机器,节点是持续存在的,长期运行会有缓存的残留影响,需要人工进行运维。

云原生 DevOps 势头正盛

云原生 DevOps 是以 Pod 为单位的,具体的差异不在于是否把构建过程放进容器执行,而是直接忽略掉机器这个概念(Node),使用 Pod 来进行任务执行,通过 K8S 实现资源调度

关键点包括:

则代表的是一种可复现、一次性的交付体系。

用直觉来对比两者的差异

Jenkins 的模式

[Jenkins Master] 
      |
      ├── Agent 1 (一直活着) 对应某一台活着的具体机器
      ├── Agent 2 (一直活着) 对应某一台活着的具体机器
      ├── Agent 3 (一直活着) 对应某一台活着的具体机器

云原生的 CI/CD 模式

# 构建开始
[Pipeline]
   └── 创建 Pod 1 (新容器) 可能会被调度到某一个 Node 上
   └── 创建 Pod 2 (新容器) 可能会被调度到某一个 Node 上
   └── 创建 Pod 3 (新容器) 可能会被调度到某一个 Node 上
   
# 构建结束
Pod 1 销毁  
Pod 2 销毁  
Pod 3 销毁 

K8S 云原生 - GitLab Runner

GitLab RunnerK8S executor 为例:

  1. CI 触发器(Git push / MR /定时)产生 Job。
  2. Runner 收到 Job 请求后,向 K8s API 发起创建 Pod 的操作。Pod 的 spec 中包含用于执行 Job 的镜像、命令、工作目录、挂载与 sidecar(服务模拟或缓存)等。
  3. K8s 将 Pod 调度到某个 Node 上,容器在该 Node 的运行时中启动,拉取代码并在容器内执行脚本。
  4. Job 完成后,Pod 被销毁,工作目录与运行时中间态不再保留。

注意两点:

  1. Runner 本身并不承担构建负载(它是调度者/启动器),真正的执行发生在每次临时创建的容器中;
  2. Pod 会被调度到集群中的某一台物理机(Node),但这台物理机对用户是透明的——调度、故障转移、资源隔离由 K8s 管理。

云原生的好处 - GitLab Pages

GitLab Pages 有两种部署模式:Omnibus 安装(传统单机部署)K8S原生部署,传统单机部署和直觉理解上用一台服务器上托管静态资源是一样,没有其他优势了,这里主要讲 K8S原生部署 的方式。

Kubernetes 部署(GitLab Helm chart)

即 GitLab 还能顺带通过 Page Pod 实现静态资源的托管+自动扩容,还能直接使用 S3 来实现共享存储。

结尾

具体的差异如下:

维度Jenkins云原生 DevOps(K8s Runner / CNB 等)
执行单元长期驻留的 Agent,机器级别运行一次性容器/Pod,按需创建与销毁
环境一致性环境有缓存,依赖人工维护以镜像为核心,环境可复现、可审计
扩容模型手动增加 Agent,扩容成本高、弹性不足Pod 动态调度,自动扩容、按需分配资源
隔离与安全多任务在同一 Agent 上运行,可能互相影响每个任务独立 Pod,天然隔离、安全性更高
流水线表达Jenkinsfile,与 Jenkins 深度绑定YAML、Task/DAG 声明式,易与 GitOps、云原生生态集成

这些演变不是简单的技术升级替换,而是一种模式上的演变,真正的驱动来自于云原生生态的繁荣,重点不是团队去适应技术栈升级,而是建立一套可扩容、可持续的交付体系,真正提升交付的效率。