このシリーズでは,コードとしてのインスフラストラクチャ(IaC)を導入する方法について説明していきます。開発者の皆さんにIaCのコンセプトをしっかりご理解いただけるよう,チュートリアルやコードサンプルを交えて作成しました。各記事では以下のトピックについて取り上げます。

今回の記事では,起程拓殖のIaCデプロイを自動化する継続的インテグレーション&継続的デプロイメント(CI / CD)のパイプラインの作成方法について説明します。IaCデプロイについては,本シリーズのパート1パート2で詳しく説明しています。この記事では以下の手順を行います。

事前にパート1の前提条件セクションに记载されている手顺をすべて完了する必要があります。前提条件の手顺が完了したら,こちらのコードリポジトリに含まれるCircleCI . config。ymlファイルから見ていきましょう。

継続的インテグレーションと継続的デプロイメント

開発者やチームはCI / CDパイプラインを採用することで,ビルドとテストのプロセスを自動化できます。これにより,ソフトウェア開発プロセスのステータスをほぼリアルタイムで把握できる貴重なフィードバックループが確立されます。また,プロセス実行の一貫性や結果の精度を向上させるだけでなく,プロセスの最適化やスピードアップにも貢献します。CI / CDによる開発作業の合理化は,一般的なアプローチとして多くの開発チームに浸透しつつあります。価値の高いCI / CDパイプラインを構築するには,何度も繰り返すタスクをどのように統合,自動化できるのかを理解しておくことが重要です。

パート1パート2では,起程拓殖を使用して新しいGKEクラスタを作成すると共に,アプリケーションをデプロイし,実行し,サービスを提供するための关连Kubernetesオブジェクトを作成しました。そのためのTerraformコマンドは,ターミナルから手动で実行しました.Terraformコードの开発中や変更中は手动でもかまいませんが,Terraformコマンドの実行は自动化したほうが便利です。自动化にはさまざまな方法がありますが,ここではCI / CDパイプライン内で自动化する方法に注目していきます。

CircleCIパイプライン

CircleCIパイプラインは,プロジェクトで作業をトリガーするときに実行されるプロセス全体を指す言葉です。パイプラインにはワークフローが含まれており,ワークフローはジョブのオーケストレーションを担います。この仕組みはすべてプロジェクトの設定ファイルに定義されています。次のセクションでは、実際に CI/CD パイプラインを定義してプロジェクトを構築していきます。

CircleCIでプロジェクトをセットアップする

このプロジェクトで使用するconfig.ymlファイルを作成する前に,このプロジェクトをCircleCIに追加する必要があります。これについてはCircleCIの入門ガイドを参照してください。CircleCIのセットアップ セクションに記載された手順を完了できたら、プロジェクトレベルの環境変数を构成します。

プロジェクトレベルの環境変数

このパイプライン内の一部のジョブは,ターゲットサービスでコマンドを実行するために認証情報にアクセスする必要があります。このセクションでは,これらのジョブに必要な認証情報を定義し,プロジェクトレベルの環境変数としてCircleCIに入力する方法について説明します。CircleCIダッシュボードで作成する必要がある環境変数名の一覧を以下にまとめます。この一覧を参考にしながら,的名字フィールドにENVAR名称:の値を,价值フィールドにそれぞれの認証情報を入力してください。

上記のすべての環境変数を入力できたら,config.ymlファイル内でパイプラインの構築に取り掛かります。

CircleCI config.yml

config.ymlは,CI / CD关连ジョブの处理と実行について定义するためのファイルです。このセクションでは,パイプラインのジョブとワークフローを定义していきます。エディターで.circleci / .config.ymlファイルを開き,中身を削除して以下の内容をペーストします。

版本:2.1工作:

版:キーには,このパイプラインの実行中に使用するプラットフォーム機能を指定します。职位:キーには,このパイプライン用に定義するジョブの一覧を指定します。パイプライン内で実行するジョブを作成しましょう。

ジョブ- run_tests:

