Code 要 Review,Infrastrcture 豈不 Review?吾未見其明也
CI/CD 系列
課程內容與代碼會放在 Github 上: https://github.com/chechiachang/terraform-30-days
賽後文章會整理放到個人的部落格上 http://chechia.net/
軟體開發中,我們要求嚴謹的 Code workflow,有 Review 還有 release 流程
但 infra 卻沒有這些步驟:只是上去 console 點一點,把 infra 開起來,把很穩的 code,透過很穩的 CI/CD 放到沒有 review 流程的 infrastructure 上運行,然後祈禱他會很穩。結果就是
導入 terraform 後,團隊成員都可以各自撰寫 terraform 來描述 infrastructure,然後各自 plan 各自 apply,這樣個工作流程在小規模的 infrastructure 中是可以運作的。然而隨著團隊規模增加,infra 越來越複雜,這樣協作性低的工作流程,便會面離許多挑戰。
Terraform 官方文件也針對團隊導入的階段做說明,也描述實務上 infra 管理的困難,這邊只簡述摘要 infrastructure 管理的兩大困難:
這些問題是所有 IaC 工具都試圖解決與優化的部分。Infrastructure as Code 不只是將 web console 上的手動點擊操作,替換成程式碼操作而已,使用 IaC 來管理 infrastructure,除了更改使用方式,還有許多延伸的優勢,例如搭配使用程式碼的管理工具,進一步提升 IaC 程式碼的整體效率,達成 infrastructure 管理的元件化,標準化與自動化。
這邊要先說明,不是自動化就是好
底下我們會介紹 IaC 高效開發的範例,導入 gitflowd 開發流程,來管理 IaC,使用到的工具有:
回顧一下 Github 具體的開發流程
本地開發
在 commit 之前,還有一些事情可以透過 pre-commit hook 處理,例如:
上面這兩件事,terraform cli 都已內建 (都內建了,不做真的說不過去)
使用 ㄠpre-commit 工具,每個開發人原本機都需要 安裝 pre-commit,然後依據 .pre-commit-config.yaml 的設定,自動安裝 pre-commit 中指定的 script
$ sudo port install pre-commit
# brew install pre-commit
$ pre-commit --version
pre-commit 2.13.0
然後使用 gruntwork 準備的 pre-commit script,進行以下幾個 pre-commit script
repos:
- repo: https://github.com/gruntwork-io/pre-commit
rev: v0.1.12 # Get the latest from: https://github.com/gruntwork-io/pre-commit/releases
hooks:
- id: terraform-fmt
- id: terraform-validate
- id: tflint
- id: shellcheck
- id: gofmt
- id: golint
執行 pre-commmit install 來安裝 script 到本地
$ pre-commit install
pre-commit installed at .git/hooks/pre-commit
手動驅動執行 pre-commit run,來檢查新增的 git changes
或是執行 pre-commit run --all-files,來檢查所有檔案
git add .
pre-commit run
pre-commit run terraform-fmt
pre-commit run --all-files
Terraform fmt............................................................Passed
Terraform validate.......................................................Passed
tflint...................................................................Passed
Shellcheck Bash Linter...................................................Passed
gofmt....................................................................Passed
golint...................................................................Passed
設定完成後,以後每次 commit 前就會自動執行,不用擔心忘記 fmt 就 commit 歪七扭八的 code
pre-commit 還可以額外增加許多功能,這些功能我們在之後會介紹,例如
在本地執行過基本 fmt,validate,lint 與 local test 後,我們把相對穩定的 branch 推到 Github 上。這已確定遠端的 code 有一定品質。
CI 可以接收 Branch Push event
CI 可以接收 Pull Request event,只要有 Pull Request 產生:
Pull Request 除了自動化測試以外,當然還有人工 Review
Review 是 Github flow 的核心
所有 master 的 .tf code 都
都是穩定的程式碼,可以自動 apply 到 stag 環境,stag 上有相對穩定的 infrastructure 搭載穩定的 app code,這時讓 QA team 進駐做更詳細的測試,可以發現更細部的錯誤
依照產品時程準備 release candidate
確定 release 版本,打上 release tag,例如:v1.0.1
Github Action 是 Github 支援的 CI 工具,十分方便,而且是免費使用。我們這邊直接使用 Github Action 來做,目的在教學單純化,以及可以節省成本。drlook/terraform-github-action 有非常多開源範例,這邊實際套用
tree .github
.github
└── workflows
├── lint.yaml
├── fmt.yaml
└── plan.yaml
workflow 有
https://thomasthornton.cloud/2021/03/19/deploy-terraform-using-github-actions-into-azure/
Terraform 官方提供的 Github Action 整合說明,需要依賴 Terraform Cloud。放在這邊讓大家參考
考量