如何在GitHub Workflow的curl请求JSON载荷中引用环境变量
问题根因
- 缺失
ACR_PATH环境变量定义:你提供的Workflow全局env配置中没有声明ACR_PATH,所有引用该变量的步骤都会读取到空值 - Bash单引号特性导致变量不解析:你用单引号包裹JSON载荷字符串,Bash中单引号会强制所有内容按字面量处理,不会做任何变量替换、表达式解析
- 直接拼接JSON有格式风险:如果你的环境变量包含空格、双引号等特殊字符,直接写入JSON会破坏结构,导致请求参数非法报错
修复方案
推荐用jq生成合法JSON,自动处理转义、变量替换,避免格式问题,你需要先补全ACR_PATH的定义,修复后的Create Container Web步骤代码如下:
- name: Create Container Web #if: steps.pr-label.outputs.result == 'true' env: # 此处填写你自己的ACR镜像地址前缀,也可以直接写到Workflow全局env配置中 ACR_PATH: "你的ACR镜像地址前缀" run: | AUTH_HEADER="Authorization: token $DEPLOYMENT_URL_TOKEN" CONTAINER_WEB_NAME="CONATINER" PROJECT_NAME="tirumalesh-automate" REGION="US" URL="https://abcd.com/$REGION/$PROJECT_NAME/container-web/$CONTAINER_WEB_NAME" # 用jq生成JSON,自动处理变量注入和特殊字符转义 PAYLOAD=$(jq -n \ --arg image "$ACR_PATH:$SNAPSHOT_VERSION" \ --arg key_vault "$KEY_VAULT" \ '{ "spec": { "image": $image, "secrets": { "key_vaults": [ { "name": $key_vault, "secrets": [ { "name": "mysql-pwd", "environment_variable": "mysql_pwd" } ] } ] } } }') curl --location --request PUT 'https://abcd/us/projects/tirumalesh-automate/resources/container-web/configuration-service' \ --header "$AUTH_HEADER" \ --header 'Content-Type: application/json' \ --data-raw "$PAYLOAD"
如果你不想用jq,也可以把包裹JSON的单引号换成双引号,内部的双引号全部转义即可实现变量解析:
PAYLOAD="{ \"spec\": { \"image\": \"${ACR_PATH}:${SNAPSHOT_VERSION}\", \"secrets\": { \"key_vaults\": [ { \"name\": \"${KEY_VAULT}\", \"secrets\": [ { \"name\": \"mysql-pwd\", \"environment_variable\": \"mysql_pwd\" } ] } ] } } }"
额外注意事项
原Workflow代码中Create Container Web步骤的#if注释行缩进错误,比下方的run多了2个空格,会导致Workflow语法校验失败,需要对齐缩进。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