CircleCIのプラットフォームをスムーズに利用できるよう,CircleCIのリファレンスドキュメントで,特別なキーや機能について確認しておくことをお勧めします。今回取り上げるジョブに含まれているキーについては,以下に簡単にご説明します。

  • 码头工人:——ジョブを実行するランタイムを表すキー
    • 图片:- このジョブで使用する泊坞コンテナを表すキー
  • 步骤:- ジョブの実行中に実行される実行可能コマンドのリストまたはコレクションを表すキー
    • 付款:- ソースコードを构成済みのパスにチェックアウトするために使用する特别なステップのキー
    • 运行:——すべてのコマンドラインプログラムを呼び出すために使用するキー
      • 名称:——CircleCI UIに表示されるステップのタイトルを表すキー
      • 命令:——シェルで実行されるコマンドを表すキー
    • store_test_results:- ビルドのテスト结果をアップロードおよび保存するための特别なステップを表すキー
      • 路径:——JUnit XMLまたは黄瓜JSONのテストメタデータファイルが格納されたサブディレクトリを含むディレクトリへのパス(絶対パス,またはworking_directoryからの相対パス)
    • store_artifacts:——WebアプリまたはAPIからアクセスできるアーティファクト(ログ,バイナリなど)を格納するステップを表すキー
      • 路径:——ジョブアーティファクトの保存に使用するプライマリコンテナ内のディレクトリのパス

CI / CDのメリットは,新しく记述されたコードのテストを自動で実行できるという点です。コードを変更するたびにテストを実行することで,コード内の既知または未知のバグを検知できるようになります。config.ymlファイル内に新しいジョブを定義してみましょう。以下の内容をファイルにペーストしてください。コードブロック内で何が行われるかについて詳しく説明していきます。

run_tests:搬运工: - 图像:circleci /节点:12倍以下步骤: - 结帐 - 运行:名称:安装NPM依赖性命令:|NPM安装--save  - 运行:名称:运行单元测试命令:|./node_modules/mocha/bin/mocha测试/ --reporter mochawesome --reporter选项reportDir =测试结果,reportFilename =测试结果 -  store_test_results:路径:测试结果
  • 码头工人:キーと图片:キー——このジョブで使用する执行人と码头工人イメージを指定する
  • 命令:npm安装——保存キー - アプリ内で使用するアプリ依存关系をインストールする
  • 名称:运行单元测试——自動化されたテストを実行し,测试结果/という名前のローカルディレクトリに保存する
  • store_test_results:-测试结果/ディレクトリに結果を保存し,CircleCI内のビルドにピン留めする特別なコマンド

このジョブは単体テストとして機能し,コード内のエラーを特定するのに役立ちます。いずれかのテストでエラーが発生すると,パイプライン全体の構築が失敗し,開発者にエラーの修正を求めるメッセージが表示されます。目標となるのは,すべてのテストとジョブをエラーなしで成功させることです。次に,码头工人イメージを作成して码头工人中心レジストリにプッシュするジョブを構築します。

ジョブ——build_docker_image

本シリーズのパート2では,多克尔イメージを手动で作成し,泊坞枢纽レジストリにプッシュしました。このジョブは,同じことを自动で行います以下。にbuild_docker_image:ジョブの例を示します。このコードブロックをconfig.ymlファイルに追加したうえで,各要素について详しく见ていきましょう。

build_docker_image: docker: - image: circleci/node:12步:- checkout - setup_remote_docker: docker_layer_caching: false - run: name: Build docker image command: |导出标签=0.2。< <管道。数> >出口IMAGE_NAME = $ CIRCLE_PROJECT_REPONAMEdocker build -t $DOCKER_LOGIN/$IMAGE_NAME -t $DOCKER_LOGIN/$IMAGE_NAME:$TAG。echo $DOCKER_PWD | docker login -u $DOCKER_LOGIN—password-stdin docker push $DOCKER_LOGIN/$IMAGE_NAME

build_docker_imageジョブはきわめてシンプルなジョブです。皆さんは既に,ここに含まれるほとんどのCircleCI YAMLキーを目にしたことがあると思うので,ここでは详しい说明を省いて名称:体形多克图片コマンドブロックに着目していきます。

