De acordo com a documentação do GCP CloudBuild, é possível usar a expansão de parâmetros do shell em substituições de pipeline.
Quero definir um nome de tag para imagens docker com base nos nomes de nossos branches git. Esses nomes devem conter apenas caracteres minúsculos e nenhuma barra. Então, quero usar a expansão de parâmetros para isso:
substitutions:
_BRANCH_NAME_LOWERCASED: ${BRANCH_NAME,,} # to lowercase
_BRANCH_NAME_FLATTENED: ${_BRANCH_NAME_LOWERCASED////-} # replace "/" with "-"
_DOCKER_IMAGE_TAG: ${SHORT_SHA:-$_BRANCH_NAME_FLATTENED}
No entanto, isso falha na segunda etapa:
[_BRANCH_NAME_FLATTENED -> ${_BRANCH_NAME_LOWERCASED////-}]: substituição incorreta
Então, aparentemente, a primeira expansão funciona, a segunda falha. O que sugere que a expansão parece estar disponível apenas em partes.
O que é surpreendente, já que isso funciona no CLI:
$ SHORT_SHA=
$ BRANCH_NAME=BRANCH-80/some-fancy-feature
$
$ _BRANCH_NAME_LOWERCASED=${BRANCH_NAME,,}
$ _BRANCH_NAME_FLATTENED=${_BRANCH_NAME_LOWERCASED////-}
$ _DOCKER_IMAGE_TAG=${SHORT_SHA:-$_BRANCH_NAME_FLATTENED}
$
$ echo $_DOCKER_IMAGE_TAG
branch-80-some-fancy-feature
Duas perguntas:
- Estou esquecendo de algo aqui ou a substituição é realmente implementada apenas "parcialmente"?
- Alguém tem alguma ideia de como obter esse nome de tag?
ATUALIZAR:
Um colega sugeriu "escapar" a barra dentro da segunda regra de expansão, a barra que na verdade deveria ser substituída. Não vejo nenhuma razão para isso, nem nenhuma dica para isso em nenhuma documentação, nem os testes na direção foram bem-sucedidos.
No entanto, verifica-se que esse padrão não gera o erro acima, então a regra de expansão parece ser aplicada:
_BRANCH_NAME_FLATTENED: ${_BRANCH_NAME_LOWERCASED//\\//-}
Mais uma vez: Isso não funciona! Mas é interessante que nenhum erro seja levantado com esse comando. Ele simplesmente não tem efeito algum, o que faz sentido, já que eu presumo que ele tenta substituir ocorrências de um "/" literal no assunto, que simplesmente não existe.
Você precisa escapar a barra (
\/
porque a substituição está sendo usada/
como delimitador.Exemplo:
cloudbuild.yaml
:E: