CNB Token 替换插件(Go 实现),将文件中的 token 占位符替换为来自环境变量、JSON 字符串或文件的变量值。
移植自 qetza/replacetokens(Node.js 版),以 CNB 插件规范重新实现。
所有参数通过 PLUGIN_ 前缀的环境变量传入。
| 参数 | 环境变量 | 说明 |
|---|---|---|
sources | PLUGIN_SOURCES | 源文件 glob 模式,多个以 ; 或换行分隔,支持 => 输出路径 |
至少还需要以下之一:
| 参数 | 环境变量 | 说明 |
|---|---|---|
use_env | PLUGIN_USE_ENV | true 时将当前所有环境变量作为变量 |
variables | PLUGIN_VARIABLES | 变量来源,支持内联 JSON / @<glob> 文件 / $ENV_VAR |
| 参数 | 环境变量 | 默认值 | 说明 |
|---|---|---|---|
root | PLUGIN_ROOT | CNB_WORKSPACE 或当前目录 | glob 相对路径的根目录 |
encoding | PLUGIN_ENCODING | auto | 文件编码(auto / utf-8 / utf-16le / utf-16be) |
token_pattern | PLUGIN_TOKEN_PATTERN | default | token 模式,见下方说明 |
token_prefix | PLUGIN_TOKEN_PREFIX | — | 自定义 token 前缀(custom 模式必填) |
token_suffix | PLUGIN_TOKEN_SUFFIX | — | 自定义 token 后缀(custom 模式必填) |
missing_var_action | PLUGIN_MISSING_VAR_ACTION | none | 变量缺失时的动作:none / keep / replace |
missing_var_default | PLUGIN_MISSING_VAR_DEFAULT | "" | replace 动作时的默认值 |
missing_var_log | PLUGIN_MISSING_VAR_LOG | warn | 变量缺失时的日志级别:off / info / warn / error |
escape | PLUGIN_ESCAPE | auto | 值转义类型:auto / off / json / xml / custom |
escape_char | PLUGIN_ESCAPE_CHAR | — | custom 转义时使用的转义字符 |
chars_to_escape | PLUGIN_CHARS_TO_ESCAPE | — | custom 转义时需要转义的字符集 |
recursive | PLUGIN_RECURSIVE | false | 递归替换(值中可包含其他 token) |
add_bom | PLUGIN_ADD_BOM | false | 写入文件时添加 BOM |
transforms | PLUGIN_TRANSFORMS | false | 启用 transform 功能 |
transforms_prefix | PLUGIN_TRANSFORMS_PREFIX | ( | transform 前缀 |
transforms_suffix | PLUGIN_TRANSFORMS_SUFFIX | ) | transform 后缀 |
case_insensitive_paths | PLUGIN_CASE_INSENSITIVE_PATHS | false | glob 大小写不敏感 |
include_dot_paths | PLUGIN_INCLUDE_DOT_PATHS | false | 包含 . 开头的文件/目录 |
separator | PLUGIN_SEPARATOR | . | 嵌套变量名展平分隔符 |
log_level | PLUGIN_LOG_LEVEL | info | 日志级别:debug / info / warn / error / off |
| 模式 | 前缀 | 后缀 | 示例 |
|---|---|---|---|
default | #{ | }# | #{MY_VAR}# |
azurepipelines | $( | ) | $(MY_VAR) |
doublebraces | {{ | }} | {{MY_VAR}} |
doubleunderscores | __ | __ | __MY_VAR__ |
githubactions | ${{ | }} | ${{MY_VAR}} |
octopus | #{ | } | #{MY_VAR} |
custom | 自定义 | 自定义 | — |
PLUGIN_VARIABLES 支持多种来源,多个条目用换行或 ; 分隔:
# 内联 JSON
{"key": "value", "nested": {"a": "1"}}
# 从文件加载(支持 JSON / YAML,支持 glob)
@configs/*.json
# 从环境变量加载(值应为 JSON 字符串)
$MY_JSON_ENV
嵌套对象会被展平,键名自动转为大写:
{"db": {"host": "localhost", "port": 5432}}
展平后得到变量:DB.HOST=localhost、DB.PORT=5432(使用默认分隔符 .)。
启用 transforms=true 后,可在 token 中指定转换函数:
#{myvar(lower)}# → 转小写
#{myvar(upper)}# → 转大写
#{myvar(base64)}# → Base64 编码
#{myvar(indent,4)}# → 缩进 4 空格
#{myvar(raw)}# → 原始值(不转义)
插件执行完成后输出以下流水线变量:
| 变量 | 说明 |
|---|---|
files | 处理的文件数 |
tokens | 发现的 token 数 |
replaced | 成功替换的 token 数 |
defaults | 使用默认值的次数 |
transforms | 执行变换的次数 |
steps:
- name: 替换配置文件中的 token
image: docker.cnb.cool/r_r/replacetokens:latest
settings:
sources: "config/*.json;app.yaml"
variables: |
{"app_name": "myapp", "version": "1.0.0"}
@vars/production.json
token_pattern: default
missing_var_action: warn
escape: auto
log_level: info
steps:
- name: 使用环境变量替换
image: docker.cnb.cool/r_r/replacetokens:latest
settings:
sources: "deployment.yaml => deployment.out.yaml"
use_env: true
token_pattern: doublebraces
missing_var_action: keep
# 多个 glob(分号分隔)
**/*.json;**/*.yaml
# 输出到另一个文件(=> 语法)
template.json => output.json
# 通配符输出(* 对应输入文件名中匹配的部分)
templates/*.json => out/*.json
# 相对输出路径(相对于输入文件所在目录)
config.tmpl => config.json
go build -o replacetokens .
或交叉编译为 Linux 容器镜像使用:
GOOS=linux GOARCH=amd64 go build -o replacetokens .