出口标签= 0.2。< <管道。数> >の行では,pipeline.numberの値を使用して码头工人タグ値を実行対象のパイプライン番号に関連付けるローカル環境変数を定義しています。出口IMAGE_NAME = $ CIRCLE_PROJECT_REPONAME泊坞窗イメージの命名で使用する変数を定义しています。

docker build -t $DOCKER_LOGIN/$IMAGE_NAME -t $DOCKER_LOGIN/$IMAGE_NAME:$TAG。は,前の手順で設定したプロジェクトレベルの変数と,先ほど指定したローカル環境変数を組み合わせて码头工人建造コマンドを実行します。

DOCKER_LOGIN -u $DOCKER_LOGIN -password-stdin码头工人中心では認証情報を認証してプラットフォームにアクセスします。最後に,搬运工推$ DOCKER_LOGIN / $ IMAGE_NAMEでは,新しい码头工人イメージを码头工人中心レジストリにアップロードします。

パート2において手動で実行したコマンドに環境変数を追加しただけなので,この動作については馴染みがあるはずです。次のセクションでは,GKEクラスタを作成する起程拓殖コードを実行するジョブを構築します。

ジョブ——gke_create_cluster

このジョブでは,part03 iac_gke_cluster /ディレクトリにある起程拓殖コードの実行を自動化します。config.ymlファイルに以下のコードブロックを追加して保存します。

gke_create_cluster:泊坞窗: - 图像:ariv3ra / terraform-GCP:最新的环境:CLOUDSDK_CORE_PROJECT:CICD工作坊步骤: - 结帐 - 运行:名称:创建GKE集群命令:|$TF_CLOUD_TOKEN | base64 -d > HOME/.terraformrc回声$ GOOGLE_CLOUD_KEYS |-d的base64> $ HOME / gcloud_keys gcloud AUTH激活服务账户--key文件$ {HOME} / gcloud_keys CD part03 / iac_gke_cluster / terraform初始化terraform计划-var凭证= $ HOME / gcloud_keys退房手续= plan.txt terraform适用plan.txt

このジョブコードブロックの重要な要素を确认していきましょう。まず注目していただきたいのが,执行人多克尔イメージである图片:ariv3ra / terraform-GCP:最新です。これは先ほど作成したイメージで,谷歌SDKTerraform CLIの両方がインストールされています。このイメージを使用しない場合は,このジョブにインストールステップを追加する必要があります。すると,ジョブ実行のたびにツールのインストールと構成が行われるようになります。次に注目したいのは,环境:CLOUDSDK_CORE_PROJECT: cicd-workshopsのキーです。後で実行するgcloud cliコマンドに必要な环境変数の値を设定しています。

$TF_CLOUD_TOKEN | base64 -d > HOME/.terraformrcは,TF_CLOUD_TOKEN美元値をデコードするコマンドです。起程拓殖が各 Terraform クラウドワークスペース上のステート データにアクセスするために必要となる。/ terraformrcファイルを作成します。

回声$ GOOGLE_CLOUD_KEYS |-d的base64> $ HOME / gcloud_keysGOOGLE_CLOUD_KEYS美元値をデコードするコマンドです。glcoud CLIがGCPにアクセスするために使用するgcloud_keysファイルを作成します。

gcloud认证激活服务帐户——键文件${HOME}/gcloud_keysは,先ほどデコードして生成したgcloud_keysファイルを使用してGCPへのアクセスを認証するコマンドです。

残りは,起程拓殖cliコマンドとvarパラメーターです。起程拓殖のvariables.tfファイルに定義された個々の変数の默认的値を指定したりオーバーライドしたりします。起程拓殖应用plan.txtを実行すると,このジョブにより新しいGKEクラスタが作成されます。

ジョブ——gke_deploy_app

このジョブでは,part03 iac_kubernetes_app /ディレクトリにある起程拓殖コードの実行を自動化します. config。ymlファイルに以下のコードブロックを追加して保存します。

