#!/bin/bash
# Read Docker Compose file
compose_file="docker-compose.yml"
images=($(grep -E '^ *image:' $compose_file | awk '{print $2}' | cut -d ':' -f 1))
# Initialize group variable
all_variables=()
for image in "${images[@]}"; do
# Store image name in pipeline variable
variable_name="image_${image//[^a-zA-Z0-9_]/_}"
# Set individual variable
# echo "Setting pipeline variable for $variable_name: $image"
echo "##vso[task.setvariable variable=$variable_name]$image"
# Concatenate variable assignment to group variable with newline
group _variable+="$variable_name: $image"$'\n'
done
echo "$all_variables"
# Set group variable in Azure Pipelines
# echo "Setting group variable in Azure Pipelines"
echo -e "##vso[task.setvariable variable=allVariables;isOutput=true]$all_variables"
echo "allVariables:$allVariables"
但是(所有变量)组变量未在管道中设置,所以请给我任何建议,我所做的一切都是正确的,过程是正确的,就像这件事是可能的
我就是这样期待的
variables:
allvariables: |
image_postgres: postgres
image_mongo: mongo
image_quay_io_keycloak_keycloak: quay.io/keycloak/keycloak
image_discovery_server: discovery-server
image_api_gateway: api-gateway
image_auth_service: auth-service
但是这个变量是动态的
根据本文档关于用户定义的多行变量,
Azure DevOps 支持多行变量,但有一些限制。
管道任务等下游组件可能无法正确处理变量值。
Azure DevOps 不会更改用户定义的变量值。变量值在作为多行变量传递之前需要正确格式化。格式化变量时,请避免特殊字符,不要使用受限名称,并确保使用适用于代理操作系统的行结束格式。
多行变量的行为因操作系统而异。为了避免这种情况,请确保为目标操作系统正确设置多行变量的格式。
Azure DevOps 永远不会更改变量值,即使您提供不受支持的格式也是如此。
根据在脚本中生成
$multi_line_variable
以便在下游任务中使用output变量值的要求,您可以考虑将$multi_line_variable
的值格式化为BASE64单行字符串并在下游解码该字符串脚本。这是一个示例供您参考。
steps:
- bash: |
compose_file="docker-compose.yml"
images=($(grep -E '^ *image:' $compose_file | awk '{print $2}' | cut -d ':' -f 1))
# Initialize multi-line variable
multi_line_variable=""
for image in "${images[@]}"; do
# Store image name in pipeline variable
variable_name="image_${image//[^a-zA-Z0-9_]/_}"
multi_line_variable+="$variable_name: $image"$'\n'
done
echo -e "multi_line_variable is:\n$multi_line_variable"
one_line_variable=$(echo -n "$multi_line_variable" | base64 -w 0)
echo one_line_variable is $one_line_variable
echo "##vso[task.setvariable variable=allVariables;isOutput=true]$one_line_variable"
name: OutputVar
- bash: |
echo OutputVar.allVariables $(OutputVar.allVariables)
echo -n '$(OutputVar.allVariables)' | base64 --decode