我正在构建一个管道来部署 Web 应用程序并迁移一些租户数据库。
我在我的库中定义了变量,这些变量从 keyvault 中提取秘密。如果我在管道上启用诊断日志记录,我可以看到类似的输出
##[debug]Promise for downloading secret value for: Test1
Downloading secret value for: Test1.
##[debug]Promise for downloading secret value for: Test2
Downloading secret value for: Test2.
##[debug]Promise for downloading secret value for: DATABASE-URL-FOO-TEST
Downloading secret value for: DATABASE-URL-FOO-TEST.
##[debug]Promise for downloading secret value for: DATABASE-URL-FOO-TEST-ALT
Downloading secret value for: DATABASE-URL-FOO-TEST-ALT.
...
##[debug]set DATABASE-URL-FOO-TEST-ALT=********
##[debug]Processed: ##vso[task.setvariable variable=DATABASE-URL-FOO-TEST-ALT;isOutput=false;issecret=true;]***
##[debug]set DATABASE-URL-FOO-TEST-ALT=********
##[debug]Processed: ##vso[task.setvariable variable=DATABASE-URL-FOO-TEST-ALT;isOutput=false;issecret=true;]***
##[debug]set Test2=********
##[debug]Processed: ##vso[task.setvariable variable=Test2;isOutput=false;issecret=true;]***
##[debug]set Test2=********
现在我真正想做的是
for in
覆盖所有以 DATABASE-URL-
开头的变量,并将该 URL 传递给我的迁移脚本。我尝试了一些方法,但似乎无法在环境中找到我的变量。这个 bash 任务没有给我 for
循环的输出。
- task: Bash@3
inputs:
targetType: 'inline'
script: |
echo "all vars"
for var in "${!variable@}"; do
echo "$var=${!var}"
done
for key in "${!VAR[@]}"; do
echo "$key"
if [[ $key == SECRET_DATABASE-URL* ]]; then
DB_URL=${!VAR[$key]} echo "$DB_URL"
DB_URL=${!VAR[$key]} ./bin/migrate-databases.sh
fi
done
在该任务的诊断输出中,我可以看到类似的行
##[debug]loading SECRET_DATABASE-URL-FOO-TEST-ALT
##[debug]loading SECRET_SYSTEM_ACCESSTOKEN
##[debug]loading SECRET_TEST2
##[debug]loading SECRET_DATABASE-URL-FOO-TEST
##[debug]loading SECRET_TEST1
所以看起来它们已经被设置好了。我怎样才能得到这些变量?
我的管道在
vmImage:ubuntu-latest
上运行,因此使用 Bash,但我愿意接受任何其他方法来实现此目的,只要它与 Ubuntu 代理兼容即可。
现在我真正想做的是在所有以 DATABASE-URL 开头的变量中,并将该 URL 传递给我的迁移脚本。我尝试了一些方法,但似乎无法在环境中找到我的变量。
与普通变量不同,秘密变量不会自动解密为脚本的环境变量。您无法直接从环境中获取它们(dochere)。
在我这边检查,它能够使用 Azure CLI 获取秘密变量
name
,任务如下:
- bash: |
# Get all variables from the variable group
variables=$(az pipelines variable-group variable list --group-id 11 --output json)
# Get the "DATABASE-URL-" started variables name
vars=$(echo "$variables" | jq -r 'to_entries[] | select(.key | startswith("DATABASE-URL-")) | .key')
echo "$vars"
for var in $vars
do
echo "checking: $var" # output the variable name
#echo $($var) # it doesn't work
#echo "${!var}" # it doesn't work
done
displayName: 'Get Secret Variables values'
env:
AZURE_DEVOPS_EXT_PAT: $(System.AccessToken)
但是,使用脚本中的变量名,你无法得到
variable value
。
例如,$($var)
和${!var}
不起作用,甚至可以删除变量名称中的hyphen -
以简化变量名称。
DevOps 中恐怕不支持动态获取预期的秘密变量值。