La acción hashicorp/setup-terraform
es una acción de JavaScript que configura Terraform CLI en tu flujo de trabajo de GitHub Actions mediante:
PATH
.terraform
y exponer su STDOUT, STDERR y código de salida como salidas denominadas stdout
, stderr
y exitcode
respectivamente. (Esto se puede omitir opcionalmente si los pasos posteriores del mismo trabajo no necesitan acceder a los resultados de los comandos de Terraform). Después de haber usado la acción, los pasos posteriores en el mismo trabajo pueden ejecutar comandos arbitrarios de Terraform usando la sintaxis run
de GitHub Actions. Esto permite que la mayoría de los comandos de Terraform funcionen exactamente como lo hacen en su línea de comando local.
Esta acción se puede ejecutar en los ejecutores de acciones GitHub ubuntu-latest
, windows-latest
y macos-latest
. Cuando se ejecuta en windows-latest
el shell debe configurarse en Bash. Cuando se ejecuta en ejecutores de GitHub Actions autohospedados, NodeJS debe instalarse previamente con la versión especificada en action.yml
.
La configuración predeterminada instala la última versión de Terraform CLI e instala el script contenedor para encapsular llamadas posteriores al binario terraform
:
steps :
- uses : hashicorp/setup-terraform@v3
Se puede instalar una versión específica de Terraform CLI:
steps :
- uses : hashicorp/setup-terraform@v3
with :
terraform_version : " 1.1.7 "
Las credenciales para HCP Terraform (app.terraform.io) se pueden configurar:
steps :
- uses : hashicorp/setup-terraform@v3
with :
cli_config_credentials_token : ${{ secrets.TF_API_TOKEN }}
Las credenciales para Terraform Enterprise (TFE) se pueden configurar:
steps :
- uses : hashicorp/setup-terraform@v3
with :
cli_config_credentials_hostname : ' terraform.example.com '
cli_config_credentials_token : ${{ secrets.TF_API_TOKEN }}
La instalación del script contenedor se puede omitir configurando la variable terraform_wrapper
en false
:
steps :
- uses : hashicorp/setup-terraform@v3
with :
terraform_wrapper : false
Los pasos posteriores pueden acceder a los resultados cuando se instala el script contenedor:
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 }}
Los resultados se pueden utilizar en pasos posteriores para comentar la solicitud de extracción:
Aviso: hay un límite en la cantidad de caracteres dentro de un comentario de GitHub (65535).
Debido a esa limitación, es posible que termine con una ejecución fallida del flujo de trabajo incluso si el plan tuvo éxito.
Otro enfoque es agregar su plan a la variable de entorno $GITHUB_STEP_SUMMARY que admite rebajas.
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
})
En lugar de crear un comentario nuevo cada vez, también puedes actualizar uno 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
})
}
La acción admite los siguientes insumos:
cli_config_credentials_hostname
: (opcional) el nombre de host de una instancia de HCP Terraform/Terraform Enterprise para colocar dentro del bloque de credenciales del archivo de configuración de Terraform CLI. El valor predeterminado es app.terraform.io
.cli_config_credentials_token
: (opcional) el token de API para que una instancia de HCP Terraform/Terraform Enterprise se coloque dentro del bloque de credenciales del archivo de configuración de Terraform CLI.terraform_version
: (opcional) la versión de Terraform CLI que se instalará. En lugar de una cadena de versión completa, también puede especificar una cadena de restricción (consulte Rangos de Semver para conocer las especificaciones de rango disponibles). Algunos ejemplos son: "<1.2.0"
, "~1.1.0"
, "1.1.7"
(los tres instalan la última versión 1.1
disponible). Se pueden especificar versiones preliminares y un rango permanecerá dentro de la etiqueta dada, como beta
o rc
. Si no se proporciona ninguna versión, la predeterminada será la latest
.terraform_wrapper
: (opcional) si se debe instalar un contenedor para envolver llamadas posteriores del binario terraform
y exponer su STDOUT, STDERR y código de salida como salidas denominadas stdout
, stderr
y exitcode
respectivamente. El valor predeterminado es true
. Esta acción no configura ninguna salida directamente. Sin embargo, cuando configura la entrada terraform_wrapper
en true
, las siguientes salidas están disponibles para los pasos posteriores que llaman al binario terraform
:
stdout
: el flujo STDOUT de la llamada al binario terraform
.stderr
: el flujo STDERR de la llamada al binario terraform
.exitcode
: el código de salida de la llamada al binario terraform
. Licencia pública de Mozilla v2.0
Código de conducta
Al utilizar el software en este repositorio (el "Software"), usted reconoce que: (1) el Software aún está en desarrollo, puede cambiar y HashiCorp no lo ha lanzado como un producto comercial y actualmente no cuenta con soporte de ninguna manera. por HashiCorp; (2) el Software se proporciona "tal cual" y puede incluir fallos, errores u otros problemas; (3) el Software NO ESTÁ DISEÑADO PARA USO DE PRODUCCIÓN, el uso del Software puede resultar en resultados inesperados, pérdida de datos u otros resultados inesperados, y HashiCorp renuncia a toda responsabilidad resultante del uso del Software; y (4) HashiCorp se reserva todos los derechos de tomar todas las decisiones sobre las características, la funcionalidad y el lanzamiento comercial (o no lanzamiento) del Software, en cualquier momento y sin obligación o responsabilidad alguna.
Todos los archivos de código fuente (excluidos los archivos generados automáticamente como package.json
, prose y los archivos excluidos en .copywrite.hcl) deben tener un encabezado de licencia en la parte superior.
Esto se puede generar automáticamente instalando la herramienta copywrite
HashiCorp y ejecutando copywrite headers
en la raíz del repositorio.