Esta página explica como configurar o Cloud Build para executar scripts bash num passo de compilação. Se for um utilizador recente do Cloud Build, leia os inícios rápidos e a vista geral da configuração de compilação primeiro.
Pode executar scripts bash num passo de compilação para configurar vários fluxos de trabalho, incluindo:
- Executar vários comandos num passo de compilação.
- Ler a partir do sistema de ficheiros.
- Incorporar lógica, como novas tentativas ou condições.
- Produzir resultados no registo, por exemplo, executar
echo $VARNAME
.
Usar o campo script
O Cloud Build fornece um campo script
que pode usar para especificar scripts de shell a executar num passo de compilação. O campo script
aceita um valor de string único.
Pode prefixar o valor da string com um shebang
para especificar a shell que vai interpretar o script. Por exemplo, adicione #!/usr/bin/env bash
para especificar a shell Bash. Se não prefixar a string do script com um shebang, o Cloud Build usa #!/bin/sh
, que é a shell sh básica, e não a shell Bash.
Se especificar script
num passo de compilação, não pode especificar args
nem entrypoint
no mesmo passo.
O seguinte fragmento demonstra o campo script
:
YAML
steps:
- name: 'bash'
script: |
#!/usr/bin/env bash
echo "Hello World"
- name: 'ubuntu'
script: echo hello
- name: 'python'
script: |
#!/usr/bin/env python
print('hello from python')
JSON
{
"steps": [
{
"name": "bash",
"script": "#!/usr/bin/env bash echo 'Hello World'"
},
{
"name": "ubuntu",
"script": "echo hello"
},
{
"name": "python",
"script": "#!/usr/bin/env python\nprint('hello from python')\n"
}
]
}
Usar substituições com o campo script
Os scripts não suportam diretamente substituições, mas suportam variáveis de ambiente. Pode mapear substituições para variáveis de ambiente, quer automaticamente de uma só vez, quer manualmente definindo cada variável de ambiente por si.
Mapeie substituições automaticamente
Ao nível da criação. Para mapear automaticamente todas as substituições para variáveis de ambiente, que vão estar disponíveis durante toda a compilação, defina
automapSubstitutions
comotrue
como opção ao nível da compilação. Por exemplo, o ficheiro de configuração de compilação seguinte mostra a substituição$_USER
definida pelo utilizador e a substituição$PROJECT_ID
predefinida mapeadas para variáveis de ambiente:YAML
steps: - name: 'ubuntu' script: | #!/usr/bin/env bash echo "Hello $_USER" - name: 'ubuntu' script: | #!/usr/bin/env bash echo "Your project ID is $PROJECT_ID" options: automapSubstitutions: true substitutions: _USER: "Google Cloud"
JSON
{ "steps": [ { "name": "ubuntu", "script": "#!/usr/bin/env bash echo 'Hello $_USER'" }, { "name": "ubuntu", "script": "#!/usr/bin/env bash echo 'Your project ID is $PROJECT_ID'" } ], "options": { "automap_substitutions": true }, "substitutions": { "_USER": "Google Cloud" } }
Ao nível do passo. Para mapear automaticamente todas as substituições e torná-las disponíveis como variáveis de ambiente num único passo, defina o campo
automapSubstitutions
comotrue
nesse passo. No exemplo seguinte, apenas o segundo passo mostra as substituições corretamente, porque é o único com o mapeamento de substituições automáticas ativado:YAML
steps: - name: 'ubuntu' script: | #!/usr/bin/env bash echo "Hello $_USER" - name: 'ubuntu' script: | #!/usr/bin/env bash echo "Your project ID is $PROJECT_ID" automapSubstitutions: true substitutions: _USER: "Google Cloud"
JSON
{ "steps": [ { "name": "ubuntu", "script": "#!/usr/bin/env bash echo 'Hello $_USER'" }, { "name": "ubuntu", "script": "#!/usr/bin/env bash echo 'Your project ID is $PROJECT_ID'", "automap_substitutions": true } ], }, "substitutions": { "_USER": "Google Cloud" }
Além disso, pode disponibilizar as substituições como variáveis de ambiente em toda a compilação e, em seguida, ignorá-las num passo. Defina
automapSubstitutions
comotrue
ao nível da compilação e, em seguida, defina o mesmo campo comofalse
no passo em que quer ignorar as substituições. No exemplo seguinte, embora as substituições de mapeamento estejam ativadas ao nível da compilação, o ID do projeto não é impresso no segundo passo, porqueautomapSubstitutions
está definido comofalse
nesse passo:YAML
steps: - name: 'ubuntu' script: | #!/usr/bin/env bash echo "Hello $_USER" - name: 'ubuntu' script: | #!/usr/bin/env bash echo "Your project ID is $PROJECT_ID" automapSubstitutions: false options: automapSubstitutions: true substitutions: _USER: "Google Cloud"
JSON
{ "steps": [ { "name": "ubuntu", "script": "#!/usr/bin/env bash echo 'Hello $_USER'" }, { "name": "ubuntu", "script": "#!/usr/bin/env bash echo 'Your project ID is $PROJECT_ID'", "automap_substitutions": false } ], "options": { "automap_substitutions": true }, }, "substitutions": { "_USER": "Google Cloud" }
Mapeie substituições manualmente
Pode mapear manualmente as substituições para variáveis de ambiente. Todas as variáveis de ambiente são definidas ao nível do passo através do campo env
, e o âmbito das variáveis está restrito ao passo onde são definidas. Este campo recebe uma lista de chaves e valores.
O exemplo seguinte mostra como mapear a substituição $PROJECT_ID
para a variável de ambiente BAR
:
YAML
steps:
- name: 'ubuntu'
env:
- 'BAR=$PROJECT_ID'
script: 'echo $BAR'
JSON
{
"steps": [
{
"name": "ubuntu",
"env": [
"BAR=$PROJECT_ID"
],
"script": "echo $BAR"
}
]
}
Executar scripts bash no disco
Se tiver o script bash guardado num ficheiro, armazene o ficheiro juntamente com a origem da compilação e faça referência ao ficheiro de script no ficheiro de configuração da compilação:
YAML
steps:
- name: 'bash'
args: ['./myscript.bash']
JSON
{
"steps": [
{
"name": "bash",
"args": [
"./myscript.bash"
]
}
]
}
Para usar um script bash no ficheiro se o bash não for o ponto de entrada predefinido da imagem que está a usar, adicione um campo entrypoint
que aponte para o bash:
YAML
steps:
- name: 'gcr.io/cloud-builders/gcloud'
entrypoint: 'bash'
args: ['tools/myScript.sh','--foo']
JSON
{
"steps": [
{
"name": "gcr.io/cloud-builders/gcloud",
"entrypoint": "bash",
"args": [
"tools/myScript.sh",
"--foo"
]
}
]
}
Executar scripts bash inline
Para executar comandos bash com a imagem bash
, especifique bash
como o name
do passo de compilação e o comando no campo args:
YAML
steps:
- name: 'bash'
args: ['echo', 'I am running a bash command']
JSON
{
"steps": [
{
"name": "bash",
"args": [
"echo",
"I am running a bash command"
]
}
]
}
Se a imagem que está a usar for pré-embalada com bash
, mas se bash
não for o ponto de entrada predefinido, adicione um campo entrypoint
que aponte para bash
. No exemplo abaixo, o ponto de entrada bash
é usado para executar comandos gcloud
que consultam o Cloud Build para obter o estado da compilação, listando as compilações com um estado de falha.
YAML
steps:
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
entrypoint: 'bash'
args:
- '-eEuo'
- 'pipefail'
- '-c'
- |-
gcloud builds list > builds.txt
while read line; do
if grep -q "FAILURE" <<< "$line"; then
echo "$line"
fi
done < builds.txt
JSON
{
"steps": [
{
"name": "gcr.io/google.com/cloudsdktool/cloud-sdk",
"entrypoint": "bash",
"args": [
"-eEuo",
"pipefail",
"-c",
"gcloud builds list > builds.txt\nwhile read line; do\n if grep -q \"FAILURE\" <<< \"$line\"; then\n echo \"$line\"\n fi\ndone < builds.txt"
]
}
]
}
A flag -c
no código acima é usada para executar comandos de várias linhas. Qualquer string que passe após -c
é tratada como um comando. Para mais informações sobre a execução de comandos bash com o -c
, consulte a documentação do bash.
O que se segue?
- Saiba como iniciar uma compilação manualmente.
- Saiba como automatizar compilações com acionadores.
- Saiba como configurar a ordem dos passos de criação.
- Saiba como usar criadores contribuídos pela comunidade e criadores personalizados.