Jenkins を使用して Compute Engine に分散ビルドを実行する


このチュートリアルでは、次の方法について説明します。

  • Jenkins の継続的インテグレーション システムを作成し、Compute Engine のオンデマンド Jenkins エージェントを使用してビルドを実行する。
  • ビルド アーティファクトを Cloud Storage に保存する。
  • ライフサイクル ポリシーを適用して、Cloud Storage の古いビルド アーティファクトを低価格なストレージ オプションに移動する。

アーキテクチャ

次の図は、このチュートリアルのアーキテクチャの概要を示しています。

サービス アカウントが Compute Engine を介して Cloud Storage にアーティファクトを push する方法を示すアーキテクチャ。

この図では、Jenkins にサービス アカウントを追加して、Jenkins がエージェント インスタンスを作成し、Cloud Storage に長期保存用のアーティファクトを push できるようにします。Jenkins は、ビルドの実行時にその場でインスタンスをプロビジョニングします。ビルド アーティファクトが古くなるにつれて、さまざまなストレージ クラスに移動し、維持コストを制限します。

目標

  • Packer を使用して、Jenkins のビルドを実行するためのベースイメージを作成します。
  • Cloud Marketplace を使用して、Jenkins をプロビジョニングします。
  • エフェメラル ビルド エージェントをデプロイするように Jenkins を構成します。
  • ビルド アーティファクトを Cloud Storage にアップロードします。
  • ライフサイクル ポリシーを構成して、Cloud Storage のコストを最適化します。

料金

このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。

  • Compute Engine
  • Cloud Storage

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを出すことができます。

始める前に

  1. Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Google Cloud プロジェクトで課金が有効になっていることを確認します

  4. Compute Engine API を有効にします。

    API を有効にする

  5. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  6. Google Cloud プロジェクトで課金が有効になっていることを確認します

  7. Compute Engine API を有効にします。

    API を有効にする

環境設定

このセクションでは、チュートリアルを完了するために必要なインフラストラクチャと ID を構成します。チュートリアルの残りの部分は、Cloud Shell から実行します。

Cloud Shell を開く

IAM を構成する

Identity and Access Management(IAM)のサービス アカウントを作成し、Jenkins に権限を委任します。このアカウントにより、Jenkins は Cloud Storage にデータを保存し、Compute Engine でインスタンスを起動できます。Jenkins は、一時的なインスタンスでビルドを実行し、Cloud Storage にビルド アーティファクトを格納します。

サービス アカウントを作成する

  1. サービス アカウント自体を作成します。

    gcloud iam service-accounts create jenkins --display-name jenkins
  2. 後のコマンドで使用するために、サービス アカウントのメールアドレスと現在の 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)')
  3. サービス アカウントに次のロールをバインドします。

    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 プラグインを構成するときに使用します。

  1. キーファイルを作成します。

    gcloud iam service-accounts keys create jenkins-sa.json --iam-account $SA_EMAIL
  2. Cloud Shell で [さらに表示] をクリックし、[ファイルをダウンロード] をクリックします。

  3. タイプ jenkins-sa.json

  4. [ダウンロード] をクリックして、ファイルをローカルに保存します。

Jenkins エージェント イメージを作成する

次に、Jenkins エグゼキュータとして実行するために必要なソフトウェアとツールを含む再利用可能な Compute Engine イメージを作成します。

Cloud Shell 用の SSH 認証鍵を作成する

このチュートリアルの後半では、Packer を使用してイメージをビルドしますが、これを行うには ssh コマンドでビルド インスタンスと通信できる必要があります。SSH アクセスを有効にするには、Cloud Shell で SSH 認証鍵を作成してアップロードします。

  1. SSH 認証鍵ペアを作成します。すでに存在する場合、次のコマンドはその認証鍵ペアを使用します。それ以外の場合は、新しいものを作成します。

    ls ~/.ssh/id_rsa.pub || ssh-keygen -N ""
  2. 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 プロビジョナーを追加することによって、イメージをカスタマイズできます。

  1. 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
  2. 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
    
  3. 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 インスタンスをプロビジョニングします。このインスタンスをカスタマイズして、前のセクションで作成したエージェント イメージを使用します。

  1. Jenkins の Cloud Marketplace ソリューションに移動します。

  2. [運用開始] をクリックします。

  3. [マシンタイプ] フィールドを [4 vCPUs 15 GB Memory, n1-standard-4] に変更します。

    Jenkins デプロイ用のマシンタイプの選択。

  4. [デプロイ] をクリックして、Jenkins インスタンスのプロビジョニングが終了するまで待機します。終了すると、次のように表示されます。

    デプロイされた Jenkins。

  5. [サイトのアドレス] リンクをクリックして、ブラウザで Jenkins インスタンスを開きます。

  6. 詳細ペインに表示された管理者ユーザー管理者パスワードを使用して、Jenkins にログインします。

    認証情報とその他のデプロイの詳細を含む詳細ペイン。