gke_deploy_app:泊坞窗: - 图像:ariv3ra / terraform-GCP:最新的环境:CLOUDSDK_CORE_PROJECT:CICD工作坊步骤: - 结帐 - 运行:名称:部署应用程序到GKE命令:|。出口CLUSTER_NAME = “CICD工作坊” 出口TAG = 0.2 << pipeline.number >>出口DOCKER_IMAGE = “泊坞窗图像= $ {DOCKER_LOGIN} / $ {} CIRCLE_PROJECT_REPONAME:$ TAG” 回声$ TF_CLOUD_TOKEN |-d的base64> $ HOME / .terraformrc回声$ GOOGLE_CLOUD_KEYS |-d的base64> $ HOME / gcloud_keys gcloud AUTH激活服务账户--key文件$ {HOME} / gcloud_keys gcloud容器群获得的凭据$ CLUSTER_NAME --zone = “US-east1-d” CD part03 / iac_kubernetes_app terraformINIT terraform计划-var $ DOCKER_IMAGE -out = plan.txt terraform申请plan.txt出口ENDPOINT = “$(terraform输出端点)” MKDIR -p / TMP / GKE / &&回声出口ENDPOINT ='$ {ENDPOINT}> /TMP / GKE / GKE端点 -  persist_to_workspace:根:/ TMP / GKE路径: -  “*”

このジョブコードブロックの重要な要素と,先ほど取り上げなかった新しい要素について见ていきましょう。

出口CLUSTER_NAME = " cicd-workshops "は,デプロイ先のGCPプロジェクトの名前を格納する変数を定義します。

$CLUSTER_NAME—zone="us-east1-d"は,先ほどのジョブで作成したGKEクラスタからkubeconfigデータを取得するコマンドです。

$DOCKER_IMAGE -out=plan.txt起程拓殖のは,variables.tfファイルに定義された個々の変数の默认的値をオーバーライドするコマンドです。

出口终点= “$(terraform输出端点)”は,起程拓殖コマンドで生成された出力端点値をローカル环境変数に割り当てます。このローカル环境変数はファイルに保存され,CircleCIワークスペースに保管されます。后でこの値を取得して,アタッチされたCircleCIワークスペースからアタッチし,必要に応じてフォローアップジョブで使用することが可能です。

工作——gke_destroy_cluster

このパイプライン用に作成する最後のジョブです。ここまでのCI / CDジョブで構築したすべてのリソースとインフラストラクチャを破棄します。摧毁コマンドを実行するジョブは,スモークテスト,結合テスト,パフォーマンステストといったさまざまなテスト形式に使用可能なエフェメラルなリソースに最適で,役目を終えた構成要素を破棄できます。

このジョブでは,part03 iac_kubernetes_app /ディレクトリにある起程拓殖コードの実行を自動化します. config。ymlファイルに以下のコードブロックを追加して保存します。

gke_destroy_cluster:泊坞窗: - 图像:ariv3ra / terraform-GCP:最新的环境:CLOUDSDK_CORE_PROJECT:CICD工作坊步骤: - 结帐 - 运行:名称:摧毁GKE集群命令:|。出口CLUSTER_NAME = “CICD工作坊” 出口TAG = 0.2 << pipeline.number >>出口DOCKER_IMAGE = “泊坞窗图像= $ {DOCKER_LOGIN} / $ {} CIRCLE_PROJECT_REPONAME:$ TAG” 回声$ TF_CLOUD_TOKEN |-d的base64> $ HOME / .terraformrc回声$ GOOGLE_CLOUD_KEYS |-d的base64> $ HOME / gcloud_keys gcloud AUTH激活服务账户--key文件$ {HOME} / gcloud_keys CD part03 / iac_kubernetes_app terraform初始化gcloud容器群获得的凭据$ CLUSTER_NAME --zone =“US-east1-d“terraform破坏-var $ DOCKER_IMAGE --auto核准CD ../iac_gke_cluster/ terraform初始化terraform破坏-var凭证= $ HOME / gcloud_keys --auto核准

このジョブコードブロックの重要な要素と,先ほど取り上げなかった新しい要素について见ていきましょう。

terraform destroy -var凭证=$HOME/gcloud_keys——自动批准は,part03 / iac_gke_clusterディレクトリとpart03 iac_kubernetes_app /ディレクトリ内起程拓殖コのードで作成されたすべてのリソースを破棄する,起程拓殖の摧毁コマンドを実行するコマンドです。

