---
url: /zh/build/build-in-env.md
---
`云原生构建` 内置了一些默认环境变量，只可读不可写，如果构建过程中尝试覆盖默认环境变量不会生效。

下文 `合并类事件` 包含以下六种：

* `pull_request`
* `pull_request.update`
* `pull_request.target`
* `pull_request.approved`
* `pull_request.changes_requested`
* `pull_request.mergeable`
* `pull_request.merged`
* `pull_request.comment`

了解更多[触发事件](./trigger-rule.md#trigger-event)。

\[\[TOC]]

## 基础变量

### CI

true

### CNB

true

### CNB\_WEB\_PROTOCOL

当前 web 使用的协议，http | https

### CNB\_WEB\_HOST

当前 web 使用的 HOST

### CNB\_WEB\_ENDPOINT

当前 web 使用的地址，包含协议、HOST、路径（如有）

### CNB\_API\_ENDPOINT

当前 API 地址，包含协议、HOST、路径（如有）

可与 `CNB_TOKEN` 配合在 CI 中调用 API 接口

### CNB\_GROUP\_SLUG

仓库所属组织路径

### CNB\_GROUP\_SLUG\_LOWERCASE

仓库所属组织路径（小写格式）

### CNB\_EVENT

值为触发构建的事件名称

事件类型参见[事件](./trigger-rule.md#trigger-event)

### CNB\_EVENT\_URL

* 对于由 ==合并类事件== 触发的构建，值为该 `PR` 的链接

* 对于由 `push`、`commit.add`、`branch.create`、`tag_push` 触发的构建，值为最新 `Commit` 的链接

* 否则值为空字符串

### CNB\_BRANCH

* 对于由 `push`、`commit.add`、`branch.create`、`branch.delete` 触发的构建，值为当前的分支名

* 对于由 `合并类事件` 触发的构建，值为目标分支的分支名

* 对于由 `tag_push` 触发的构建，值为 `tag` 名

* 对于由 `自定义事件` 触发的构建，值为对应的分支名称

* 对于由 `crontab` 触发的构建，值为对应的分支名称

### CNB\_BRANCH\_SHA

* 对于 `branch.delete` 触发的构建，为空字符串

* 其他情况为 `CNB_BRANCH` 最近一次提交的 `sha`

### CNB\_DEFAULT\_BRANCH

仓库默认分支

### CNB\_TOKEN\_USER\_NAME

用户临时令牌对应的用户名，固定为 `cnb`

### CNB\_TOKEN

用户临时令牌（流水线结束时销毁），可用于代码和制品的拉取、推送以及 API 调用。

若流水线所属仓库为公开仓库，该 token 的使用范围会被限制为 `仅公开仓库/制品库`。

对于 `pull_request`、`pull_request.update`、`pull_request.approved`、`pull_request.changes_requested` 事件，权限有：

* `repo-code:r`
* `repo-pr:r`
* `repo-issue:r`
* `repo-notes:rw`
* `repo-contents:r`
* `registry-package:r`
* `repo-commit-status:rw`
* `account-profile:r`

对于其他的事件，权限有：

* `repo-code:rw`
* `repo-pr:rw`
* `repo-issue:rw`
* `repo-notes:rw`
* `repo-contents:rw`
* `registry-package:rw`
* `repo-commit-status:rw`
* `repo-cnb-trigger:rw`
* `repo-cnb-history:r`
* `repo-cnb-detail:r`
* `repo-basic-info:r`
* `repo-manage:r`
* `account-profile:r`
* `group-resource:r`

权限含义参考页面 个人设置 页面的 访问令牌

### TWINE\_USERNAME

PyPI 制品库用户名，同 `CNB_TOKEN_USER_NAME`

### TWINE\_PASSWORD

PyPI 制品库密码，同 `CNB_TOKEN`

### CNB\_TOKEN\_FOR\_AI

用户令牌，仅支持在 `合并类事件`、`issue.open`、`issue.close`、`ai_issue`、`ai_review` 事件中使用，表明调用者身份为 AI。

使用场景参考：比如在合并请求中发表由 AI 生成的评论，可用该令牌调用发表评论的 OpenApi，页面中将增加 AI 标记表明该评论来自 AI。

权限有：

* repo-notes:rw
* repo-pr:rw

权限含义参考页面 `个人设置` 页面的 访问令牌

### CNB\_TOKEN\_FOR\_CODEBUDDY

用户令牌，表明调用者身份为 CodeBuddy。其他同 `CNB_TOKEN_FOR_AI`。

### CNB\_IS\_CRONEVENT

是否是定时任务事件

### CNB\_DOCKER\_REGISTRY

制品库 Docker 源地址

### CNB\_DOCKER\_MODEL\_REGISTRY

制品库 Docker model 源地址

### CNB\_HELM\_REGISTRY

制品库 Helm 源地址

### CNB\_HAS\_LFS\_FILES

是否有 LFS 文件

若仓库清空了 LFS 文件，在 Git GC 前仍会为 `true`

## 提交类变量

### CNB\_BEFORE\_SHA

* 对于由 `push`、`commit.add` 触发的构建，值为分支推送前远端仓库该分支最近一次提交的 `sha`，若是新建分支，值为 `0000000000000000000000000000000000000000`
* 对于 `branch.create` 触发的构建，值为 `0000000000000000000000000000000000000000`

### CNB\_COMMIT

构建时对应的代码 sha

* 对于 `push`、`commit.add`、`branch.create` 触发的构建，是最后一次提交的 `sha`
* 对于 `tag_push`、`tag_deploy.*` 触发的构建，是该 `tag` 最后一次提交的 `sha`
* 对于 `auto_tag`、`branch.delete`、`issue.*` 类事件，是主分支最后一次提交的 `sha`
* 对于 `pull_request.merged` 触发的构建，是合并后的 `sha`
* 对于 `pull_request.target`、`pull_request.mergeable` 触发的构建，是目标分支最后一次提交的 `sha`
* 对于 `pull_request`、`pull_request.approved`、`pull_request.changes_requested`、`pull_request.comment`，代码尚未真正合并，取源分支最后一次提交的 `sha`，但构建时会进行预合并，即合并后的内容会作为最终结果
* 对于 `云原生开发`、`自定义事件` 触发的构建，是指定分支的最后一次提交的 `sha`

### CNB\_COMMIT\_SHORT

`CNB_COMMIT` 的缩写，取其前 8 位字符

### CNB\_COMMIT\_MESSAGE

CNB\_COMMIT 对应的提交信息

### CNB\_COMMIT\_MESSAGE\_TITLE

`CNB_COMMIT_MESSAGE` 的 `title` 部分，即首行

### CNB\_COMMITTER

`CNB_COMMIT` 对应的提交者

### CNB\_COMMITTER\_EMAIL

`CNB_COMMITTER` 对应的邮箱

### CNB\_NEW\_COMMITS\_COUNT

对于由 `commit.add` 触发的构建，值为新增的 `Commits` 的数量。

可结合 `git log -n` 查看新增的 `Commits`。

### CNB\_IS\_TAG

对于分支为 `Tag` 的构建，值为 ture

### CNB\_TAG\_MESSAGE

* `Tag message`：对于分支为 `Tag` 的构建, 会有该环境变量
* 否则值为空字符串

### CNB\_TAG\_RELEASE\_TITLE

* `Release 标题`：对于分支为 `Tag` 的构建, 如果 `Release` 标题不为空，才会有值
* 否则值为空字符串

### CNB\_TAG\_RELEASE\_DESC

* `Release 描述`：对于分支为 `Tag` 的构建, 且 `Release` 描述不为空，才会有值
* 否则值为空字符串

### CNB\_TAG\_IS\_RELEASE

* `Tag 是否存在对应的 Release`：对于分支为 Tag 的构建，如果 `Tag` 存在对应的 `Release`，则为 true
* 否则为 `false`

### CNB\_TAG\_IS\_PRE\_RELEASE

* 对于分支为 Tag 的构建，若存在对应的 `Release`，且 `Release` 为 预发布，则值为 `true`
* 否则为 false

### CNB\_IS\_NEW\_BRANCH

当前分支是否属于一个新创建的分支，默认为 `false`

### CNB\_IS\_NEW\_BRANCH\_WITH\_UPDATE

当前分支是否属于一个新创建的分支，且带有新 commit，默认为 `false`

## 仓库类变量

### CNB\_REPO\_SLUG

目标仓库路径，格式为 `group_slug/repo_name`，`group_slug/sub_gourp_slog/.../repo_name`

### CNB\_REPO\_SLUG\_LOWERCASE

目标仓库路径小写格式

### CNB\_REPO\_NAME

目标仓库名称

### CNB\_REPO\_NAME\_LOWERCASE

目标仓库名称小写格式

### CNB\_REPO\_ID

目标仓库的 `id`

### CNB\_REPO\_URL\_HTTPS

目标仓库仓库 https 地址

## 构建类变量

### CNB\_BUILD\_ID

当前构建的流水号，全局唯一

### CNB\_BUILD\_WEB\_URL

当前构建的日志地址

### CNB\_BUILD\_START\_TIME

当前构建的开始时间，UTC 格式，示例 `2025-08-21T09:13:45.803Z`

### CNB\_BUILD\_USER

当前构建的触发者名称

### CNB\_BUILD\_USER\_EMAIL

当前构建的触发者邮箱

### CNB\_BUILD\_USER\_ID

当前构建的触发者 `id`

### CNB\_BUILD\_STAGE\_NAME

当前构建的 `stage` 名称

### CNB\_BUILD\_JOB\_NAME

当前构建的 `job` 名称

### CNB\_BUILD\_JOB\_KEY

当前构建的 `job` key，同 `stage` 下唯一

### CNB\_BUILD\_WORKSPACE

自定义 `shell` 脚本执行的工作空间根目录

### CNB\_BUILD\_FAILED\_MSG

流水线构建失败的错误信息，可在 `failStages` 中使用

### CNB\_BUILD\_FAILED\_STAGE\_NAME

流水线构建失败的 `stage` 的名称，可在 `failStages` 中使用

### CNB\_PIPELINE\_NAME

当前 `pipeline` 的 `name`，没声明时为空

### CNB\_PIPELINE\_KEY

当前 `pipeline` 的索引 `key`，例如 `pipeline-0`

### CNB\_PIPELINE\_ID

当前 `pipeline` 的 `id`，全局唯一字符串

### CNB\_PIPELINE\_DOCKER\_IMAGE

当前 `pipeline` 所使用的 `docker image`，如：`alpine:latest`

### CNB\_PIPELINE\_STATUS

当前流水线的构建状态，可在 `endStages` 中查看，其可能的值包括：

* `success`：表示流水线构建成功完成。
* `error`：表示流水线构建过程中发生了错误。
* `cancel`：表示流水线构建被取消。

### CNB\_PIPELINE\_MAX\_RUN\_TIME

流水线最大运行时间，单位为毫秒

### CNB\_RUNNER\_IP

当前 `pipeline` 所在 `Runner` 的 `ip`

### CNB\_CPUS

当前构建流水线可以使用的最大 `CPU` 核数

### CNB\_MEMORY

当前构建流水线可以使用的最大 `内存` 大小，单位为 `GiB`

### CNB\_IS\_RETRY

当前构建是否由 `rebuild` 触发

### HUSKY\_SKIP\_INSTALL

兼容 ci 环境下 husky

## 合并类变量

### CNB\_PULL\_REQUEST

* 对于由 `pull_request`、`pull_request.update`、`pull_request.target` 触发的构建，值为 `true`
* 否则值为 `false`

### CNB\_PULL\_REQUEST\_LIKE

* 对于由 `合并类事件` 触发的构建，值为 `true`
* 否则值为 `false`

### CNB\_PULL\_REQUEST\_PROPOSER

* 对于由 `合并类事件` 触发的构建，值为提出 `PR` 者名称
* 否则值为空字符串

### CNB\_PULL\_REQUEST\_TITLE

* 对于由 `合并类事件` 触发的构建，值为提 `PR` 时候填写的标题
* 否则值为空字符串

### CNB\_PULL\_REQUEST\_BRANCH

* 对于由 `合并类事件` 触发的构建，值为发起 `PR` 的源分支名称
* 否则值为空字符串

### CNB\_PULL\_REQUEST\_SHA

* 对于由 `合并类事件` 触发的构建，值为当前 `PR` 源分支最新的提交 `sha`
* 否则值为空字符串

### CNB\_PULL\_REQUEST\_TARGET\_SHA

* 对于由 `合并类事件` 触发的构建，值为当前 `PR` 目标分支最新的提交 `sha`
* 否则值为空字符串

### CNB\_PULL\_REQUEST\_MERGE\_SHA

* 对于由 `pull_request.merged` 事件触发的构建，值为当前 `PR` 合并后的 `sha`
* 对于由 `pull_request`、`pull_request.update`、`pull_request.target`、`pull_request.mergeable`、`pull_request.comment` 触发的构建，值为当前 `PR` 预合并后的 `sha`
* 否则值为空字符串

### CNB\_PULL\_REQUEST\_SLUG

* 对于由 `合并类事件` 触发的构建，值为源仓库的仓库 slug，如 `group_slug/repo_name`，`group_slug/sub_gourp_slog/.../repo_name`
* 否则值为空字符串

### CNB\_PULL\_REQUEST\_ACTION

对于由 `合并类事件` 触发的构建，可能的值有：

* created: 新建 PR
* code\_update: 源分支 push
* status\_update: 评审通过或 CI 状态变更时 `PR` 变成可合并 否则值为空字符串

### CNB\_PULL\_REQUEST\_ID

* 对于由 `合并类事件` 触发的构建，值为当前或者关联 `PR` 的全局唯一 `id`
* 否则值为空字符串

### CNB\_PULL\_REQUEST\_IID

* 对于由 `合并类事件` 触发的构建，值为当前或者关联 `PR` 在仓库中的编号 `iid`
* 否则值为空字符串

### CNB\_PULL\_REQUEST\_REVIEWERS

* 对于由 `合并类事件` 触发的构建，值为评审人列表，多个以 `,` 分隔
* 否则值为空字符串

### CNB\_PULL\_REQUEST\_REVIEW\_STATE

对于由 `合并类事件` 触发的构建

* 有评审者且有人通过评审，值为 `approve`
* 有评审者但无人通过评审，值为 `unapprove`
* 否则值为空字符串

### CNB\_REVIEW\_REVIEWED\_BY

* 对于由 `合并类事件` 触发的构建，值为同意评审的评审人列表，多个以 `,` 分隔
* 否则值为空字符串

### CNB\_REVIEW\_LAST\_REVIEWED\_BY

* 对于由 `合并类事件` 触发的构建，值为最后一个同意评审的评审人
* 否则值为空字符串

### CNB\_PULL\_REQUEST\_IS\_WIP

* 对于由 `合并类事件` 触发的构建，值为 `true`、`false`，表示 `PR` 是否被设置为 \[WIP]
* 否则值为空字符串

## 远程开发类变量

### CNB\_VSCODE\_WEB\_URL

远程开发地址，仅声明了 `services : vscode` 时存在

### CNB\_VSCODE\_MAX\_RUN\_TIME

远程开发环境最大运行时间，单位为毫秒，仅声明了 `services : vscode` 时存在

## Issue 类变量

### CNB\_ISSUE\_ID

* 对于 `issue.*` 触发的构建，值为 `Issue` 全局唯一 `ID`
* 否则值为空字符串

### CNB\_ISSUE\_IID

* 对于 `issue.*` 触发的构建，值为 `Issue` 在仓库中的编号 `iid`
* 否则值为空字符串

### CNB\_ISSUE\_TITLE

* 对于 `issue.*` 触发的构建，值为 `Issue` 的 `title`
* 否则值为空字符串

### CNB\_ISSUE\_DESCRIPTION

* 对于 `issue.*` 触发的构建，值为 `Issue` 的 `description`
* 否则值为空字符串

### CNB\_ISSUE\_OWNER

* 对于 `issue.*` 触发的构建，值为 `Issue` 作者用户名
* 否则值为空字符串

### CNB\_ISSUE\_STATE

* 对于 `issue.*` 触发的构建，值为 `Issue` 状态：`open`、`closed`
* 否则值为空字符串

### CNB\_ISSUE\_IS\_RESOLVED

* 对于 `issue.*` 触发的构建，表示 `Issue` 是否被解决：`true`、`false`
* 否则值为空字符串

### CNB\_ISSUE\_ASSIGNEES

* 对于`issue.*`触发的构建，值为 `Issue` 的处理人用户名列表，多个以 `,` 分隔
* 否则值为空字符串

### CNB\_ISSUE\_LABELS

* 对于`issue.*`触发的构建，值为 `Issue` 的标签列表，多个以 `,` 分隔
* 否则值为空字符串

### CNB\_ISSUE\_PRIORITY

* 对于`issue.*`触发的构建，值为 `Issue` 优先级
* 否则值为空字符串

## 评论类变量

### CNB\_COMMENT\_ID

* 对于评论事件触发的构建，值为评论全局唯一 `ID`
* 否则值为空字符串

### CNB\_COMMENT\_BODY

* 对于评论事件触发的构建，值为评论内容
* 否则值为空字符串