これで Jenkins インスタンスが使用できるようになりました。

Jenkins プラグインの構成

Jenkins には、Compute Engine でオンデマンド エージェントを作成し、Cloud Storage にアーティファクトを保存するためのプラグインが必要です。このプラグインをインストールして構成する必要があります。

プラグインをインストールする

  1. Jenkins UI で [Manage Jenkins] を選択します。
  2. [Manage Plugins] をクリックします。
  3. [Available] タブをクリックします。
  4. [Filter] バーを使用して以下のプラグインを見つけ、それらの横にあるチェックボックスをオンにします。

    • Compute Engine プラグイン
    • Cloud Storage プラグイン

    次の画像は、選択された Cloud Storage プラグインを示しています。

    Cloud Storage プラグイン。

  5. [Download now and install after restart] をクリックします。

  6. [Restart Jenkins when installation is complete and no jobs are running] チェックボックスをオンにします。Jenkins がプラグインのインストールを再開し、完了します。

プラグインの認証情報を作成する

新しいプラグイン用に Google Credentials を作成する必要があります。

  1. もう一度 Jenkins にログインして、[Manage Jenkins] をクリックします。
  2. [Credentials] をクリックします。
  3. [ストア] で [Jenkins] をクリックします。
  4. UI のメインペインで、[Global credentials (unrestricted)] をクリックします。
  5. Google の認証情報を作成します。

    1. [Add Credentials] をクリックします。
    2. [Kind] を [Google Service Account from private key] に設定します。
    3. [プロジェクト名] フィールドに、Google Cloud プロジェクト ID を入力します。
    4. [Choose File] をクリックします。
    5. 以前に Cloud Shell からダウンロードした jenkins-sa.json ファイルを選択します。
    6. [OK] をクリックします。

      JSON キーの認証情報。

  6. [Jenkins] をクリックします。

Compute Engine プラグインを構成する

エージェント インスタンスをプロビジョニングするための認証情報を使用して、Compute Engine プラグインを構成します。

  1. [Manage Jenkins] をクリックします。
  2. [Manage Nodes and Clouds] をクリックします。
  3. [Configure Clouds] をクリックします。
  4. [Add a new Cloud] をクリックします。
  5. [Compute Engine] をクリックします。
  6. 次の設定を行い、[YOUR_PROJECT_ID] を Google Cloud プロジェクト ID に置き換えます。

    • 名前: gce
    • プロジェクト ID: [YOUR_PROJECT_ID]
    • インスタンスの上限: 8
  7. [Service Account Credentials] プルダウン リストからサービス アカウントを選択します。Google Cloud プロジェクト ID として表示されます。

Jenkins インスタンスを構成する

Compute Engine プラグインの構成が完了したので、さまざまなビルド構成用に Jenkins インスタンスを構成できます。

  1. [Configure Clouds] ページで、[Instance Configurations] の [Add] をクリックします。
  2. [General] の設定に次のように入力します。

    • Name: ubuntu-2004
    • Description: Ubuntu agent
    • Labels: ubuntu-2004
  3. [Location] の設定に次のように入力します。

    • Region<: us-central1
    • Zone: us-central1-f
  4. [Advanced] をクリックします。

  5. [Machine Configuration] の [Machine Type] で n1-standard-1 を選択します。

  6. [Networking] で、次の設定を選択します。

    • Network: デフォルト設定のままにします。
    • Subnetwork: デフォルト設定のままにします。
    • [Attach External IP?] を選択します。
  7. [Boot Disk] 設定で、次のフィールドを選択します。

    • [Image project] で、Google Cloud プロジェクトを選択します。
    • Image name: 前に Packer でビルドしたイメージを選択します。
  8. [Save] をクリックして、構成の変更を保存します。

    Jenkins 用の Compute Engine 構成。

構成をテストするための Jenkins ジョブの作成

