A ação hashicorp/setup-terraform
é uma ação JavaScript que configura a CLI do Terraform em seu fluxo de trabalho do GitHub Actions:
PATH
.terraform
e expor seu STDOUT, STDERR e código de saída como saídas denominadas stdout
, stderr
e exitcode
respectivamente. (Opcionalmente, isso pode ser ignorado se as etapas subsequentes no mesmo trabalho não precisarem acessar os resultados dos comandos do Terraform.) Depois de usar a ação, as etapas subsequentes no mesmo trabalho podem executar comandos arbitrários do Terraform usando a sintaxe run
do GitHub Actions. Isso permite que a maioria dos comandos do Terraform funcionem exatamente como na linha de comando local.
Esta ação pode ser executada em executores GitHub Actions ubuntu-latest
, windows-latest
e macos-latest
. Ao executar no windows-latest
o shell deve ser definido como Bash. Ao executar em executores GitHub Actions auto-hospedados, o NodeJS deve ser previamente instalado com a versão especificada em action.yml
.
A configuração padrão instala a versão mais recente da CLI do Terraform e instala o script wrapper para encapsular chamadas subsequentes para o binário terraform
:
steps :
- uses : hashicorp/setup-terraform@v3
Uma versão específica do Terraform CLI pode ser instalada:
steps :
- uses : hashicorp/setup-terraform@v3
with :
terraform_version : " 1.1.7 "
As credenciais para HCP Terraform (app.terraform.io) podem ser configuradas:
steps :
- uses : hashicorp/setup-terraform@v3
with :
cli_config_credentials_token : ${{ secrets.TF_API_TOKEN }}
As credenciais para Terraform Enterprise (TFE) podem ser configuradas:
steps :
- uses : hashicorp/setup-terraform@v3
with :
cli_config_credentials_hostname : ' terraform.example.com '
cli_config_credentials_token : ${{ secrets.TF_API_TOKEN }}
A instalação do script wrapper pode ser ignorada definindo a variável terraform_wrapper
como false
:
steps :
- uses : hashicorp/setup-terraform@v3
with :
terraform_wrapper : false
As etapas subsequentes podem acessar saídas quando o script wrapper estiver instalado:
steps :
- uses : hashicorp/setup-terraform@v3
- run : terraform init
- id : plan
run : terraform plan -no-color
- run : echo ${{ steps.plan.outputs.stdout }}
- run : echo ${{ steps.plan.outputs.stderr }}
- run : echo ${{ steps.plan.outputs.exitcode }}
As saídas podem ser usadas nas etapas subsequentes para comentar sobre a solicitação pull:
Aviso: há um limite para o número de caracteres dentro de um comentário do GitHub (65535).
Devido a essa limitação, você pode acabar com uma execução de fluxo de trabalho com falha, mesmo que o plano seja bem-sucedido.
Outra abordagem é anexar seu plano à variável de ambiente $GITHUB_STEP_SUMMARY que oferece suporte a descontos.
defaults :
run :
working-directory : ${{ env.tf_actions_working_dir }}
permissions :
pull-requests : write
steps :
- uses : actions/checkout@v4
- uses : hashicorp/setup-terraform@v3
- name : Terraform fmt
id : fmt
run : terraform fmt -check
continue-on-error : true
- name : Terraform Init
id : init
run : terraform init
- name : Terraform Validate
id : validate
run : terraform validate -no-color
- name : Terraform Plan
id : plan
run : terraform plan -no-color
continue-on-error : true
- uses : actions/github-script@v7
if : github.event_name == 'pull_request'
env :
PLAN : " terraform n ${{ steps.plan.outputs.stdout }} "
with :
github-token : ${{ secrets.GITHUB_TOKEN }}
script : |
const output = `#### Terraform Format and Style ?`${{ steps.fmt.outcome }}`
#### Terraform Initialization `${{ steps.init.outcome }}`
#### Terraform Validation ?`${{ steps.validate.outcome }}`
<details><summary>Validation Output</summary>
```n
${{ steps.validate.outputs.stdout }}
```
</details>
#### Terraform Plan `${{ steps.plan.outcome }}`
<details><summary>Show Plan</summary>
```n
${process.env.PLAN}
```
</details>
*Pusher: @${{ github.actor }}, Action: `${{ github.event_name }}`, Working Directory: `${{ env.tf_actions_working_dir }}`, Workflow: `${{ github.workflow }}`*`;
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: output
})
Em vez de criar um novo comentário a cada vez, você também pode atualizar um já existente:
defaults :
run :
working-directory : ${{ env.tf_actions_working_dir }}
permissions :
pull-requests : write
steps :
- uses : actions/checkout@v4
- uses : hashicorp/setup-terraform@v3
- name : Terraform fmt
id : fmt
run : terraform fmt -check
continue-on-error : true
- name : Terraform Init
id : init
run : terraform init
- name : Terraform Validate
id : validate
run : terraform validate -no-color
- name : Terraform Plan
id : plan
run : terraform plan -no-color
continue-on-error : true
- uses : actions/github-script@v7
if : github.event_name == 'pull_request'
env :
PLAN : " terraform n ${{ steps.plan.outputs.stdout }} "
with :
github-token : ${{ secrets.GITHUB_TOKEN }}
script : |
// 1. Retrieve existing bot comments for the PR
const { data: comments } = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
})
const botComment = comments.find(comment => {
return comment.user.type === 'Bot' && comment.body.includes('Terraform Format and Style')
})
// 2. Prepare format of the comment
const output = `#### Terraform Format and Style ?`${{ steps.fmt.outcome }}`
#### Terraform Initialization `${{ steps.init.outcome }}`
#### Terraform Validation ?`${{ steps.validate.outcome }}`
<details><summary>Validation Output</summary>
```n
${{ steps.validate.outputs.stdout }}
```
</details>
#### Terraform Plan `${{ steps.plan.outcome }}`
<details><summary>Show Plan</summary>
```n
${process.env.PLAN}
```
</details>
*Pusher: @${{ github.actor }}, Action: `${{ github.event_name }}`, Working Directory: `${{ env.tf_actions_working_dir }}`, Workflow: `${{ github.workflow }}`*`;
// 3. If we have a comment, update it, otherwise create a new one
if (botComment) {
github.rest.issues.updateComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: botComment.id,
body: output
})
} else {
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: output
})
}
A ação suporta as seguintes entradas:
cli_config_credentials_hostname
- (opcional) O nome do host de uma instância do HCP Terraform/Terraform Enterprise a ser colocada no bloco de credenciais do arquivo de configuração da CLI do Terraform. O padrão é app.terraform.io
.cli_config_credentials_token
- (opcional) O token de API para uma instância do HCP Terraform/Terraform Enterprise a ser colocada no bloco de credenciais do arquivo de configuração da CLI do Terraform.terraform_version
- (opcional) A versão do Terraform CLI a ser instalada. Em vez de uma string de versão completa, você também pode especificar uma string de restrição (consulte Semver Ranges para obter especificações de intervalo disponíveis). Os exemplos são: "<1.2.0"
, "~1.1.0"
, "1.1.7"
(todos os três instalando a versão 1.1
mais recente disponível). Versões de pré-lançamento podem ser especificadas e um intervalo permanecerá dentro da tag fornecida, como beta
ou rc
. Se nenhuma versão for fornecida, o padrão será a latest
.terraform_wrapper
- (opcional) Se deve instalar um wrapper para agrupar chamadas subsequentes do binário terraform
e expor seu STDOUT, STDERR e código de saída como saídas denominadas stdout
, stderr
e exitcode
respectivamente. O padrão é true
. Esta ação não configura nenhuma saída diretamente. No entanto, quando você configura a entrada terraform_wrapper
como true
, as seguintes saídas estão disponíveis para etapas subsequentes que chamam o binário terraform
:
stdout
- O fluxo STDOUT da chamada para o binário terraform
.stderr
- O fluxo STDERR da chamada para o binário terraform
.exitcode
- O código de saída da chamada para o binário terraform
. Licença Pública Mozilla v2.0
Código de Conduta
Ao usar o software neste repositório (o "Software"), você reconhece que: (1) o Software ainda está em desenvolvimento, pode mudar e não foi lançado como um produto comercial pela HashiCorp e atualmente não é suportado de forma alguma pela HashiCorp; (2) o Software é fornecido "no estado em que se encontra" e pode incluir bugs, erros ou outros problemas; (3) o Software NÃO SE DESTINA AO USO NA PRODUÇÃO, o uso do Software pode resultar em resultados inesperados, perda de dados ou outros resultados inesperados, e a HashiCorp se isenta de toda e qualquer responsabilidade resultante do uso do Software; e (4) a HashiCorp reserva-se todos os direitos para tomar todas as decisões sobre os recursos, funcionalidades e lançamento comercial (ou não lançamento) do Software, a qualquer momento e sem qualquer obrigação ou responsabilidade de qualquer espécie.
Todos os arquivos de código-fonte (excluindo arquivos gerados automaticamente como package.json
, prose e arquivos excluídos em .copywrite.hcl) devem ter um cabeçalho de licença na parte superior.
Isso pode ser gerado automaticamente instalando a ferramenta copywrite
HashiCorp e executando copywrite headers
na raiz do repositório.