使用Bitbucket Pipelines通过Terraform在GCP上实现基础设施CI/CD

個の選択肢のみです。

Bitbucket中自带有一个名为Bitbucket Pipelines的管道工具,可用于自动化处理,如CI/CD等。
即使是免费计划,每月也可以使用高达500分钟的构建执行时间。

本文介绍了如何使用Bitbucket Pipelines来执行Terraform,并进行Google Cloud Platform的配置管理。
还介绍了通过GitOps进行基础设施CI/CD的工作流程。

更新记录

    • 2020-05-03 Bitbucketのリポジトリ変数設定を変更し、bitbucket-pipelines.ymlを簡素化

 

    2020-05-02 初稿投稿

动作确认环境

    • terraform v0.12.24

terraform-provider-google v3.19.0

準備物資

    • Bitbucketアカウント

 

    • Bitbucket上のリポジトリ … Terraformのコードとbitbucket-pipelines.ymlを入れる

 

    • GCPプロジェクト

Service Account

Bitbucke Pipelines内で実行するTerraformで利用する
Terraformで行う操作に必要なCloud IAMの権限をつける
今回の構成では、少なくともGCSへの読み書き権限が必要

GCSバケット … TerraformのBackendとして利用し、tfstateを保存する
必要なAPIを有効化する

例)GCEインスタンスの操作には、Compute Engine APIの有効化が必要

建议的开发环境

推荐在本地操作 terraform 命令进行验证时,做好以下工具的准备:

    • terraform

 

    Google Cloud SDK

安裝步驟

    1. 用于Terraform的Service Account会生成并以JSON格式保存Service Account Key。

 

    1. 1. 设置为Bitbucket的存储库变量。

「存储库设置 > 管道 > 存储库变量」
键名设置为GOOGLE_CREDENTIALS(※从5/3开始更改为GOOGLE_CREDENTIALS_DATA)
不需要对值进行Base64编码
※勾选“Secured”

在存储库的根目录下,准备以下样式的bitbucket-pipelines.yml文件。

bitbucket-pipelines.yml 的配置

bitbucket-pipelines.yml是Bitbucket Pipelines的构建配置文件。

以下是用Terraform进行基础设施CI/CD的样例配置。

image: hashicorp/terraform:0.12.24

# パイプライン設定で重複するステップの記述をまとめるため、YAMLアンカーを定義
definitions:
  steps:
    - step: &terraform-plan
        name: terraform plan
        script:
          - terraform init -input=false
          - terraform plan -input=false
    - step: &terraform-apply
        name: terraform apply
        script:
          - terraform init -input=false
          - terraform apply -input=false --auto-approve

# パイプライン設定
pipelines:
  # プルリクエストによって実行されるパイプライン
  pull-requests:
    '**': # 任意のブランチからのPRが対象
      - step: *terraform-plan

  # ブランチの更新によって実行されるパイプライン
  branches:
    master:
      - step: *terraform-plan
      - step:
          <<: *terraform-apply
          # terraform applyは手動で実行する
          trigger: manual

2020年5月3日 增設:已刪除將環境變數寫入文件的處理(詳見下文)。

也许不需要太多的解释,但是通过上述的流程设置可以实现以下目标:

    • プルリクエストによってトリガーされるパイプラインによって、 terraform plan を実行する

マージ元ブランチの更新によってもトリガーされる

masterブランチの更新によってトリガーされるパイプラインによって、 terraform plan 及び terraform apply を順番に実行する

terraform apply のステップには trigger: manual を指定しているので、パイプラインの画面から手動で「Run」ボタンを押して実行します

通过这样的流程,你可以使用Git对基础设施代码进行管理,使用拉取请求进行更改审查,并通过CI / CD应用。在后续的“演示”部分中,我们将介绍其实际运行方式和工作流程。

关于GCP的认证设置(5/3编辑)

使用已创建的服务帐户密钥进行以下两个验证:

    • BackendのGCSに対する認証

 

    terraform-provider-googleによる認証

在每个规范中,指定Service Account Key文件路径的环境变量略有不同,但共同使用GOOGLE_CREDENTIALS是可行的。

对于这个问题,我一直误以为只能指定路径名,直到我试了一下,发现也可以直接将JSON文件内容设置为值,跟提供者设置一样,并没有问题。因此,我改变了上面的仓库变量设置,并简化了bitbucket-pipelines.yml的管道设置。

请参阅:

    • https://www.terraform.io/docs/backends/types/gcs.html#configuration-variables

 

    https://www.terraform.io/docs/providers/google/guides/provider_reference.html#full-reference

如果要在任何分支更新时执行terraform plan,

比如,如果您通过更改以上的YAML文件中的 pipelines: 部分,可以在除了master分支之外的其他分支上运行terraform plan操作。

# :
#(ここまでは上のYAMLと同じ)

# パイプライン設定
pipelines:
  branches:
    '**':
      - step: *terraform-plan
    master:
      - step: *terraform-plan
      - step:
          <<: *terraform-apply
          trigger: manual

当主分支(master)更新时的行为与先前相同。

根据分支的使用风格,我认为这种方式也很方便。

参考文档

    • Pipelines を使用したビルド、テスト、およびデプロイ

 

    • bitbucket-pipelines.yml の設定 – アトラシアン製品ドキュメント

 

    YAML アンカー – アトラシアン製品ドキュメント

演示: 基于GitOps的基础设施持续集成/持续交付

我们将查看在使用上述示例(拉取请求驱动)的bitbucket-pipelines.yml配置的情况下,基础设施CI/CD工作流程会是什么样子。

0. 准备好了

