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。放在这边让大家参考
考量
GitHub 网址:https://github.com/ Kamigo 说明文件:https:/...
以往 Gradle 只能使用 Groovy 语言撰写 Script,因为我对 Groovy 不熟,所...
除了刷题之外的事 「程序设计」的练习是一种从「写得出」程序到「写得好」持续迭代的优化过程,在 Le...
接续昨天,今天要讲的是ExpandableListView的主体拉,首先创一个java档,我命名为M...
本系列文章经过重新编排和扩充,已出书为ECMAScript关键30天。原始文章因当时准备时程紧迫,...