执行器是什么
执行器决定作业跑在什么环境里:shell 直接复用宿主机,速度最快但隔离最弱;docker 每个作业拉镜像起容器,环境一致;Kubernetes 每个作业一个 Pod,弹性调度;instance 与 autoscaler 按需创建云主机,适合规模化弹性构建。执行器换来的是隔离与可复现性,代价是启动开销与配置复杂度,选择取决于信任边界与规模。
基本信息
| shell | 复用宿主机工具链,速度最快、隔离最弱 |
|---|---|
| docker | 每个作业拉镜像起容器,环境一致、需容器运行时 |
| kubernetes | 每个作业一个 Pod,弹性好、需要集群 |
| instance/autoscaler | 按需创建云主机,适合规模化弹性构建 |
| 选择依据 | 隔离需求、信任边界、启动开销 |
典型使用场景
- 固定构建机:shell 执行器复用手工维护的工具链。
- 通用容器化:docker 执行器提供可复现的构建环境。
- 弹性集群:Kubernetes 执行器按需调度构建 Pod。
- 云上扩容:autoscaler 在高峰期自动增加工作机。
- 遗留工具链:只能跑在特定宿主环境的构建放专用机。
- 安全隔离:不可信代码的构建放容器或独立节点执行。
GitLab docker executor
GitLab docker executor
build:
image: node:20
script: npm ci && npm test执行器对照
| 执行器 | 隔离 | 特点 | 适用 |
|---|---|---|---|
| shell | 弱 | 直接复用宿主机工具链 | 固定专用构建机 |
| docker | 中 | 每个作业拉镜像起容器 | 通用场景 |
| kubernetes | 强 | 每作业一个 Pod,弹性好 | 集群化 CI |
| instance/autoscaler | 强 | 按需创建云主机 | 规模化弹性构建 |
shell 执行器残留文件与环境污染,是「本机可以、CI 不行」的常见根因。
容器执行器的缓存路径要配置在容器内并用缓存服务存储,路径搞错时缓存永远不命中。
基础镜像用明确版本号而不是 latest,环境才可复现、问题才可回溯。
挂载宿主 docker.sock 等于把宿主机权限交给作业,只对受信任项目开放。