除了之前提到的预备工作和设置步骤外,还进行以下操作:

    • Terraformでテスト用のService Accountを作成するため、GCPプロジェクトでCloud Resource Manager APIを有効化しています

 

    リポジトリの「CHAT NOTIFICATIONS」設定により、Slack通知を有効にしています

5/3补充:关于示威活动中管道设置的差异

情况没有变化,但为了谨慎起见,我会做个注记。

我已经在5/3更改了仓库变量,并简化了bitbucket-pipelines.yml。
在以下的演示中,有两点不同:

    • リポジトリ変数に設定したService Account Keyのキー名が GOOGLE_CREDENTIALS ではなく、 GOOGLE_CREDENTIALS_DATA となっている

 

    -bitbucket-pipelines.ymlのアンカー &terraform-plan, &terraform-apply それぞれで定義したscriptの先頭に以下の2行がある
         script:
+          - echo "${GOOGLE_CREDENTIALS_DATA}" > service-account-key.json
+          - export GOOGLE_APPLICATION_CREDENTIALS=service-account-key.json
           - terraform init -input=false
           :

创建主题分支并推送代码更改

    1. 创建一个名为 topic/add-test-sa 的分支。

 

    1. 在.tf文件中定义 google_service_account 资源。

因为这段代码存在错误,所以接下来的流水线将失败。

将分支推送到 Bitbucket。

% git checkout -b topic/add-test-sa
% $EDITOR main.tf
% git diff
diff --git a/main.tf b/main.tf
index b6bb61a..d5c0613 100644
--- a/main.tf
+++ b/main.tf
@@ -31,3 +31,7 @@ resource "google_project_iam_member" "sa_terraform" {
   role    = "roles/owner"
   member  = "serviceAccount:${google_service_account.terraform.email}"
 }
+
+resource "google_service_account" "test" {
+  account_id = "test"
+}
% git add .
% git commit -m "Add test service account"
% git push origin topic/add-test-sa

由于除了主分支外,没有在其他分支上设置触发器,因此在此处将不会执行流水线。

2. 创建一个拉取请求

在Bitbucket界面上创建拉取请求。

Screenshot from 2020-05-02 14-30-52.png

根据在 bitbucket-pipelines.yml 中设置的 pull-requests 触发器,将执行 terraform plan 的流水线。

3. 检查构建结果(失败)

在Slack上收到了构建结果的通知。

Screenshot from 2020-05-02 14-31-56.png

点击「Pipeline #37」的链接,查看构建日志。

Screenshot from 2020-05-02 14-32-41.png

我们发现了google_service_account.test.account_id验证错误的情况。

4. 修改代码并重新推送

修改google_service_account.test.account_id并重新推送分支。

% $EDITOR main.tf
% git diff
diff --git a/main.tf b/main.tf
index d5c0613..fd9a3ec 100644
--- a/main.tf
+++ b/main.tf
@@ -33,5 +33,5 @@ resource "google_project_iam_member" "sa_terraform" {
 }

 resource "google_service_account" "test" {
-  account_id = "test"
+  account_id = "test01"
 }
% git add .
% git commit -m "Fix test service account id"
% git push origin topic/add-test-sa

与之前一样,根据在 bitbucket-pipelines.yml 中设置的 pull-requests 触发器,将执行 terraform plan 的流水线。

5. 确认构建结果(成功)。

Slack收到了构建结果的通知。

Screenshot from 2020-05-02 14-34-57.png

「已修复」,看起来是成功的。
也要检查一下管道日志。

Screenshot from 2020-05-02 14-36-46_blur.png

我确认了terraform plan的输出结果与预期一致。

6. 检查和合并公关画面。

在Pull Request的“活动历史”选项卡中,您可以查看包括构建在内的历史记录。

Screenshot from 2020-05-02 14-35-30.png

没问题,我们合并吧。

Screenshot from 2020-05-02 14-38-22.png

在主分支上进行管道执行。

通过在 bitbucket-pipelines.yml 文件中配置的 branches.master 触发器,将执行 terraform plan + terraform apply 的流水线。

通过Slack通知可以得知在master分支上执行了流水线。

Screenshot from 2020-05-02 14-39-22.png

点击「Pipeline #41」的链接,跳转至管道画面。

Screenshot from 2020-05-02 14-39-52_blur.png

在本次管道设置中,您可以再次查看terraform plan的结果。

在 Terraform 应用步骤中设置了触发器:手动,因此需要人工手动确认和执行。
如果没有问题,点击“运行”按钮,执行 terraform apply。

Screenshot from 2020-05-02 14-40-40_blur.png

terraform apply 顺利成功了,没有任何问题。

总结和感想

我在Bitbucket Pipelines中运行Terraform,并介绍了在GCP环境下进行基础设施CI/CD的方法,以及通过GitOps的工作流程的想法。

这次,我完全不知道Bitbucket Pipelines是什么,但通过各种调查研究后,发现它是一个很实用的CI服务。
起初,我很难找到所需的信息,还担心它的功能不够丰富,但回想起来,我认为它已经具备了必要而充分的功能。而且,所需的信息大多都在官方文档中总结了。

在过去的一到两年中,GitHub已经免费提供了创建私有存储库的功能,同时还推出了名为GitHub Actions的流水线工具。因此,我认为现在使用Bitbucket的原因已经减少了,但是在Bitbucket上我也没有特别困扰的事情。

注释

请查看以下链接以获取有关定价的信息:https://bitbucket.org/product/ja/pricing

由于另一个管道被执行插入,所以编号从前面跳过。

广告
将在 10 秒后关闭
bannerAds