logo
0
0
WeChat Login

replacetokens

CNB Token 替换插件(Go 实现),将文件中的 token 占位符替换为来自环境变量、JSON 字符串或文件的变量值。

移植自 qetza/replacetokens(Node.js 版),以 CNB 插件规范重新实现。


插件参数

所有参数通过 PLUGIN_ 前缀的环境变量传入。

必填

参数环境变量说明
sourcesPLUGIN_SOURCES源文件 glob 模式,多个以 ; 或换行分隔,支持 => 输出路径

至少还需要以下之一:

参数环境变量说明
use_envPLUGIN_USE_ENVtrue 时将当前所有环境变量作为变量
variablesPLUGIN_VARIABLES变量来源,支持内联 JSON / @<glob> 文件 / $ENV_VAR

可选

参数环境变量默认值说明
rootPLUGIN_ROOTCNB_WORKSPACE 或当前目录glob 相对路径的根目录
encodingPLUGIN_ENCODINGauto文件编码(auto / utf-8 / utf-16le / utf-16be)
token_patternPLUGIN_TOKEN_PATTERNdefaulttoken 模式,见下方说明
token_prefixPLUGIN_TOKEN_PREFIX自定义 token 前缀(custom 模式必填)
token_suffixPLUGIN_TOKEN_SUFFIX自定义 token 后缀(custom 模式必填)
missing_var_actionPLUGIN_MISSING_VAR_ACTIONnone变量缺失时的动作:none / keep / replace
missing_var_defaultPLUGIN_MISSING_VAR_DEFAULT""replace 动作时的默认值
missing_var_logPLUGIN_MISSING_VAR_LOGwarn变量缺失时的日志级别:off / info / warn / error
escapePLUGIN_ESCAPEauto值转义类型:auto / off / json / xml / custom
escape_charPLUGIN_ESCAPE_CHARcustom 转义时使用的转义字符
chars_to_escapePLUGIN_CHARS_TO_ESCAPEcustom 转义时需要转义的字符集
recursivePLUGIN_RECURSIVEfalse递归替换(值中可包含其他 token)
add_bomPLUGIN_ADD_BOMfalse写入文件时添加 BOM
transformsPLUGIN_TRANSFORMSfalse启用 transform 功能
transforms_prefixPLUGIN_TRANSFORMS_PREFIX(transform 前缀
transforms_suffixPLUGIN_TRANSFORMS_SUFFIX)transform 后缀
case_insensitive_pathsPLUGIN_CASE_INSENSITIVE_PATHSfalseglob 大小写不敏感
include_dot_pathsPLUGIN_INCLUDE_DOT_PATHSfalse包含 . 开头的文件/目录
separatorPLUGIN_SEPARATOR.嵌套变量名展平分隔符
log_levelPLUGIN_LOG_LEVELinfo日志级别:debug / info / warn / error / off

Token 模式

模式前缀后缀示例
default#{}##{MY_VAR}#
azurepipelines$()$(MY_VAR)
doublebraces{{}}{{MY_VAR}}
doubleunderscores______MY_VAR__
githubactions${{}}${{MY_VAR}}
octopus#{}#{MY_VAR}
custom自定义自定义

Variables 格式

PLUGIN_VARIABLES 支持多种来源,多个条目用换行或 ; 分隔:

# 内联 JSON
{"key": "value", "nested": {"a": "1"}}

# 从文件加载(支持 JSON / YAML,支持 glob)
@configs/*.json

# 从环境变量加载(值应为 JSON 字符串)
$MY_JSON_ENV

嵌套对象会被展平,键名自动转为大写:

{"db": {"host": "localhost", "port": 5432}}

展平后得到变量:DB.HOST=localhostDB.PORT=5432(使用默认分隔符 .)。


Transforms

启用 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

Sources 高级语法

# 多个 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 .