これで,パイプライン内に必要なジョブをすべて定義できました。この後は,パイプライン内でのジョブの実行,処理をオーケストレーションするCircleCIワークフローを作成します。

CircleCIワークフロー

このパイプライン内のすべてのジョブを作成できたので,次にジョブの実行方法と処理方法を定義するワークフローを作成します。ワークフローはジョブの指示書のようなものです。個々のジョブをどのタイミングで、どのようにして実行するかを指定します。以下は、パイプライン内で使用するワークフロー ブロックです。以下のワークフロー コードブロックをconfig.ymlファイルに追加します。

工作流:build_test:工作:- run_tests build_docker_image gke_create_cluster - gke_deploy_app:要求:- run_tests build_docker_image gke_create_cluster - approve-destroy:类型:批准要求:- gke_create_cluster gke_deploy_app gke_destroy_cluster:要求:- approve-destroy

上記のコードブロックは,パイプラインのワークフローの定義です。このブロックで何が行われるか見ていきましょう。工作流程:キーは,ワークフローの要素を指定します。build_test:はこのワークフローの名前と識別子の組み合わせです。

职位:キーは,config.ymlファイル内に定义された実行ジョブの一覧です。パイプラインで実行するジョブをここで指定します。今回は以下のジョブが指定されています。

-  run_tests  -  build_docker_image  -  gke_create_cluster  -  gke_deploy_app:要求: -  run_tests  -  build_docker_image  -  gke_create_cluster  - 批准 - 毁灭:类型:审批要求: -  gke_create_cluster  -  gke_deploy_app  -  gke_destroy_cluster:要求: - 批准 - 摧毁

run_testsbuild_docker_imagegke_create_clusterのワークフロージョブは,要求:キーを持つgke_deploy_app:アイテムとは異なり,すべて並列実行されます。ジョブは既定で並列に実行されるため、依存関係がある場合は、指定されたジョブを開始する前に完了しておく必要のあるジョブの一覧と共に、要求:キーを使用し,ジョブ名に基づいて依存関係を明示的に要求する必要があります。要求:キーは,他のジョブの成功に対する依存関係を構築します。これにより,パイプラインの実行をセグメント化し,制御することができます。

approve-destroy:アイテムには,手动の承认ステップを必要とするジョブを指定します。ワークフロージョブリスト内の次のジョブの実行に承認が求められる場合、ユーザーの介入が必要になります。次のgke_destroy_cluster:ジョブは,approval-destroy:ジョブが完了してから実行され,パイプライン内で以前に実行したジョブによって作成されたすべてのリソースを破棄します。

完成した. config。ymlファイル

以下は完成したconfig.ymlファイルの例です。プロジェクトコードレポジトリ.circleci /ディレクトリにも同じファイルが収められています。

