Estou seguindo a referência da Microsoft:
e este é meu arquivo yml:
parameters:
- name: poolType # pool type for the agent, valid values are "windows" or "linux"
type: string
default: "windows"
steps:
# Echo the poolType parameterAzure
- script: |
echo "Pool Type: ${{ parameters.poolType }}"
displayName: "Echo poolType"
# set gittoken for authentications
- ${{ if eq(parameters.poolType, 'linux') }}:
- script: |
git config --global --list
git config --global url."https://token:[email protected]".insteadOf "https://[email protected]"
git config --global --list
displayName: 'set extra header for Git in Linux'
env:
MODUL_TOKEN: $(modules_token)
- ${{ if eq(parameters.poolType, 'windows') }}:
- script: |
git config --global --list
git config --global url."https://token:%MODUL_TOKEN%@dev.azure.com".insteadOf "https://[email protected]"
git config --global --list
displayName: 'set extra header for Git in Windows'
env:
MODUL_TOKEN: $(modules_token)
E esta é a saída da tarefa echo:
Por que a tarefa "'definir cabeçalho extra para Git no Linux'" não está sendo executada? A condição é verdadeira!
Primeira tentativa:
Usei o seguinte código, mas não está funcionando novamente
- script: |
git config --global --list
git config --global url."https://token:[email protected]".insteadOf "https://[email protected]"
git config --global --list
displayName: 'set extra header for Git in Linux'
env:
MODUL_TOKEN: $(modules_token)
condition: ${{ eq(parameters.poolType, 'linux') }}
- script: |
git config --global --list
git config --global url."https://token:%MODUL_TOKEN%@dev.azure.com".insteadOf "https://[email protected]"
git config --global --list
displayName: 'set extra header for Git in Windows'
env:
MODUL_TOKEN: $(modules_token)
condition: ${{ eq(parameters.poolType, 'windows') }}
Sou capaz de usar ambas as técnicas como você as escreveu, sem problemas.
Os parâmetros existem apenas em tempo de compilação. A sequência de execução do pipeline expande as expressões de tempo de execução
${{ <expr> }}
em tempo de compilação.Os
condition
elementos em estágios, trabalhos e tarefas são expressões de tempo de execução que são avaliadas como verdadeiro ou falso. O que você escreveucondition: ${{ eq( parameters.poolType, 'linux' ) }}
será avaliado em tempo de compilação comotrue
oufalse
. O que é uma sintaxe estranha, mas válida.Aqui está um pipeline funcional com seu código como você o escreveu (menos a lógica de configuração do git):
O pipeline quando executado com "linux":
O pipeline quando executado com "windows":
Esta é uma das partes mais difíceis de acertar na sintaxe YAML do Azure Pipeline: qual sintaxe está disponível em qual estágio da expansão do modelo ? Não consigo encontrar a documentação exata que informa se os valores dos parâmetros foram avaliados quando a expansão do modelo ocorre, mas meu palpite é que não.
Nesse caso, qualquer sintaxe YAML que altere a estrutura do modelo (portanto, condicionais e loops YAML) não verá valor aqui.
Os documentos que você referencia mostram que, para parâmetros condicionais, você pode usá-los
condition
na própria etapa.Mas no seu caso, pode ser ainda mais fácil forçar o shell a executar bash ou pwsh tanto no Windows quanto no Linux, então você não precisa dessa condição:
Usamos esta abordagem para condições de degrau:
condition: eq(${{ parameters.runBuild }}, true)
Isso funciona para nós, é um pequeno ajuste na sua abordagem.