Jenkins は、ubuntu-2004 ラベルを持つエージェントが必要なジョブがトリガーされたときに自動的にインスタンスを起動するように構成されています。構成が正常に機能しているかどうかをテストするジョブを作成します。

  1. Jenkins インターフェースで [Create new job] をクリックします。
  2. アイテム名として「test」と入力します。
  3. [Freestyle project] をクリックし、[OK] をクリックします。
  4. [Execute concurrent builds if necessary] および [Restrict where this project can run] ボックスを選択します。
  5. [Label Expression] フィールドに「ubuntu-2004」と入力します。
  6. [Build] セクションで [Add build step] をクリックします。
  7. [Execute Shell] をクリックします。
  8. コマンド ボックスにテスト文字列を入力します。

    echo "Hello world!"

    Jenkins のコマンド ボックスに入力された Hello World。

  9. [Save] をクリックします。

  10. [Build Now] をクリックして、ビルドを開始します。

    [Build Now] ボタン。

Cloud Storage へのビルド アーティファクトのアップロード

将来の分析やテストのためにビルド アーティファクトを保管することもできます。アーティファクトを生成し、Cloud Storage にアップロードするように Jenkins ジョブを構成します。ビルドログは同じバケットにアップロードされます。

  1. Cloud Shell で、アーティファクト用のストレージ バケットを作成します。

    export PROJECT=$(gcloud info --format='value(config.project)')
    gsutil mb gs://$PROJECT-jenkins-artifacts
  2. Jenkins UI のジョブリストで、[test] をクリックします。

  3. [Configure] をクリックします。

  4. [Build] で [Command] テキスト フィールドを次のように設定します。

    env > build_environment.txt
  5. [Post-build Actions] で [Add post-build action] をクリックします。

  6. [Cloud Storage Plugin] をクリックします。

  7. [Storage Location] フィールドに、アーティファクトのパスを入力します。[YOUR_PROJECT_ID] は Google Cloud プロジェクト ID に置き換えます。

    gs://[YOUR_PROJECT_ID]-jenkins-artifacts/$JOB_NAME/$BUILD_NUMBER
  8. [Add Operation] をクリックします。

  9. [Classic Upload] をクリックします。

  10. [File Pattern] フィールドに、「build_environment.txt」と入力します。

  11. [Storage Location] フィールドに、ストレージのパスを入力します。[YOUR_PROJECT_ID] は Google Cloud プロジェクト ID に置き換えます。

    gs://[YOUR_PROJECT_ID]-jenkins-artifacts/$JOB_NAME/$BUILD_NUMBER

    Cloud Storage プラグインのビルド後のアクション。

  12. [Save] をクリックします。

  13. [Build Now] をクリックして、新しいビルドを開始します。ビルドは、前にプロビジョニングした Compute Engine インスタンスで実行されます。ビルドが完了すると、アーティファクト ファイル build_environment.txt が、構成された Cloud Storage バケットにアップロードされます。

  14. Cloud Shell で、gsutil を使用してビルド アーティファクトを表示します。

    export PROJECT=$(gcloud info --format='value(config.project)')
    gsutil cat gs://$PROJECT-jenkins-artifacts/test/2/build_environment.txt

オブジェクト ライフサイクル管理の構成

通常は、最近のビルド アーティファクトにアクセスすることになります。あまりアクセスしないオブジェクトのコストを節約するには、オブジェクトのライフサイクル管理を使用して、アーティファクトを、高パフォーマンスのストレージ クラスから、低コストでレイテンシが長いストレージ クラスに移動します。

  1. 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
  2. 構成ファイルをアーティファクト ストレージ バケットにアップロードします。

    export PROJECT=$(gcloud info --format='value(config.project)')
    gsutil lifecycle set artifact-lifecycle.json gs://$PROJECT-jenkins-artifacts

クリーンアップ

  1. 実行中の Jenkins エージェントを削除します。

    gcloud compute instances list --filter=metadata.jclouds-group=ubuntu-2004 --uri | xargs gcloud compute instances delete
  2. Cloud Deployment Manager を使用して、Jenkins インスタンスを削除します。

    gcloud deployment-manager deployments delete jenkins-1
  3. Cloud Storage バケットを削除します。

    export PROJECT=$(gcloud info --format='value(config.project)')
    gsutil -m rm -r gs://$PROJECT-jenkins-artifacts
  4. サービス アカウントを削除します。

    export SA_EMAIL=$(gcloud iam service-accounts list --filter="displayName:jenkins" --format='value(email)')
    gcloud iam service-accounts delete $SA_EMAIL

次のステップ