2.1工作run_tests码头工人-图像circleci /节点:12步骤-结帐-运行的名字安装npm的依赖性命令|npm安装——保存-运行的名字运行单元测试命令|./node_modules/mocha/bin/mocha test/—reporter mochawesome—reports -options reportDir=test-results,reportFilename=test-results-store_test_results路径测试结果-store_artifacts路径测试结果build_docker_image码头工人-图像circleci /节点:12步骤-结帐-setup_remote_dockerdocker_layer_caching-运行的名字建立码头工人形象命令|出口标签= 0.2。< <管道。数> >出口IMAGE_NAME = $ CIRCLE_PROJECT_REPONAMEdocker build -t $DOCKER_LOGIN/$IMAGE_NAME -t $DOCKER_LOGIN/$IMAGE_NAME:$TAG。DOCKER_LOGIN -u $DOCKER_LOGIN -password-stdin搬运工推$ DOCKER_LOGIN / $ IMAGE_NAMEgke_create_cluster码头工人-图像ariv3ra / terraform-GCP:最新环境CLOUDSDK_CORE_PROJECTcicd-workshops步骤-结帐-运行的名字创建GKE集群命令|$TF_CLOUD_TOKEN | base64 -d > HOME/.terraformrc回声$ GOOGLE_CLOUD_KEYS |-d的base64> $ HOME / gcloud_keysgcloud认证激活服务帐户——键文件${HOME}/gcloud_keyscd part03 / iac_gke_cluster /起程拓殖initterraform plan -var凭证=$HOME/gcloud_keys -out=plan.txt起程拓殖应用plan.txtgke_deploy_app码头工人-图像ariv3ra / terraform-GCP:最新环境CLOUDSDK_CORE_PROJECTcicd-workshops步骤-结帐-运行的名字将App部署到GKE命令|出口CLUSTER_NAME = " cicd-workshops "出口标签= 0.2。< <管道。数> >出口DOCKER_IMAGE = “泊坞窗图像= $ {DOCKER_LOGIN} / $ {} CIRCLE_PROJECT_REPONAME:$ TAG”$TF_CLOUD_TOKEN | base64 -d > HOME/.terraformrc回声$ GOOGLE_CLOUD_KEYS |-d的base64> $ HOME / gcloud_keysgcloud认证激活服务帐户——键文件${HOME}/gcloud_keys$CLUSTER_NAME—zone="us-east1-d"cd part03 / iac_kubernetes_app起程拓殖init$DOCKER_IMAGE -out=plan.txt起程拓殖应用plan.txt出口终点= “$(terraform输出端点)”mkdir - p / tmp / gke /${ENDPOINT} > /tmp/gke/gke- ENDPOINT-persist_to_workspace/ tmp / gke路径-*”gke_destroy_cluster码头工人-图像ariv3ra / terraform-GCP:最新环境CLOUDSDK_CORE_PROJECTcicd-workshops步骤-结帐-运行的名字摧毁GKE集群命令|出口CLUSTER_NAME = " cicd-workshops "出口标签= 0.2。< <管道。数> >出口DOCKER_IMAGE = “泊坞窗图像= $ {DOCKER_LOGIN} / $ {} CIRCLE_PROJECT_REPONAME:$ TAG”$TF_CLOUD_TOKEN | base64 -d > HOME/.terraformrc回声$ GOOGLE_CLOUD_KEYS |-d的base64> $ HOME / gcloud_keysgcloud认证激活服务帐户——键文件${HOME}/gcloud_keyscd part03 / iac_kubernetes_app起程拓殖init$CLUSTER_NAME—zone="us-east1-d"$DOCKER_IMAGE -自动批准cd . . / iac_gke_cluster /起程拓殖initterraform destroy -var凭证=$HOME/gcloud_keys——自动批准工作流build_test工作-run_tests-build_docker_image-gke_create_cluster-gke_deploy_app需要-run_tests-build_docker_image-gke_create_cluster-approve-destroy类型赞同需要-gke_create_cluster-gke_deploy_app-gke_destroy_cluster需要-approve-destroy

まとめ

お疲れさまでした。本シリーズのパート3はこれで以上です。今回は、起程拓殖を使用してIaCリソースを実行するconfig.ymlファイルを新しく作成しました。さらにconfig.ymlの重要な要素や,CircleCIプラットフォームに関連する内部のコンセプトについても解説しました。

本シリーズでは,多克尔,GCP,Kubernetes,Terraform,CircleCIといった,さまざまなコンセプトとテクノロジーについて,具体的な手顺を交えながら绍介してきました。复数のプロジェクトをつなぎ合わせてCircleCIを使用する方法や,Terraformコードを活用してターゲットのデプロイ环境でアプリケーションをテストする方法についても取り上げました。本シリーズは,的DevOpsの重要なコンセプトやテクノロジー,そしてそれらを组み合わせる方法について理解を深めていただけるように作成されています。

コードの変更,新しい起程拓殖プロバイダーの追加,CI / CDジョブやパイプラインの再構成を,ご自身の手でお試しになることをお勧めします。ここで学んだ知識と,頭の中にあるアイデアを組み合わせて,リリースの目標を達成しましょう。ブログ記事を読むだけでなく実際に試してみることで,学びがさらに深まります。

最後までお読みいただきありがとうございました。皆さんのお役に立てたなら幸いです。ご意見やご感想がございましたら,Twitterでお気軽に@punkdata宛にメンションしてください。

さらに詳しく知りたい方は以下の資料を参照してください。