环境变量
在构建过程中可以使用环境变量,云原生构建 内置了一些默认环境变量。
声明环境变量
- 通过 
env声明环境变量 - 在 
Pipeline里声明的环境变量对当前Pipeline有效 - 在 
Job里声明的环境变量对当前Job有效 
 |  | 
导入环境变量
- 通过 
imports导入一个密钥仓库文件,可将敏感信息注入到环境变量,供后续任务使用。 - 当 
env和imports的key冲突时,优先使用env 
 |  | 
https://cnb.cool/<your-repo-slug>/-/blob/main/xxx/envs.yml 内容示例
 |  | 
变量名限制
在 Shell 中,环境变量名的命名规则有一些限制。根据 POSIX 标准,环境变量名应符合以下规则:
- 只能包含字母(大小写均可)、数字和下划线(_)字符。
 - 第一个字符不能是数字。
 
不符合上述规则的变量会被忽略
导出环境变量
Job 执行结束后,有一个 result 对象,可通过 exports 将 result 中的属性导出到环境变量,生命周期为当前 Pipeline。
语法格式为:
 |  | 
from-key要导出的Job result对象中的属性名,支持环境变量,支持深层取值,参考lodash.get。to-key映射到环境变量中的变量名。
有如下三种方式设置 result:
脚本任务执行结果
解析输出中的自定义变量
内置任务的 result
脚本任务执行结果
script 自定义脚本任务执行完,Job result的属性有:
code: 返回码stdout: 标准输出stderr: 标准错误info: 标准输出、标准错误,按时序的混合体
注意:可使用 printf "%s" "hello\nworld" 来输出变量,以消除标准输出流最后的换行符,同时保留 \n 等转义字符。
 |  | 
包含 if、ifModify、ifNewBranch 等判断逻辑时,可设置的属性有:
skip: 如果执行上述判断逻辑后跳过任务执行则返回跳过原因,否则为空字符串。
 |  | 
解析输出中的自定义变量
CI 会从标准输出流里按行识别 ##[set-output key=value] 格式的内容,自动放入 result 对象中。
若变量值包含换行符 \n,可对变量值进行 base64 或 escape 编码。
变量值若以 base64, 开始,云原生构建 会对 base64, 后面的内容做 base64 解码,否则会对变量值做 unescape 解码。
使用 Node.js 示例代码如下:
// test.js
const value = "测试字符串\ntest string";
// 输出 base64 编码的变量值
console.log(
  `##[set-output redline_msg_base64=base64,${Buffer.from(value, "utf-8").toString("base64")}]`,
);
// 输出 escape 编码的变量值
console.log(`##[set-output redline_msg_escape=${escape(value)}]`); |  | 
使用 echo 示例代码如下:
 |  | 
注意:在 Unix-like 系统中,base64 命令默认会在每76个字符后添加一个换行符,可使用 -w 0 选项来禁用换行避免 CI 未能按行解析出变量。
不包含 \n 的变量值可直接输出
echo "##[set-output redline_msg=some value]":::tip 受限于系统环境变量值长度限制,过大的变量值无效。
CI 会忽略大于等于 100KB 的变量值。可写入文件中自行解析。
对于敏感信息,建议使用 read-file 内置任务。 :::
内置任务中导出环境变量
一些内置任务会有输出结果,可通过 exports 导出为环境变量。
 |  | 
result 内容参考各内置任务文档。
增删改查环境变量
可以覆盖已有的环境变量,设为空字符串或 null 即为删除。
 |  | 
使用环境变量
在 脚本任务 中使用
执行脚本任务时,流水线设置的环境变量作为任务执行时的环境变量
 |  | 
变量替换
配置文件中的一些属性值会进行变量替换。
如有环境变量 env_name=env_value,那么属性值中 $env_name 会被替换成 env_value,若 env_name 无值,则会替换成空字符串。
下面列出了会进行变量替换的属性:
- 内置任务
 
内置任务 options 内的属性值和 optionsFrom 会进行变量替换。
 |  | 
 |  | 
options 的最终内容为:
 |  | 
- 插件任务
 
插件任务 settings 内的属性值和 settingsFrom 会进行变量替换。
 |  | 
 |  | 
settings 的最终内容为:
 |  | 
另外写在 Dockerfile 中的 LABEL 指定的 settingsFrom 同样可以进行变量替换
FROM node:20
LABEL cnb.cool/settings-from="$address"- env
 
env 下声明的属性值可以引用上层 env 中的变量进行替换
 |  | 
- imports
 
imports 的属性值以及所声明的文件中的属性值均会进行变量替换。
若 imports 为数组,数组前面文件中声明的变量对数组后面元素有效。
 |  | 
 |  | 
 |  | 
- pipeline.runner.tags
 
 |  | 
- pipeline.docker.volumes
 
 |  | 
- ifModify
 
 |  | 
- name
 
pipeline.name 、stage.name 和 job.name 的属性值会进行变量替换。
 |  | 
- lock.key
 
 |  | 
 |  | 
- allowFailure
 
 |  | 
阻止变量替换
如果不希望 $env_name 被替换,可以通过 \$ 阻止替换
 |  | 
限制
环境变量名需由字母、数字或 _ 组成,不能以数字开头。
变量值的长度不能超过 100KiB。