---
url: /zh/workspaces/custom-dev-pipeline.md
description: |
  介绍如何通过 `.cnb.yml` 配置文件自定义云原生开发流水线， 包括自定义镜像、资源规格（CPU/内存）以及环境创建时自动执行的任务。
---
若希望点击分支页面的「云原生开发」按钮时使用自定义流水线，可在仓库根目录创建 `.cnb.yml` 配置。

```yaml title=".cnb.yml"
$:
  vscode:
    - docker:
        image: node:20
      services:
        - vscode
        - docker
      stages:
        - name: ls
          script: ls -al
```

## 自定义资源规格

可通过 `runner.cpus` 声明所需的 CPU 核数，最大支持 64 核，内存为 cpus × 2 GB。在基础配置上增加 `runner` 声明即可：

```yaml{4} title=".cnb.yml"
$:
  vscode:
    - runner:
        cpus: 64
      docker:
        image: node:20
      services:
        - vscode
        - docker
      stages:
        - name: ls
          script: ls -al
```

## 自定义启动事件

通过 `.cnb.yml` 声明特定事件触发时自动创建开发环境，推荐使用以下触发事件：

* [`vscode`](../build/grammar.md#vscode)：仓库页面点击 `启动云原生开发` 按钮时创建开发环境
* [`branch.create`](../build/grammar.md#branch-create)：创建分支时创建开发环境
* [`api_trigger`](../build/grammar.md#api_trigger)：自定义事件触发创建开发环境
* [`web_trigger`](../build/trigger-rule.md#web_trigger)：web 页面自定义事件触发创建开发环境

```yaml{5} title=".cnb.yml"
# 匹配所有分支
(**):
  branch.create:
    - name: vscode
      services:
        - vscode
      docker:
        build: .ide/Dockerfile
      stages:
        - name: 执行自定义脚本
          script:
            - npm install
            - npm run start
```

## 自定义可用时机

云原生开发默认在 `prepare` 阶段完成后、`stages` 执行前可用（`code-server` 在准备阶段启动）。

如需在执行某些任务后再进入开发环境（延迟进入），可使用内置任务
[vscode:go](../build/internal-steps/vscode/go.md)。启用后，loading 页将停留在入口选择页，
直到 `vscode:go` 执行完毕才可进入。

> 注意：使用 `vscode:go` 会增加等待时间。请将必须在进入前执行的任务
> 放在 `vscode:go` 之前，进入后执行的任务放在之后。若无需延迟进入，
> 不必使用此任务。

当 `stages` 任务执行失败时，开发环境的处理逻辑如下：

* 使用 `vscode:go`：`vscode:go` 之前的任务执行失败，开发环境将被销毁
* 使用 `vscode:go`：`vscode:go` 之后的任务执行失败，开发环境不会销毁
* 未使用 `vscode:go`：`stages` 任务执行失败，开发环境不会销毁

## 自定义环境销毁前任务

可使用 [`endStages`](../build/grammar.md#endstages) 定义开发环境销毁前
需要执行的任务。在基础配置上增加 `endStages` 即可：

```yaml title=".cnb.yml"
$:
  vscode:
    - docker:
        image: node:20
      services:
        - vscode
        - docker
      stages:
        - name: ls
          script: ls -al
      endStages:
        - name: end stage 1
          script: echo "end stage 1"
        - name: end stage 2
          script: echo "end stage 2"
```
