GSP1077
概要
このラボでは、commit されたコードからコンテナ イメージを自動的にビルドし、そのイメージを Artifact Registry に格納し、Git リポジトリの Kubernetes マニフェストを更新し、更新したマニフェストを使用してアプリケーションを Google Kubernetes Engine にデプロイする CI / CD パイプラインを作成します。
このラボでは 2 つの Git リポジトリを作成します。
app リポジトリ: アプリケーション自体のソースコードが含まれます。
env リポジトリ: Kubernetes Deployment のマニフェストが含まれます。
app リポジトリ に変更を push すると、Cloud Build パイプラインはテストを実施し、コンテナ イメージを構築して、Artifact Registry に push します。イメージを push した後、Cloud Build は Deployment マニフェストを更新して env リポジトリ に push します。これにより、マニフェストを GKE クラスタに適用する別の Cloud Build パイプラインがトリガーされ、正常終了した場合は、マニフェストが env リポジトリ の別のブランチに格納されます。
ライフサイクルと用途が異なるため、app リポジトリと env リポジトリは別々に格納されます。app リポジトリ の主なユーザーは実際の人間であり、このリポジトリは特定のアプリケーション専用です。env リポジトリ の主なユーザーは自動化されたシステム(Cloud Build など)であり、このリポジトリは複数のアプリケーションで共有される場合があります。env リポジトリ にはいくつかのブランチがあり、それぞれが特定の環境にマッピングし(このラボでは本番環境のみを使用します)、特定のコンテナ イメージを参照しますが、app リポジトリ はこれとは異なります。
このラボを終了すると、次のことを簡単に行うことができるシステムが完成します。
Cloud Build の履歴を確認して、失敗したデプロイと成功したデプロイを区別する。
env リポジトリ の production ブランチを確認して、現在使用されているマニフェストにアクセスする。
対応する Cloud Build ビルドを再実行して、以前のバージョンにロールバックする。
目標
このラボでは、次のタスクについて学びます。
Kubernetes Engine クラスタを作成する
Cloud Source Repositories でリポジトリを作成する
Cloud Source Repositories から Cloud Build をトリガーする
Cloud Build でテストを自動化し、デプロイ可能なコンテナ イメージを公開する
Kubernetes Engine クラスタにデプロイされたリソースを Cloud Build で管理する
設定と要件
[ラボを開始] ボタンをクリックする前に
こちらの説明をお読みください。ラボには時間制限があり、一時停止することはできません。タイマーは、Google Cloud のリソースを利用できる時間を示しており、[ラボを開始 ] をクリックするとスタートします。
このハンズオンラボでは、シミュレーションやデモ環境ではなく実際のクラウド環境を使って、ラボのアクティビティを行います。そのため、ラボの受講中に Google Cloud にログインおよびアクセスするための、新しい一時的な認証情報が提供されます。
このラボを完了するためには、下記が必要です。
標準的なインターネット ブラウザ(Chrome を推奨)
注: このラボの実行には、シークレット モード(推奨)またはシークレット ブラウジング ウィンドウを使用してください。これにより、個人アカウントと受講者アカウント間の競合を防ぎ、個人アカウントに追加料金が発生しないようにすることができます。
ラボを完了するための時間(開始後は一時停止できません)
注: このラボでは、受講者アカウントのみを使用してください。別の Google Cloud アカウントを使用すると、そのアカウントに料金が発生する可能性があります。
ラボを開始して Google Cloud コンソールにログインする方法
[ラボを開始 ] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるダイアログでお支払い方法を選択してください。
左側の [ラボの詳細] ペインには、以下が表示されます。
[Google Cloud コンソールを開く] ボタン
残り時間
このラボで使用する必要がある一時的な認証情報
このラボを行うために必要なその他の情報(ある場合)
[Google Cloud コンソールを開く ] をクリックします(Chrome ブラウザを使用している場合は、右クリックして [シークレット ウィンドウで開く ] を選択します)。
ラボでリソースがスピンアップし、別のタブで [ログイン] ページが表示されます。
ヒント: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。
注: [アカウントの選択 ] ダイアログが表示されたら、[別のアカウントを使用 ] をクリックします。
必要に応じて、下のユーザー名 をコピーして、[ログイン ] ダイアログに貼り付けます。
{{{user_0.username | "Username"}}}
[ラボの詳細] ペインでもユーザー名を確認できます。
[次へ ] をクリックします。
以下のパスワード をコピーして、[ようこそ ] ダイアログに貼り付けます。
{{{user_0.password | "Password"}}}
[ラボの詳細] ペインでもパスワードを確認できます。
[次へ ] をクリックします。
重要: ラボで提供された認証情報を使用する必要があります。Google Cloud アカウントの認証情報は使用しないでください。
注: このラボでご自身の Google Cloud アカウントを使用すると、追加料金が発生する場合があります。
その後次のように進みます。
利用規約に同意してください。
一時的なアカウントなので、復元オプションや 2 要素認証プロセスは設定しないでください。
無料トライアルには登録しないでください。
その後、このタブで Google Cloud コンソールが開きます。
注: Google Cloud のプロダクトやサービスにアクセスするには、ナビゲーション メニュー をクリックするか、[検索 ] フィールドにサービス名またはプロダクト名を入力します。
Cloud Shell をアクティブにする
Cloud Shell は、開発ツールと一緒に読み込まれる仮想マシンです。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働します。Cloud Shell を使用すると、コマンドラインで Google Cloud リソースにアクセスできます。
Google Cloud コンソールの上部にある「Cloud Shell をアクティブにする 」アイコン をクリックします。
接続した時点で認証が完了しており、プロジェクトに各自の PROJECT_ID が設定されます。出力には、このセッションの PROJECT_ID を宣言する次の行が含まれています。
Your Cloud Platform project in this session is set to YOUR_PROJECT_ID
gcloud
は Google Cloud のコマンドライン ツールです。このツールは、Cloud Shell にプリインストールされており、タブ補完がサポートされています。
(省略可)次のコマンドを使用すると、有効なアカウント名を一覧表示できます。
gcloud auth list
[承認 ] をクリックします。
出力は次のようになります。
出力:
ACTIVE: *
ACCOUNT: student-01-xxxxxxxxxxxx@qwiklabs.net
To set the active account, run:
$ gcloud config set account `ACCOUNT`
(省略可)次のコマンドを使用すると、プロジェクト ID を一覧表示できます。
gcloud config list project
出力:
[core]
project = <project_ID>
出力例:
[core]
project = qwiklabs-gcp-44776a13dea667a6
注: Google Cloud における gcloud
ドキュメントの全文については、gcloud CLI の概要ガイド をご覧ください。
タスク 1. ラボを初期化する
Cloud Shell で、プロジェクト ID とプロジェクト番号を設定します。これらを変数 PROJECT_ID
と PROJECT_NUMBER
として保存します。
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export REGION={{{ project_0.default_region }}}
gcloud config set compute/region $REGION
次のタスクでは、Google Cloud プロジェクトを使用するための準備を行います。具体的には、必要な API を有効にし、Cloud Shell の Git 構成を初期化して、後ほど使用するサンプルコードをダウンロードします。
次のコマンドを実行して、GKE、Cloud Build、Cloud Source Repositories、Container Analysis の API を有効にします。
gcloud services enable container.googleapis.com \
cloudbuild.googleapis.com \
sourcerepo.googleapis.com \
containeranalysis.googleapis.com
my-repository という名前の Artifact Registry Docker リポジトリを リージョンに作成します。このリポジトリにコンテナ イメージを保存します。
gcloud artifacts repositories create my-repository \
--repository-format=docker \
--location=$REGION
このラボのサンプル アプリケーションをデプロイする GKE クラスタを作成します。
gcloud container clusters create hello-cloudbuild --num-nodes 1 --region $REGION
Git を Cloud Shell で使用したことがない場合は、名前とメールアドレスを使用して Git を構成します。Git はこれらを使用して、Cloud Shell で作成する commit の作成者を識別します(GitHub アカウントがない場合、現在ご利用の情報を入力してください。このラボではアカウントは必要ありません)。
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
[進行状況を確認 ] をクリックして、目標に沿って進んでいることを確認します。
サービスを有効にして Artifact Registry と GKE クラスタを作成する
タスク 2. Cloud Source Repositories で Git リポジトリを作成する
このタスクでは、2 つの Git リポジトリ(hello-cloudbuild-app と hello-cloudbuild-env )を作成し、いくつかのサンプルコードを使用して hello-cloudbuild-app を初期化します。
Cloud Shell で次のコマンドを実行して、2 つの Git リポジトリを作成します。
gcloud source repos create hello-cloudbuild-app
gcloud source repos create hello-cloudbuild-env
GitHub からサンプルコードのクローンを作成します。
cd ~
git clone https://github.com/GoogleCloudPlatform/gke-gitops-tutorial-cloudbuild hello-cloudbuild-app
Cloud Source Repositories をリモートとして構成します。
cd ~/hello-cloudbuild-app
export REGION={{{project_0.default_region | "REGION"}}}
sed -i "s/us-central1/$REGION/g" cloudbuild.yaml
sed -i "s/us-central1/$REGION/g" cloudbuild-delivery.yaml
sed -i "s/us-central1/$REGION/g" cloudbuild-trigger-cd.yaml
sed -i "s/us-central1/$REGION/g" kubernetes.yaml.tpl
PROJECT_ID=$(gcloud config get-value project)
git remote add google "https://source.developers.google.com/p/${PROJECT_ID}/r/hello-cloudbuild-app"
クローンを作成したコードには、単純な「Hello World」アプリケーションが含まれています。
from flask import Flask
app = Flask('hello-cloudbuild')
@app.route('/')
def hello():
return "Hello World!\n"
if __name__ == '__main__':
app.run(host = '0.0.0.0', port = 8080)
[進行状況を確認 ] をクリックして、目標に沿って進んでいることを確認します。
Git リポジトリを作成する
タスク 3. Cloud Build でコンテナ イメージを作成する
クローンを作成したコードには、すでに次の Dockerfile が含まれています。
FROM python:3.7-slim
RUN pip install flask
WORKDIR /app
COPY app.py /app/app.py
ENTRYPOINT ["python"]
CMD ["/app/app.py"]
この Dockerfile を使用して、Cloud Build でコンテナ イメージを作成し、Artifact Registry に保存できます。
Cloud Shell で次のコマンドを使用して、最新の commit に基づいて Cloud Build ビルドを作成します。
cd ~/hello-cloudbuild-app
COMMIT_ID="$(git rev-parse --short=7 HEAD)"
gcloud builds submit --tag="${REGION}-docker.pkg.dev/${PROJECT_ID}/my-repository/hello-cloudbuild:${COMMIT_ID}" .
このコマンドを実行すると、Cloud Build はコンテナ イメージの作成によって生成されたログをターミナルにストリーミングします。
ビルドが完了したら、Cloud コンソールで [Artifact Registry] > [リポジトリ] に移動して、新しいコンテナ イメージが Artifact Registry 内で実際に利用可能になっていることを確認します。my-repository をクリックします。
[進行状況を確認 ] をクリックして、目標に沿って進んでいることを確認します。
Cloud Build でコンテナ イメージを作成する
タスク 4. 継続的インテグレーション(CI)パイプラインを作成する
このタスクでは、小規模な単体テストを自動的に実施し、コンテナ イメージを構築して Artifact Registry に push するように Cloud Build を構成します。Cloud Source Repositories に新しい commit を push すると、このパイプラインが自動的にトリガーされます。すでにコードに含まれている cloudbuild.yaml ファイルがこのパイプラインの構成です。
Cloud コンソールで、[Cloud Build] > [トリガー] に移動します。
[トリガーを作成 ] をクリックします。
[名前] フィールドに「hello-cloudbuild
」と入力します。
[イベント ] で [ブランチに push する ] を選択します。
[ソース ] で、[リポジトリ ] として hello-cloudbuild-app を選択し、[ブランチ ] として .* (any branch)
を選択します。
[ビルド構成 ] で [Cloud Build 構成ファイル ] を選択します。
[Cloud Build 構成ファイルの場所 ] フィールドで、/ の後に「cloudbuild.yaml
」と入力します。
[作成 ] をクリックします。
トリガーが作成されたら Cloud Shell に戻り、アプリケーション コードを Cloud Source Repositories に push して、Cloud Build で CI パイプラインをトリガーします。
このトリガーを開始するには次のコマンドを実行します。
cd ~/hello-cloudbuild-app
git add .
git commit -m "Type Any Commit Message here"
git push google master
Cloud コンソールで、[Cloud Build] > [ダッシュボード] に移動します。
ビルドが実行中または最近終了したことを確認します。ビルドをクリックすると、その実行を追跡し、ログを確認できます。
[進行状況を確認 ] をクリックして、目標に沿って進んでいることを確認します。
継続的インテグレーション(CI)パイプラインを作成する
タスク 5. テスト環境と CD パイプラインを作成する
Cloud Build は継続的デリバリー パイプラインにも使用されます。commit が hello-cloudbuild-env リポジトリの candidate ブランチに push されるたびにパイプラインが実行されます。パイプラインは、新しいバージョンのマニフェストを Kubernetes クラスタに適用し、正常に終了した場合はマニフェストを production ブランチにコピーします。このプロセスには次のような特徴があります。
candidate ブランチはデプロイの試行の履歴です。
production ブランチは、成功したデプロイの履歴です。
Cloud Build には、成功したデプロイと失敗したデプロイのビューがあります。
Cloud Build では、対応するビルドを再実行して、以前のデプロイにロールバックできます。また、ロールバックによって production ブランチが更新され、デプロイの履歴が正確に反映されます。
次に、継続的インテグレーション パイプラインを変更して hello-cloudbuild-env リポジトリの candidate ブランチを更新し、継続的デリバリー パイプラインをトリガーします。
Cloud Build に GKE へのアクセス権を付与する
Kubernetes クラスタにアプリケーションをデプロイするには、Cloud Build に Kubernetes Engine デベロッパーの Identity and Access Management ロールが必要です。
Cloud Shell で、次のコマンドを実行します。
PROJECT_NUMBER="$(gcloud projects describe ${PROJECT_ID} --format='get(projectNumber)')"
gcloud projects add-iam-policy-binding ${PROJECT_NUMBER} \
--member=serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
--role=roles/container.developer
hello-cloudbuild-env リポジトリを 2 つのブランチ(production と candidate)と、デプロイ プロセスを記述した Cloud Build 構成ファイルで初期化する必要があります。
まず、hello-cloudbuild-env リポジトリのクローンを作成し、production ブランチを作成します。このブランチは、まだ空です。
Cloud Shell で、次のコマンドを実行します。
cd ~
gcloud source repos clone hello-cloudbuild-env
cd ~/hello-cloudbuild-env
git checkout -b production
hello-cloudbuild-app リポジトリにある cloudbuild-delivery.yaml ファイルをコピーして、変更を commit します。
cd ~/hello-cloudbuild-env
cp ~/hello-cloudbuild-app/cloudbuild-delivery.yaml ~/hello-cloudbuild-env/cloudbuild.yaml
git add .
git commit -m "Create cloudbuild.yaml for deployment"
cloudbuild-delivery.yaml
ファイルには、Cloud Build で実行されるデプロイ プロセスが記述されています。次の 2 つの手順があります。
Cloud Build が GKE クラスタにマニフェストを適用します。
正常に終了すると、Cloud Build はマニフェストを production ブランチにコピーします。
candidate ブランチを作成し、両方のブランチを Cloud Source Repositories で使用できるように push します。
git checkout -b candidate
git push origin production
git push origin candidate
hello-cloudbuild-env リポジトリに対する Source Repository 書き込みの IAM ロールを Cloud Build サービス アカウントに付与します。
PROJECT_NUMBER="$(gcloud projects describe ${PROJECT_ID} \
--format='get(projectNumber)')"
cat >/tmp/hello-cloudbuild-env-policy.yaml <<EOF
bindings:
- members:
- serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com
role: roles/source.writer
EOF
gcloud source repos set-iam-policy \
hello-cloudbuild-env /tmp/hello-cloudbuild-env-policy.yaml
継続的デリバリー パイプラインのトリガーを作成する
Cloud コンソールで、[Cloud Build] > [トリガー] に移動します。
[トリガーを作成 ] をクリックします。
[名前] フィールドに「hello-cloudbuild-deploy
」と入力します。
[イベント ] で [ブランチに push する ] を選択します。
[ソース ] で、[リポジトリ ] として hello-cloudbuild-env を選択し、[ブランチ ] として ^candidate$
を選択します。
[ビルド構成 ] で [Cloud Build 構成ファイル ] を選択します。
[Cloud Build 構成ファイルの場所 ] フィールドで、/ の後に「cloudbuild.yaml
」と入力します。
[作成 ] をクリックします。
継続的デリバリー パイプラインをトリガーするように継続的インテグレーション パイプラインを変更する
次に、Kubernetes マニフェストの新しいバージョンを生成して hello-cloudbuild-env リポジトリに push し、継続的デリバリー パイプラインをトリガーする手順を継続的インテグレーション パイプラインに追加します。
app リポジトリ 用の cloudbuild.yaml ファイルの拡張版をコピーします。
cd ~/hello-cloudbuild-app
cp cloudbuild-trigger-cd.yaml cloudbuild.yaml
cloudbuild-trigger-cd.yaml は、cloudbuild.yaml ファイルの拡張版です。新しい Kubernetes マニフェストを生成し、継続的デリバリー パイプラインをトリガーする手順が追加されています。
このパイプラインでは、単純な sed
を使用して、マニフェスト テンプレートをレンダリングしています。現実には、kustomize や skaffold などの専用ツールを使用した方がメリットを得られます。これにより、マニフェスト テンプレートのレンダリングをさらに制御できます。
変更を commit して Cloud Source Repositories に push します。
cd ~/hello-cloudbuild-app
git add cloudbuild.yaml
git commit -m "Trigger CD pipeline"
git push google master
これにより、Cloud Build の継続的インテグレーション パイプラインがトリガーされます。
[進行状況を確認 ] をクリックして、目標に沿って進んでいることを確認します。
テスト環境と CD パイプラインを作成する
タスク 6. Cloud Build パイプラインを確認する
Cloud コンソールで、[Cloud Build] > [ダッシュボード] に移動します。
トリガー hello-cloudbuild-app をクリックして実行し、ログを確認します。このパイプラインの最後の手順では、新しいマニフェストが hello-cloudbuild-env リポジトリに push され、これにより継続的デリバリー パイプラインがトリガーされます。
[ダッシュボード ] のメイン画面に戻ります。
hello-cloudbuild-env リポジトリでビルドが実行中または最近終了したことを確認します。ビルドをクリックすると、その実行を追跡し、ログを確認できます。
タスク 7. パイプライン全体をテストする
これで、CI / CD パイプライン全体が構成されました。エンドツーエンドでテストします。
Cloud コンソールで、[Kubernetes Engine] > [Gateways、Services、Ingress] に移動します。
リストに hello-cloudbuild という名前の単一の Service が含まれています。これは実行された継続的デリバリー ビルドによって作成されたものです。
hello-cloudbuild Service のエンドポイントをクリックします。「Hello World!」と表示されます。エンドポイントがない場合や、ロードバランサのエラーが発生した場合は、ロードバランサが完全に初期化されるまで数分待つ必要があります。必要に応じて [更新 ] をクリックしてページを更新します。
Cloud Shell で、アプリケーションと単体テストの両方で「Hello World」を「Hello Cloud Build」に置き換えます。
cd ~/hello-cloudbuild-app
sed -i 's/Hello World/Hello Cloud Build/g' app.py
sed -i 's/Hello World/Hello Cloud Build/g' test_app.py
変更を commit して Cloud Source Repositories に push します。
git add app.py test_app.py
git commit -m "Hello Cloud Build"
git push google master
これにより、CI / CD パイプライン全体がトリガーされます。
数分後、ブラウザでアプリケーションを再読み込みします。「Hello Cloud Build!」と表示されます。
タスク 8. ロールバックをテストする
このタスクでは、「Hello World!」と表示するアプリケーションのバージョンにロールバックします。
Cloud コンソールで、[Cloud Build] > [ダッシュボード] に移動します。
hello-cloudbuild-env リポジトリの [ビルド履歴 ] の下にある [すべて表示 ] をクリックします。
利用可能な 2 番目に新しいビルドをクリックします。
[再ビルド ] をクリックします。
ビルドが完了したら、ブラウザでアプリケーションを再読み込みします。再び「Hello World!」と表示されます。
お疲れさまでした
Cloud Build を使用して、Google Cloud の GKE で継続的インテグレーション パイプラインの作成とロールバックを行ってみましょう。
Google Cloud トレーニングと認定資格
Google Cloud トレーニングと認定資格を通して、Google Cloud 技術を最大限に活用できるようになります。必要な技術スキルとベスト プラクティスについて取り扱うクラス では、学習を継続的に進めることができます。トレーニングは基礎レベルから上級レベルまであり、オンデマンド、ライブ、バーチャル参加など、多忙なスケジュールにも対応できるオプションが用意されています。認定資格 を取得することで、Google Cloud テクノロジーに関するスキルと知識を証明できます。
マニュアルの最終更新日: 2024 年 1 月 26 日
ラボの最終テスト日: 2024 年 1 月 19 日
Copyright 2025 Google LLC All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。