---
url: /zh/build/intro.md
description: |
  介绍 CNB 云原生构建的核心特性， 包括声明式语法、Docker 构建环境、构建缓存和插件生态。
---
云原生构建基于 Docker 生态，抽象了环境、缓存和插件，通过声明式语法让开发者高效构建软件。

* 声明式：可编程、易分享的配置语法
* 易管理：与代码同源管理，版本可追溯
* 云原生：资源池化，降低基础设施运维成本

### 构建环境与缓存

声明式配置中，通过 `docker.image` 指定构建环境，用 `volumes` 声明缓存目录：

```yaml{4,7,8} title=".cnb.yml"
main:
  push:
    - docker:
        image: node:20
        volumes:
          - /root/.npm:copy-on-write
      stages:
        - node -v
        - npm install
        - npm test
```

### Docker 作为任务运行环境

每个任务（stage）可使用不同的镜像运行，适合需要多语言或多版本环境的场景：

```yaml{5,8} title=".cnb.yml"
main:
  push:
    - stages:
        - name: run with node 20
          image: node:20
          script: node -v
        - name: run with node 21
          image: node:21
          script: node -v
```

### 基于 Docker 生态的插件

通过社区或官方插件扩展构建能力：

```yaml{5} title=".cnb.yml"
main:
  push:
    - stages:
        - name: hello world
          image: cnbcool/hello-world
```

### 按需获取计算资源

通过 `runner.cpus` 申请更高规格的计算资源，最高 **64 核**：

```yaml{4} title=".cnb.yml"
main:
  push:
    - runner:
        cpus: 64
      docker:
        image: node:20
        volumes:
          - /root/.npm:copy-on-write
      stages:
        - node -v
        - npm install
        - npm test
```

### 云原生开发

远程开发环境同样使用 `.cnb.yml` 声明：

```yaml{5,6} title=".cnb.yml"
$:
  vscode:
    - runner:
        cpus: 64
      services:
        - vscode
      docker:
        image: node:20
        volumes:
          - node_modules:copy-on-write
      stages:
        - npm install
```

## 高性能

### CPU 弹性伸缩

* [runner.cpus](./grammar.md#pipeline-cpus)

用 `runner.cpus` 按需申请 CPU 资源，最高 **64 核**。

### 秒级克隆

基于 `OverlayFS` 的 [git-clone-yyds](https://cnb.cool/cnb/cool/git-clone-yyds)
可在数秒内完成代码准备，轻松支持 **100GB+** 大仓库。

### 跨节点缓存

* [docker:cache](../build/internal-steps/docker/cache.md)

需跨节点共享缓存时，可用 `docker:cache` 内置任务将缓存构建为 Docker 镜像：

```yaml title=".cnb.yml"
main:
  push:
    - stages:
        - name: build cache
          type: docker:cache
          options:
            dockerfile: cache.dockerfile
            by:
              - package.json
              - package-lock.json
            versionBy:
              - package-lock.json
          exports:
            name: DOCKER_CACHE_IMAGE_NAME
        - name: use cache
          image: $DOCKER_CACHE_IMAGE_NAME
          commands:
            - cp -r "$NODE_PATH" ./node_modules
```

### 缓存并发

* [copy-on-write](./grammar.md#pipeline-volumes)

`copy-on-write` 可实现缓存的写时复制，并发场景下无需担心缓存读写冲突。
