このチュートリアルでは、次の方法について説明します。
- Jenkins の継続的インテグレーション システムを作成し、Compute Engine のオンデマンド Jenkins エージェントを使用してビルドを実行する。
- ビルド アーティファクトを Cloud Storage に保存する。
- ライフサイクル ポリシーを適用して、Cloud Storage の古いビルド アーティファクトを低価格なストレージ オプションに移動する。
アーキテクチャ
次の図は、このチュートリアルのアーキテクチャの概要を示しています。
この図では、Jenkins にサービス アカウントを追加して、Jenkins がエージェント インスタンスを作成し、Cloud Storage に長期保存用のアーティファクトを push できるようにします。Jenkins は、ビルドの実行時にその場でインスタンスをプロビジョニングします。ビルド アーティファクトが古くなるにつれて、さまざまなストレージ クラスに移動し、維持コストを制限します。
目標
- Packer を使用して、Jenkins のビルドを実行するためのベースイメージを作成します。
- Cloud Marketplace を使用して、Jenkins をプロビジョニングします。
- エフェメラル ビルド エージェントをデプロイするように Jenkins を構成します。
- ビルド アーティファクトを Cloud Storage にアップロードします。
- ライフサイクル ポリシーを構成して、Cloud Storage のコストを最適化します。
料金
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
- Compute Engine
- Cloud Storage
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを出すことができます。
始める前に
- Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
-
Compute Engine API を有効にします。
-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
-
Compute Engine API を有効にします。
環境設定
このセクションでは、チュートリアルを完了するために必要なインフラストラクチャと ID を構成します。チュートリアルの残りの部分は、Cloud Shell から実行します。
IAM を構成する
Identity and Access Management(IAM)のサービス アカウントを作成し、Jenkins に権限を委任します。このアカウントにより、Jenkins は Cloud Storage にデータを保存し、Compute Engine でインスタンスを起動できます。Jenkins は、一時的なインスタンスでビルドを実行し、Cloud Storage にビルド アーティファクトを格納します。
サービス アカウントを作成する
サービス アカウント自体を作成します。
gcloud iam service-accounts create jenkins --display-name jenkins
後のコマンドで使用するために、サービス アカウントのメールアドレスと現在の Google Cloud プロジェクト ID を環境変数に格納します。
export SA_EMAIL=$(gcloud iam service-accounts list \ --filter="displayName:jenkins" --format='value(email)') export PROJECT=$(gcloud info --format='value(config.project)')
サービス アカウントに次のロールをバインドします。
gcloud projects add-iam-policy-binding $PROJECT \ --role roles/storage.admin --member serviceAccount:$SA_EMAIL gcloud projects add-iam-policy-binding $PROJECT --role roles/compute.instanceAdmin.v1 \ --member serviceAccount:$SA_EMAIL gcloud projects add-iam-policy-binding $PROJECT --role roles/compute.networkAdmin \ --member serviceAccount:$SA_EMAIL gcloud projects add-iam-policy-binding $PROJECT --role roles/compute.securityAdmin \ --member serviceAccount:$SA_EMAIL gcloud projects add-iam-policy-binding $PROJECT --role roles/iam.serviceAccountActor \ --member serviceAccount:$SA_EMAIL
サービス アカウント キーをダウンロードする
サービス アカウントに適切な権限を付与したら、そのキーを作成してダウンロードする必要があります。キーは安全な場所に保管してください。後で、Compute Engine API で認証するように JClouds プラグインを構成するときに使用します。
キーファイルを作成します。
gcloud iam service-accounts keys create jenkins-sa.json --iam-account $SA_EMAIL
Cloud Shell で [さらに表示] more_vert をクリックし、[ファイルをダウンロード] をクリックします。
タイプ
jenkins-sa.json
。[ダウンロード] をクリックして、ファイルをローカルに保存します。
Jenkins エージェント イメージを作成する
次に、Jenkins エグゼキュータとして実行するために必要なソフトウェアとツールを含む再利用可能な Compute Engine イメージを作成します。
Cloud Shell 用の SSH 認証鍵を作成する
このチュートリアルの後半では、Packer を使用してイメージをビルドしますが、これを行うには ssh
コマンドでビルド インスタンスと通信できる必要があります。SSH アクセスを有効にするには、Cloud Shell で SSH 認証鍵を作成してアップロードします。
SSH 認証鍵ペアを作成します。すでに存在する場合、次のコマンドはその認証鍵ペアを使用します。それ以外の場合は、新しいものを作成します。
ls ~/.ssh/id_rsa.pub || ssh-keygen -N ""
Cloud Shell の公開 SSH 認証鍵をプロジェクトのメタデータに追加します。
gcloud compute project-info describe \ --format=json | jq -r '.commonInstanceMetadata.items[] | select(.key == "ssh-keys") | .value' > sshKeys.pub echo "$USER:$(cat ~/.ssh/id_rsa.pub)" >> sshKeys.pub gcloud compute project-info add-metadata --metadata-from-file ssh-keys=sshKeys.pub
ベースライン イメージを作成する
次のステップでは、Packer を使用して、Jenkins で一時的なビルド エグゼキュータとして機能する、ビルド エージェント用のベースライン仮想マシン(VM)イメージを作成します。最も基本的な Jenkins エージェントでは、Java のインストールだけが必要です。Packer 構成の provisioners
セクションにシェルコマンドを追加するか、他の Packer プロビジョナーを追加することによって、イメージをカスタマイズできます。
Cloud Shell で、Packer の最新リリースをダウンロードして展開します。次の例では、Packer 1.7.10 を使用します。より新しいバージョンがあるかどうかは、Hashicorp のウェブサイトから確認できます。
wget https://releases.hashicorp.com/packer/1.7.10/packer_1.7.10_linux_amd64.zip unzip packer_1.7.10_linux_amd64.zip
Packer イメージビルドの構成ファイルを作成します。
export PROJECT=$(gcloud info --format='value(config.project)') cat > jenkins-agent.json <<EOF { "builders": [ { "type": "googlecompute", "project_id": "$PROJECT", "source_image_family": "ubuntu-2004-lts", "source_image_project_id": "ubuntu-os-cloud", "zone": "us-central1-a", "disk_size": "50", "image_name": "jenkins-agent-{{timestamp}}", "image_family": "jenkins-agent", "ssh_username": "ubuntu" } ], "provisioners": [ { "type": "shell", "inline": ["sudo apt-get update && sudo apt-get install -y default-jdk"] } ] } EOF
Packer を実行してイメージをビルドします。
./packer build jenkins-agent.json
ビルドが完了すると、ディスク イメージの名前が
jenkins-agent-[TIMESTAMP]
の形式で表示されます。[TIMESTAMP]
はビルド開始時のエポックタイムです。==> Builds finished. The artifacts of successful builds are: --> googlecompute: A disk image was created: jenkins-agent-1612997575
Jenkins のインストール
このセクションでは、Cloud Marketplace を使用して Jenkins インスタンスをプロビジョニングします。このインスタンスをカスタマイズして、前のセクションで作成したエージェント イメージを使用します。
[運用開始] をクリックします。
[マシンタイプ] フィールドを [4 vCPUs 15 GB Memory, n1-standard-4] に変更します。
[デプロイ] をクリックして、Jenkins インスタンスのプロビジョニングが終了するまで待機します。終了すると、次のように表示されます。
[サイトのアドレス] リンクをクリックして、ブラウザで Jenkins インスタンスを開きます。
詳細ペインに表示された管理者ユーザーと管理者パスワードを使用して、Jenkins にログインします。
これで Jenkins インスタンスが使用できるようになりました。
Jenkins プラグインの構成
Jenkins には、Compute Engine でオンデマンド エージェントを作成し、Cloud Storage にアーティファクトを保存するためのプラグインが必要です。このプラグインをインストールして構成する必要があります。
プラグインをインストールする
- Jenkins UI で [Manage Jenkins] を選択します。
- [Manage Plugins] をクリックします。
- [Available] タブをクリックします。
[Filter] バーを使用して以下のプラグインを見つけ、それらの横にあるチェックボックスをオンにします。
- Compute Engine プラグイン
- Cloud Storage プラグイン
次の画像は、選択された Cloud Storage プラグインを示しています。
[Download now and install after restart] をクリックします。
[Restart Jenkins when installation is complete and no jobs are running] チェックボックスをオンにします。Jenkins がプラグインのインストールを再開し、完了します。
プラグインの認証情報を作成する
新しいプラグイン用に Google Credentials
を作成する必要があります。
- もう一度 Jenkins にログインして、[Manage Jenkins] をクリックします。
- [Credentials] をクリックします。
- [ストア] で [Jenkins] をクリックします。
- UI のメインペインで、[Global credentials (unrestricted)] をクリックします。
Google の認証情報を作成します。
- [Add Credentials] をクリックします。
- [Kind] を [Google Service Account from private key] に設定します。
- [プロジェクト名] フィールドに、Google Cloud プロジェクト ID を入力します。
- [Choose File] をクリックします。
- 以前に Cloud Shell からダウンロードした
jenkins-sa.json
ファイルを選択します。 [OK] をクリックします。
[Jenkins] をクリックします。
Compute Engine プラグインを構成する
エージェント インスタンスをプロビジョニングするための認証情報を使用して、Compute Engine プラグインを構成します。
- [Manage Jenkins] をクリックします。
- [Manage Nodes and Clouds] をクリックします。
- [Configure Clouds] をクリックします。
- [Add a new Cloud] をクリックします。
- [Compute Engine] をクリックします。
次の設定を行い、
[YOUR_PROJECT_ID]
を Google Cloud プロジェクト ID に置き換えます。- 名前:
gce
- プロジェクト ID:
[YOUR_PROJECT_ID]
- インスタンスの上限:
8
- 名前:
[Service Account Credentials] プルダウン リストからサービス アカウントを選択します。Google Cloud プロジェクト ID として表示されます。
Jenkins インスタンスを構成する
Compute Engine プラグインの構成が完了したので、さまざまなビルド構成用に Jenkins インスタンスを構成できます。
- [Configure Clouds] ページで、[Instance Configurations] の [Add] add をクリックします。
[General] の設定に次のように入力します。
- Name:
ubuntu-2004
- Description:
Ubuntu agent
- Labels:
ubuntu-2004
- Name:
[Location] の設定に次のように入力します。
- Region<:
us-central1
- Zone:
us-central1-f
- Region<:
[Advanced] をクリックします。
[Machine Configuration] の [Machine Type] で n1-standard-1 を選択します。
[Networking] で、次の設定を選択します。
- Network: デフォルト設定のままにします。
- Subnetwork: デフォルト設定のままにします。
- [Attach External IP?] を選択します。
[Boot Disk] 設定で、次のフィールドを選択します。
- [Image project] で、Google Cloud プロジェクトを選択します。
- Image name: 前に Packer でビルドしたイメージを選択します。
[Save] をクリックして、構成の変更を保存します。
構成をテストするための Jenkins ジョブの作成
Jenkins は、ubuntu-2004
ラベルを持つエージェントが必要なジョブがトリガーされたときに自動的にインスタンスを起動するように構成されています。構成が正常に機能しているかどうかをテストするジョブを作成します。
- Jenkins インターフェースで [Create new job] をクリックします。
- アイテム名として「
test
」と入力します。 - [Freestyle project] をクリックし、[OK] をクリックします。
- [Execute concurrent builds if necessary] および [Restrict where this project can run] ボックスを選択します。
- [Label Expression] フィールドに「
ubuntu-2004
」と入力します。 - [Build] セクションで [Add build step] をクリックします。
- [Execute Shell] をクリックします。
コマンド ボックスにテスト文字列を入力します。
echo "Hello world!"
[Save] をクリックします。
[Build Now] をクリックして、ビルドを開始します。
Cloud Storage へのビルド アーティファクトのアップロード
将来の分析やテストのためにビルド アーティファクトを保管することもできます。アーティファクトを生成し、Cloud Storage にアップロードするように Jenkins ジョブを構成します。ビルドログは同じバケットにアップロードされます。
Cloud Shell で、アーティファクト用のストレージ バケットを作成します。
export PROJECT=$(gcloud info --format='value(config.project)') gsutil mb gs://$PROJECT-jenkins-artifacts
Jenkins UI のジョブリストで、[test] をクリックします。
[Configure] をクリックします。
[Build] で [Command] テキスト フィールドを次のように設定します。
env > build_environment.txt
[Post-build Actions] で [Add post-build action] をクリックします。
[Cloud Storage Plugin] をクリックします。
[Storage Location] フィールドに、アーティファクトのパスを入力します。
[YOUR_PROJECT_ID]
は Google Cloud プロジェクト ID に置き換えます。gs://[YOUR_PROJECT_ID]-jenkins-artifacts/$JOB_NAME/$BUILD_NUMBER
[Add Operation] をクリックします。
[Classic Upload] をクリックします。
[File Pattern] フィールドに、「
build_environment.txt
」と入力します。[Storage Location] フィールドに、ストレージのパスを入力します。
[YOUR_PROJECT_ID]
は Google Cloud プロジェクト ID に置き換えます。gs://[YOUR_PROJECT_ID]-jenkins-artifacts/$JOB_NAME/$BUILD_NUMBER
[Save] をクリックします。
[Build Now] をクリックして、新しいビルドを開始します。ビルドは、前にプロビジョニングした Compute Engine インスタンスで実行されます。ビルドが完了すると、アーティファクト ファイル
build_environment.txt
が、構成された Cloud Storage バケットにアップロードされます。Cloud Shell で、
gsutil
を使用してビルド アーティファクトを表示します。export PROJECT=$(gcloud info --format='value(config.project)') gsutil cat gs://$PROJECT-jenkins-artifacts/test/2/build_environment.txt
オブジェクト ライフサイクル管理の構成
通常は、最近のビルド アーティファクトにアクセスすることになります。あまりアクセスしないオブジェクトのコストを節約するには、オブジェクトのライフサイクル管理を使用して、アーティファクトを、高パフォーマンスのストレージ クラスから、低コストでレイテンシが長いストレージ クラスに移動します。
Cloud Shell で、ライフサイクル構成ファイルを作成します。これにより、すべてのオブジェクトを 30 日後に Nearline Storage に移動し、Nearline オブジェクトを 365 日後に Coldline Storage に移動します。
cat > artifact-lifecycle.json <<EOF { "lifecycle": { "rule": [ { "action": { "type": "SetStorageClass", "storageClass": "NEARLINE" }, "condition": { "age": 30, "matchesStorageClass": ["MULTI_REGIONAL", "STANDARD", "DURABLE_REDUCED_AVAILABILITY"] } }, { "action": { "type": "SetStorageClass", "storageClass": "COLDLINE" }, "condition": { "age": 365, "matchesStorageClass": ["NEARLINE"] } } ] } } EOF
構成ファイルをアーティファクト ストレージ バケットにアップロードします。
export PROJECT=$(gcloud info --format='value(config.project)') gsutil lifecycle set artifact-lifecycle.json gs://$PROJECT-jenkins-artifacts
クリーンアップ
実行中の Jenkins エージェントを削除します。
gcloud compute instances list --filter=metadata.jclouds-group=ubuntu-2004 --uri | xargs gcloud compute instances delete
Cloud Deployment Manager を使用して、Jenkins インスタンスを削除します。
gcloud deployment-manager deployments delete jenkins-1
Cloud Storage バケットを削除します。
export PROJECT=$(gcloud info --format='value(config.project)') gsutil -m rm -r gs://$PROJECT-jenkins-artifacts
サービス アカウントを削除します。
export SA_EMAIL=$(gcloud iam service-accounts list --filter="displayName:jenkins" --format='value(email)') gcloud iam service-accounts delete $SA_EMAIL
次のステップ
- Jenkins による継続的デプロイについて学ぶ
- Jenkins を Kubernetes Engine にデプロイする
- Google Cloud に関するリファレンス アーキテクチャ、図、ベスト プラクティスを確認する。Cloud Architecture Center をご覧ください。