使用bash脚本在azure devops管道中设置组变量

问题描述 投票:0回答:1
#!/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

但是这个变量是动态的

bash azure-pipelines pipeline azure-pipelines-yaml bash-completion
1个回答
0
投票

根据本文档关于用户定义的多行变量

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

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.