Um comando bash:
$(System.DefaultWorkingDirectory)/yq_linux_amd64 '. *= load("${{ parameters.HELM_CHART_PATH }}/values/DEV/${{ parameters.COMPONENT }}.yaml")' ${{ parameters.HELM_CHART_PATH }}/values/global-values.yaml > $(System.DefaultWorkingDirectory)/deployment-values.yaml
Está mesclando valores de 2 arquivos YAML e enviando a saída mesclada para um único arquivo. Não consigo entender a sintaxe da primeira aspa simples até que a saída seja redirecionada. Alguém pode me ajudar a entender o que isso significa?
Por que ambos os operandos estão depois do operador *=
? , que .
é o diretório atual, mas o que significa antes de *=
?
Além disso, por que apenas o 1º operando está entre load ()
e qual é o seu significado?
O processador YAML de Mike Farah
yq
tem uma sintaxe de expressão semelhantejq
à do , um processador JSON bem conhecido. Suas expressões são filtros (não que esse fato importe muito neste caso específico).Na expressão
... o ponto inicial nesta expressão representa "o documento atual neste ponto", que no comando fornecido será qualquer coisa que o documento
yq
ler de sua entrada, ou seja, o arquivo${{ parameters.HELM_CHART_PATH }}/values/global-values.yaml
.O operador
*=
mescla o documento à direita com o documento à esquerda, ou seja, o documento de entrada com o que a expressãoload("file")
produzir. Aload()
função, na expressão em sua pergunta, carregará um documento de${{ parameters.HELM_CHART_PATH }}/values/DEV/${{ parameters.COMPONENT }}.yaml
.Toda essa operação é uma instância específica do seguinte comando, que pode ser encontrado na seção Mesclar dois arquivos no
yq
manual:Para mais exemplos de várias operações de mesclagem, consulte a seção pai Multiplicar (Mesclar) .
Com o de Andrey Kislyuk
yq
, que é um wrapper em torno dojq
processador (e que, portanto, compartilha exatamente sua sintaxe de expressão), um comando semelhante seria semelhante a... onde, novamente, o ponto representa "o documento atual neste ponto", e onde
input
lê o próximo objeto da entrada, o que, se os dois arquivos contiverem um único documento de nível superior, seria exatamente como. *= load("file2")
com o de Mike Farahyq
.A
-y
opção é usada para produzir uma saída YAML, ou obteríamos um documento JSON de volta.Isso não é uma coisa do Bash. Estou postando a resposta aqui para que qualquer pessoa possa usar como referência no futuro.
Observação: observe que o "comando" no exemplo abaixo é apenas para compreensão e não está relacionado ao "comando" da pergunta.
A mesclagem de arquivos YAML é feita usando uma ferramenta chamada YQ (Referência: https://mikefarah.gitbook.io/yq/operators/multiply-merge )
Também encontrei uma explicação aqui .
Explicação:
Em alto nível, isso funciona reduzindo as chaves de caminho de file1 para file2, onde em cada caminho usamos file2 se presente, e file1 caso contrário.