这篇讲流水线任务该在容器里跑,还是直接在构建机上跑。看完你可以在 YAML 里写清 runner.mode:DOCKER 按任务镜像起一个容器来执行,NATIVE 直接在运行器所在的机器上执行,再把标签和运行器接入时的模式对上,任务才会落到要去的环境。
运行器(Runner)是装在构建机上、替平台领取并执行任务的程序。容器是按任务镜像临时拉起的隔离环境;宿主机是运行器进程所在的那台机器本身。任务在 YAML 里叫 Job,是一组按顺序执行的步骤。流水线和运行器在团队版和企业版中提供;社区版没有 CI/CD 菜单,本文的操作不适用。
还没有对应模式的运行器时,先登录 AngusGit,侧栏进入 CI/CD → 运行器,点 新增 Runner。控制面地址 改成构建机访问得到的地址,名称例如 build-linux-01,点 生成令牌(1 小时内有效,只显示一次)。要 DOCKER 时,页签选 Docker 一键拉起,标签填 linux,docker。要 NATIVE 时,页签选 Zip 安装,标签不要带 docker,机器上先装好 JDK 21。把命令复制到构建机执行,列表里变成 空闲 再写 YAML。换模式不能只改标签,要按这个入口用另一种页签再接一台。
1. 两种方式有什么不同
| 对比维度 | DOCKER | NATIVE |
|---|---|---|
| 命令在哪执行 | 运行器为这个任务启动的容器里 | 构建机上,运行器进程所在的环境 |
| JDK、Node.js 等工具从哪来 | YAML 里 image 指定的镜像 |
构建机上提前装好的 |
| 工作目录 | 容器里的 /workspace |
运行器安装目录下的 data/workspaces |
| 每次环境是否一样 | 一样,每个任务都从同一个镜像开始 | 取决于机器当前已装的软件与全局状态 |
| 构建机要准备什么 | 装好 Docker | 装好构建要用的全部工具与 JDK 21 |
| 换工具版本 | 改 YAML 里的 image |
到每台构建机上升级 |
两种方式下,工作目录都会在任务结束后清理,不会留给下一个任务。
对照当前实例更容易看懂。打开 CI/CD → 运行器,里面已经有两台:priv-1 是 DOCKER,标签 linux、docker;dev-1 是 NATIVE,标签 linux、native、dev。两台执行器都是 SHELL,并发占用都是 0/2。

2. YAML 里怎么写
DOCKER 任务
pipeline:
build:
runner:
mode: DOCKER
image: repo.anguskit.com/docker-public/angus-ci-maven:21
labels: ["linux", "docker"]
steps:
- name: Build
run: mvn -B -ntp clean package -DskipTests
mode: DOCKER 时一定要写 image,否则校验会给出警告。镜像里要有这个任务用到的全部命令,例如上面的 mvn。
NATIVE 任务
pipeline:
sign:
runner:
mode: NATIVE
labels: ["linux", "codesign"]
steps:
- name: Sign
run: ./scripts/sign-release.sh
NATIVE 任务不写 image。labels 里不要写 docker,再加一个能标识这类机器的标签,例如上面的 codesign,表示「装了签名证书的那台机器」。
mode 只能写大写的 DOCKER 或 NATIVE,写成小写会校验失败。
不写 mode 会怎样
不写 mode 时,AngusGit 不按模式筛选运行器,任何一台标签匹配的运行器都可能领走这个任务;任务也不会进容器,而是直接在运行器所在的环境里执行。同一份 YAML 落到不同机器上,结果就可能不一样,因此每个任务都写清 mode。
3. 运行器怎么配
任务的 mode 定好之后,还要有对应模式的运行器来接。运行器只能是其中一种模式,并且在第一次接入时就定下来:标签里带 docker 的是 DOCKER 运行器,不带的是 NATIVE 运行器。
| 想要的运行器 | 接入方式 | 标签 |
|---|---|---|
| DOCKER | Docker 一键拉起 或 一键安装脚本 | 默认 linux,docker,可以再加别的 |
| NATIVE | Zip 安装,机器上装好 JDK 21 | 不能带 docker,例如 linux,codesign |
Docker 方式接入的运行器本身也跑在容器里。它通过挂载进来的 /var/run/docker.sock,在宿主机的 Docker 上为每个任务启动新的容器。
接入完成后再到 编辑运行器 里加上或去掉 docker 标签,改的只是标签,模式不会跟着变。要换模式,就按开头用另一种页签重新接入一台。
4. 怎么选
没有特殊约束时,默认用 DOCKER。构建环境写在 YAML 里,谁来看都知道这次构建用的是哪个版本的 JDK。换版本只改一行,每台构建机都不用动。新加一台构建机,装好 Docker、接入运行器就能用。
这些情况用 NATIVE:
- 构建要用到这台机器独有的东西,例如签名证书、加密狗、GPU,或者 Windows、macOS 专用的工具链。
- 构建工具没法或者不方便做成镜像。
- 机器上不能装 Docker。
两种可以混用。 一个流水线里,编译和测试用 DOCKER,最后的签名用 NATIVE,每个任务各写各的 runner。AngusGit 会按任务分别挑运行器,前提是两种运行器都有在线的。
5. 用 NATIVE 时要多留意的地方
NATIVE 任务和构建机共用同一个环境,下面几件事要提前约定:
- 工具版本统一。 几台 NATIVE 构建机上的 JDK、Node.js 版本要一致,否则同一份代码在不同机器上的构建结果可能不同。
- 不要在构建脚本里改全局环境。 例如
npm install -g、修改~/.m2/settings.xml,会影响这台机器上之后的所有任务。 - 并发要保守。 几个 NATIVE 任务同时跑在一台机器上时,会争用同一份全局缓存和同一批端口。最大并发 Job 数 不要设得太高。
常见问题
DOCKER 任务的镜像从哪里拉?
从运行器所在的宿主机上的 Docker 去拉。构建机访问不到镜像地址时,任务会拉取失败。内网环境下,把常用镜像推到内网的镜像仓库,YAML 里写内网地址。
一台机器能同时提供两种模式吗?
能,在上面装两个运行器:一个用 Docker 方式接入,一个用 Zip 方式接入且不带 docker 标签。名称要区分开,例如 build-01-docker 和 build-01-native。
能根据负载自动增加运行器吗?
目前不能。运行器是固定接入的,需要更多算力时,手动再接入一台,或者调大已有运行器的 最大并发 Job 数。
任务一直等待中,提示执行模式不匹配,怎么办?
说明没有在线的运行器和这个任务的 mode 一致。打开这次运行,任务旁的等待原因会写成「没有匹配执行模式 DOCKER 的 Runner」或「没有匹配执行模式 NATIVE 的 Runner」。按开头用对应页签再接一台,列表里变成 空闲 后再看这次运行。
小结
AngusGit 流水线的任务,要么在运行器启动的 Docker 容器里执行,要么直接在构建机上执行。DOCKER 方式的工具来自 image,每次环境都一样,是默认的选择。NATIVE 方式用构建机上装好的工具,适合需要机器上特有资源的任务。每个任务都写清 runner.mode 和 labels。DOCKER 任务交给带 docker 标签的运行器,NATIVE 任务交给不带 docker 标签、用 Zip 方式接入的运行器。运行器的模式在接入时就定了,之后改标签不会改变模式。
结论: 常规构建用
runner.mode: DOCKER配合镜像保证环境一致,由带docker标签的运行器执行;需要本机特有硬件或证书时用runner.mode: NATIVE,由不带docker标签的 Zip 运行器执行。