使用Terraform提供程序来配置和管理CircleCI的功能
你好。我是CircleCI客户成功团队的Chisato。
最近,我开始种了大约7种野菜。
每天早晨浇水,能感受到它们的成长,这成为了我每日的乐趣。
本次我们将介绍CircleCI的支持工程师Kelvin先生创建的Terraform提供程序(Terraform Provider for CircleCI)。
由于这个Terraform提供程序目前还不是CircleCI的官方提供,因此在使用时请注意。
准备物品
-
- CircleCIのアカウント と プロジェクト
- Terraform
Terraform 配置
Terraform是HashiCorp公司提供的一种基础设施即代码(IaC)工具,可以安全高效地进行基础设施的配置管理,包括构建、修改和版本控制。
请访问此页面并安装Terraform。
macOS的开源版本可以通过Homebrew进行安装。
~ % brew tap hashicorp/tap
~ % brew install hashicorp/tap/terraform
要确认是否正确安装,请使用 terraform version 命令。
~ % terraform version
Terraform v1.4.5
on darwin_amd64
地表建模供应商
使用Terraform的提供者,可以与所有服务的API进行协作。
例如,在Terraform的官方教程中,介绍了用于创建AWS EC2的提供者。
在Terraform的注册表中,可以搜索和使用各种提供者。
如果您使用我们今次介绍的供应商,可以轻松创建和管理CircleCI的以下资源。
通常情况下,以下资源是通过CircleCI的用户界面来创建的。
例如,环境变量创建后需要将值保存在某处,以便管理和删除时需要访问相应的页面,这会带来一些麻烦。
使用这个提供商,您可以在 Terraform 的 *.tf 文件中轻松执行以下资源的创建/配置、编辑和删除。
-
- Project Webhook (ウェブフック)
-
- Project Scheduled Pipeline(パイプラインのスケジュール実行)
-
- Project Environment Variables(環境変数)
-
- Project Checkout key(チェックアウトキー)
-
- Context(コンテキスト)
- Context Environment Variables(コンテキストの環境変数)
创建和管理 Webhook
由于Terraform 这个名字听起来很强大和酷炫,所以我以为它的提供程序设置会很复杂,但实际上非常简单。
在这里,我们将创建Webhook。
在目标项目的目录中创建一个名为 main.tf 的文件。
2. 访问提供商网页,点击“使用提供商”。点击用粉色框圈起来的代码部分以进行复制。或者,可以复制底部的代码并使用。
terraform {
required_providers {
circleci = {
source = "kelvintaywl/circleci"
version = "0.9.3"
}
}
}
provider "circleci" {
# Configuration options
}
将复制的代码粘贴并保存到 main.tf 中。
在提供商的网页上,点击 “Documentation”。然后,点击展开位于目标页面左侧的 “Resources” 下拉菜单。在 “Resources” 栏中,可以找到有关创建和管理功能的说明。
data "circleci_project" "my_project" {
slug = "github/acmeorg/foobar"
}
resource "circleci_webhook" "my_webhook" {
project_id = data.circleci_project.my_project.id
name = "my_webhook"
url = "https://example.com/hook"
signing_secret = "5uperSeCr3t!"
verify_tls = true
events = [
// accepts only "workflow-completed" and "job-completed"
"job-completed",
"workflow-completed"
]
}
output "webhooks" {
description = "my_webhook_id"
value = circleci_webhook.my_webhook.id
}
打开 main.tf 文件,并将先前复制的 ID 粘贴到 project_id = “项目ID” 部分。
terraform {
required_providers {
circleci = {
source = "example.com/kelvintaywl/circleci"
}
}
}
provider "circleci" {
// api_token = ""; or set via CIRCLE_TOKEN
// hostname = "https://circleci.com"; or set via CIRCLE_HOSTNAME
}
locals {
// 下記に CircleCI の project ID をペースト
project_id = "プロジェクトID"
}
resource "circleci_webhook" "my_webhook" {
project_id = local.project_id
name = "my_webhook"
url = "WebhookのためのURL"
signing_secret = "5uperSeCr3t!"
verify_tls = true
events = [
// accepts only "workflow-completed" and "job-completed"
"job-completed",
"workflow-completed"
]
}
output "webhooks" {
description = "my_webhook_id"
value = circleci_webhook.my_webhook.id
}
7. main.tf 文件中的 “circleci” 提供者部分已被注释掉。
可以使用环境变量(Environment Variables)或个人 API 令牌(Personal API Token)与 CircleCI 进行集成。
本次我们将个人 API 令牌保存在 .bash_profile 中,与 CircleCI 进行了集成。
个人 API 令牌可以在 CircleCI 仪表板左下角点击个人图标,转到用户设置页面的个人 API 令牌选项卡中创建。
export CIRCLE_TOKEN="パーソナルAPIトークン"
在 main.tf 文件中,将资源的 url = “Webhook的URL” 复制并粘贴刚才的URL。
如果执行terraform init命令后返回”成功初始化Terraform!”的消息,那么就继续进行下一步。
% terraform init
为了审查应该进行哪些更改,执行以下命令。
~ % terraform plan
10. 当内容的审查完成后,使用下列命令实际创建Webhook。当出现执行确认消息时,请输入“是”进行确认。
~ % terraform apply
~省略~
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
circleci_webhook.my_webhook: Creating...
circleci_webhook.my_webhook: Creation complete after 0s [id=]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Outputs:
webhooks = ""
Webhook被触发并成功执行,工作流顺利完成并记录在表中。
当您想要更改设置时,只需在编辑main.tf文件后,按照之前相同的步骤执行teffaform plan,然后执行terraform apply即可轻松进行更改。
而且,如果不再需要Webhook功能,可以通过执行以下命令进行删除。
~ % terraform destroy
创建和管理项目的环境变量
我使用这个页面上的代码创建了一个环境变量。
在下面的代码中,将”FOOBAR”和”FIZZBUZZ”分别替换为环境变量的名称和值。
使用project_slug来指定项目。它的格式是VCS组织/VCS组织名/项目名称。
terraform {
required_providers {
circleci = {
source = "kelvintaywl/circleci"
version = "0.9.3"
}
}
}
provider "circleci" {
// api_token = ""; or set via CIRCLE_TOKEN
// hostname = "https://circleci.com"; or set via CIRCLE_HOSTNAME
}
# using for_each to generate multiple env var resources
resource "circleci_env_var" "my_env_vars" {
for_each = {
"FOOBAR" = "0Cme2FmlXk"
"FIZZBUZZ" = "Vbt2efixZAkrmTYiirhd"
}
project_slug = "github/chisato-ygc/hello-world"
name = each.key
value = each.value
}
最后
通过这次项目,我对于Terraform的理解比以前更加深入了。
Kelvin先生非常详细地向我解释了Terraform的结构和这次项目。
非常感谢您。
而且,由于Provider的便利性,我对进一步学习更加技术性的部分充满了动力。
由于我在四月底写这篇文章,所以我只希望在黄金周期间不要让这份动力消失。
加油,未来的我。
感谢您阅读至最后一句。
参考链接:Terraform文档 – 提供程序:https://developer.hashicorp.com/terraform/language/providers
请将技术问题咨询转至支援中心。