cnb:read-file
1020 字约 3 分钟
cnb:read-file
读取本地文件内容,解析为对象后导出为环境变量,供后续任务使用。
使用场景:构建过程中产生的敏感信息(如动态获取的令牌、证书、密码)无法事先写入密钥仓库, 可以先由脚本写入文件,再用该内置任务读取并导出为环境变量——全程不经过日志,不会泄露。
与其他传递方式的区别:
##[set-output key=value]输出更便捷,但内容会打印到日志,不适合敏感信息##[set-secret key=*****]会对日志打码,适合敏感信息,但需构建机支持该特性imports只能导入远端仓库中已存在的文件,本任务只读取构建过程中生成的本地文件
不支持场景:本任务只负责读取与导出,不做内容加密,也不校验敏感值是否被日志打码。
适用事件
参数
filePath
- type:
String - required:
true
本地文件路径。
输出结果
任务按文件后缀解析文件内容,把结果对象写入 result,可通过 exports 导出为环境变量。
不同后缀的解析方式:
| 后缀 | 解析方式 |
|---|---|
.json | 解析为 JSON 对象 |
.yml、.yaml | 解析为 YAML 对象 |
.crt、.cer、.key、.pem、.pub 等 | 文件名与后缀拼接作为 Key,文件的完整内容作为 Value |
| 其他 | 按 key=value 逐行解析为对象,即纯文本文件 |
证书类后缀的 Key 由「文件名 + 后缀」拼接而成,并把后缀中的 . 替换为 _,例如 server.key 的 Key 为 server_key。
exports 的 from-key 用法见 环境变量。
JSON 配置示例
最典型的用法:读取一个 JSON 配置文件,把其中的变量导出为环境变量。
db-config.json
{
"host": "db.example.com",
"port": 3306,
"auth": {
"username": "admin",
"token": "readonly"
},
"pool": {
"min": 1,
"max": 10
}
}.cnb.yml
main:
push:
- stages:
- name: 读取并导出 JSON 配置
type: cnb:read-file
options:
filePath: db-config.json
exports:
host: DB_HOST # 一级 Key
port: DB_PORT # 一级 Key,非字符串值会被转成字符串
auth.username: DB_USER # 多级 Key,用 . 逐级拼接属性名
auth.token: DB_TOKEN # 多级 Key,可继续往下取值
pool.max: DB_POOL_MAX # 多级 Key,可继续往下取值
- name: 使用导出的变量
script:
- echo "DB_HOST: $DB_HOST"
- echo "DB_USER: $DB_USER"
- echo "DB_POOL_MAX: $DB_POOL_MAX"注意
- 只有叶子节点的值适合作为环境变量导出。
- 取到对象时(如
auth)会导出为 JSON 字符串(JSON.stringify结果)。 - 取到数组时(如
pool)会导出为逗号拼接的字符串,无法展开为多个环境变量。 - 数组元素按下标访问,如
list.0.name。 - 取值不存在时不会报错,该环境变量会被保留;若此前已定义同名变量则维持原值,不会被清空或置为空字符串。
导出示例:读取一个 JSON 文件,把其中的变量导出为环境变量。
.cnb.yml
main:
push:
- env:
myKey: deepWithEnvKey
stages:
- name: write env file
script: echo "write env to myJson.json"
- name: export env
type: cnb:read-file
options:
filePath: myJson.json
exports:
myVar: ENV_MY_VAR
deep.myVar: ENV_DEEP_MY_VAR # 指定多级的key
$myKey.myVar: ENV_ENV_KEY_MY_VAR # 通过环境变量指定获取的key
- name: echo env
script:
- echo $ENV_MY_VAR
- echo $ENV_DEEP_MY_VAR
- echo $ENV_ENV_KEY_MY_VAR上例读取的 myJson.json 内容如下:
myJson.json
{
"myVar": "myVar",
"deep": {
"myVar": "myVar in deep"
},
"deepWithEnvKey": {
"myVar": "myVar in deepWithEnvKey"
}
}配置样例
将后续任务需要的变量写入文件,再用该内置任务读取并导出为环境变量。
.cnb.yml
main:
push:
- stages:
- name: 构造敏感信息文件
script: |
echo "API_TOKEN=xxx" > .env.local
- name: 读取并导出
type: cnb:read-file
options:
filePath: .env.local
exports:
API_TOKEN: API_TOKEN
- name: 使用环境变量
script: echo "use $API_TOKEN"