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
頭來自動產生。