hashicorp/setup-terraform
操作是一个 JavaScript 操作,它通过以下方式在 GitHub Actions 工作流程中设置 Terraform CLI:
PATH
。terraform
二进制文件的后续调用,并将其 STDOUT、STDERR 和退出代码分别公开为名为stdout
、 stderr
和exitcode
输出。 (如果同一作业中的后续步骤不需要访问 Terraform 命令的结果,则可以选择跳过此操作。)使用该操作后,同一作业中的后续步骤可以使用 GitHub Actions run
语法运行任意 Terraform 命令。这使得大多数 Terraform 命令能够像在本地命令行上一样工作。
此操作可以在ubuntu-latest
、 windows-latest
和macos-latest
GitHub Actions 运行器上运行。在windows-latest
上运行时,shell 应设置为 Bash。在自托管 GitHub Actions 运行器上运行时,必须事先使用action.yml
中指定的版本安装 NodeJS。
默认配置会安装最新版本的 Terraform CLI 并安装包装器脚本以包装对terraform
二进制文件的后续调用:
steps :
- uses : hashicorp/setup-terraform@v3
可以安装特定版本的 Terraform CLI:
steps :
- uses : hashicorp/setup-terraform@v3
with :
terraform_version : " 1.1.7 "
可以配置 HCP Terraform (app.terraform.io) 的凭据:
steps :
- uses : hashicorp/setup-terraform@v3
with :
cli_config_credentials_token : ${{ secrets.TF_API_TOKEN }}
可以配置 Terraform Enterprise (TFE) 的凭据:
steps :
- uses : hashicorp/setup-terraform@v3
with :
cli_config_credentials_hostname : ' terraform.example.com '
cli_config_credentials_token : ${{ secrets.TF_API_TOKEN }}
可以通过将terraform_wrapper
变量设置为false
来跳过包装器脚本安装:
steps :
- uses : hashicorp/setup-terraform@v3
with :
terraform_wrapper : false
安装包装器脚本后,后续步骤可以访问输出:
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 }}
可以在后续步骤中使用输出来评论拉取请求:
注意: GitHub 评论中的字符数有限制 (65535)。
由于该限制,即使计划成功,您也可能会以工作流运行失败告终。
另一种方法是将您的计划附加到支持 markdown 的 $GITHUB_STEP_SUMMARY 环境变量中。
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
})
您还可以更新现有评论,而不是每次都创建新评论:
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
})
}
该操作支持以下输入:
cli_config_credentials_hostname
-(可选)放置在 Terraform CLI 配置文件的凭据块中的 HCP Terraform/Terraform Enterprise 实例的主机名。默认为app.terraform.io
。cli_config_credentials_token
-(可选)HCP Terraform/Terraform Enterprise 实例的 API 令牌,放置在 Terraform CLI 配置文件的凭证块中。terraform_version
-(可选)要安装的 Terraform CLI 版本。除了完整版本字符串之外,您还可以指定约束字符串(有关可用范围规范,请参阅 Semver 范围)。例如: "<1.2.0"
、 "~1.1.0"
、 "1.1.7"
(所有三个都安装最新的可用1.1
版本)。可以指定预发布版本,并且范围将保留在给定标签内,例如beta
或rc
。如果未给出版本,则默认为latest
。terraform_wrapper
- (可选)是否安装包装器来包装terraform
二进制文件的后续调用,并将其 STDOUT、STDERR 和退出代码分别公开为名为stdout
、 stderr
和exitcode
输出。默认为true
。 此操作不直接配置任何输出。但是,当您将terraform_wrapper
输入设置为true
时,以下输出可用于调用terraform
二进制文件的后续步骤:
stdout
- 调用terraform
二进制文件的 STDOUT 流。stderr
- 调用terraform
二进制文件的 STDERR 流。exitcode
- 调用terraform
二进制文件的退出代码。 Mozilla 公共许可证 v2.0
行为守则
通过使用此存储库中的软件(“软件”),您承认:(1) 该软件仍在开发中,可能会发生变化,并且 HashiCorp 尚未将其作为商业产品发布,并且当前不以任何方式提供支持由 HashiCorp 提供; (2) 本软件按“原样”提供,可能包含缺陷、错误或其他问题; (3) 本软件不适用于生产用途,使用本软件可能会导致意外结果、数据丢失或其他意外结果,HashiCorp 不承担因使用本软件而产生的任何及所有责任; (4) HashiCorp 保留随时就本软件的特性、功能和商业发布(或不发布)做出所有决定的权利,且不承担任何义务或责任。
所有源代码文件(不包括自动生成的文件,如package.json
、散文以及 .copywrite.hcl 中排除的文件)必须在顶部有一个许可证标头。
这可以通过安装 HashiCorp copywrite
工具并在存储库的根目录中运行copywrite headers
头来自动生成。