Considere o seguinte pipeline e modelo do Azure YAML que usa a função convertToJson para converter um parâmetro de objeto em uma string JSON:
parameters:
- name: foo
type: string
default: 'b"ar'
trigger: none
pool:
vmImage: 'ubuntu-latest'
variables:
- name: foo
value: 'b"ar'
steps:
- checkout: none
- template: /pipelines/steps/set-settings.yaml
parameters:
settings:
fooLiteral: 'b"ar'
fooParameter: ${{ parameters.foo }}
fooCompiledVariable: ${{ variables.foo }}
fooRuntimeVariable: $(foo)
Modelo /pipelines/steps/set-settings.yaml:
parameters:
- name: settings
type: object
steps:
- script: |
echo $SETTINGS
displayName: 'Display settings'
env:
SETTINGS: ${{ convertToJson(parameters.settings) }}
Ao executar o pipeline, por que todos os valores são escapados corretamente, exceto fooRuntimeVariable
?
Teste o mesmo exemplo YAML e consigo reproduzir o mesmo problema.
A causa raiz do problema é que a variável macro (
$(foo)
) não é expandida quando a expressão: ConvertToJson é executada.Quando a expressão ConvertToJson for executada, fooRuntimeVariable manterá o valor de
$(foo)
em vez de expandir o valor para'b"ar'
.Então o resultado real da conversão:
Depois de imprimi-lo na tarefa de script, o
$(foo)
será expandido para o valor:'b"ar'
.Para provar isso, adicionei uma condição ao modelo para verificar o resultado da conversão:
Aqui está meu exemplo:
Modelo YAML:
YAML principal:
Quando executarmos o Pipeline, a tarefa Display settings será ignorada. Então, podemos verificar o resultado da condição: ela mostrará o
$(foo)
para fooRuntimeVariable .Para resumir, quando usamos a expressão ConvertToJson, sugiro que podemos usar expressões de tempo de compilação (
${{xxx}}
) para usar variáveis.