Jenkins との統合

このページでは、ビルドされた Maven パッケージを Artifact Registry リポジトリに保存するように Jenkins を構成する手順について説明します。

始める前に

ターゲット リポジトリが存在しない場合は、新しいリポジトリを作成します

リポジトリへのアクセスを構成する

  1. Artifact Registry で使用する専用の Jenkins のサービス アカウントを作成します。

    次のコマンドを実行して、jenkins-sa という名前のサービス アカウントを作成します。

    gcloud iam service-accounts create jenkins-sa
    

    これにより、jenkins-sa@PROJECT.iam.gserviceaccount.comという名前のサービス アカウントが作成されます。PROJECT はプロジェクト ID です。

  2. リポジトリを含むプロジェクトで、作成した Jenkins サービス アカウントに Artifact Registry Writer のロールを付与します。プロジェクト内のすべてのリポジトリに対してロールを付与する、またはサービス アカウントがアクセスする必要がある特定のリポジトリに対してロールを付与することができます。

    権限とロール別のアクセス権の付与について詳しくは、アクセス制御の構成をご覧ください。

GKE クラスタを設定する

新しい Google Kubernetes Engine クラスタまたはノードプールを設定する場合は、Jenkins による使用を目的として作成したサービス アカウントを使用します。

Console

Google Cloud コンソールを使用してクラスタを作成するには、次の手順を行います。

  1. Google Cloud コンソールで Artifact Registry メニューにアクセスします。

    Artifact Registry メニューに移動

  2. [クラスタを作成] をクリックします。

  3. 必要に応じてクラスタを構成します。まだ [作成] はクリックしないでください。

  4. デフォルト ノードプールで [その他のオプション] をクリックします。

  5. [セキュリティ] セクションで、作成した Jenkins サービス アカウントを選択します。

  6. [保存] をクリックしてオーバーレイを閉じます。

  7. [作成] をクリックします。

gcloud

次のいずれかのコマンドを使用して、Jenkins サービス アカウントを使用するクラスタを作成します。コマンドの PROJECT はプロジェクト ID です。

サービス アカウントを使用するクラスタを作成するには、次のコマンドを実行します。

gcloud container clusters create example-cluster --service-account=jenkins-sa@PROJECT.iam.gserviceaccount.com

既存のクラスタにノードプールを作成するには、次のコマンドを実行します。

gcloud container node-pools create example-pool --service-account=jenkins-sa@PROJECT.iam.gserviceaccount.com

このコマンドの詳細については、gcloud container clusters create のドキュメントをご覧ください。

GKE での Jenkins の設定

  1. GKE で Jenkins を設定するチュートリアルに沿って操作します。前のセクションで作成したクラスタを使用します。

  2. Jenkins で、GKE プラグインを最新バージョンに更新します。[Jenkins の管理] > [プラグインの管理] > [Updates] をクリックします。

Maven プロジェクトを設定する

  1. Jenkins ドキュメントの GitHub リポジトリでサンプル Maven プロジェクトをフォークします。

  2. フォークされたリポジトリのクローンを作成します。

    git clone git@github.com:USER_NAME/simple-java-maven-app.git
    
  3. Jenkins インターフェースで新しいパイプラインを設定します。

    1. [新しい項目] をクリックします。
    2. [Pipeline] を選択します。
    3. パイプラインに名前を付けて、[OK] をクリックします。
  4. [全般] タブの [Pipeline] セクションで次のオプションを構成します。

    • [SCM からのパイプライン スクリプト] を選択します。
    • SCM プルダウン リストで [Git] を選択してから、GitHub リポジトリに接続する URL と認証情報を指定します。

    パイプラインの設定のスクリーンショット

  5. [保存] をクリックします。

リポジトリへの接続を構成する

リポジトリに接続するためのリポジトリと認証情報を使用して Jenkins を構成します。

  1. リポジトリを Maven pom.xml に追加します。追加するスニペットを出力するには、次のコマンドを使用します。

    gcloud artifacts print-settings mvn [--project=PROJECT] \
    [--repository=REPOSITORY] [--location=LOCATION]
    

    ここで

    • PROJECT は、プロジェクト ID です。このフラグを省略すると、現在のプロジェクトまたはデフォルトのプロジェクトが使用されます。
    • REPOSITORY はリポジトリの ID です。デフォルトの Artifact Registry リポジトリを構成した場合、このフラグがコマンドから省略されると使用されます。
    • LOCATION は、リポジトリのリージョンまたはマルチリージョンのロケーションです。
  2. Jenkins エージェント用の Pod テンプレートとして YAML ファイルを作成します。

    mkdir jenkins
    cat > jenkins/maven-pod.yaml << EOF
    apiVersion: v1
    kind: Pod
    spec:
      containers:
      - name: maven
        image: maven:3.3.9-jdk-8-alpine
        command: ['cat']
        tty: true
    EOF
    
  3. ファイル Jenkinsfile を変更します。

    pipeline {
        agent none
        stages {
            stage('Deploy') {
                steps {
                     agent {
                         kubernetes {
                             label 'mavenpod'
                             yamlFile 'jenkins/maven-pod.yaml'
                           }
                       }
                       container('maven') {
                       sh "mvn -B clean deploy"
                     }
                }
            }
        }
    }
    

ビルドの開始

  1. 行った変更を GitHub プロジェクトに push します。

    git add . && git commit -m "Configure my Jenkins pipeline" && git push
    
  2. Jenkins インターフェースで、サンプル Maven プロジェクトのアプリケーションの新しいビルドを開始します。

ビルドが正常に完了すると、作成した Artifact Registry Java Package Repository にアーティファクトが追加されます。

次のコマンドを実行して、リポジトリ内のパッケージを一覧表示します。

gcloud artifacts packages list --repository=mvn-jenkins --location=LOCATION

出力は次の例のようになります。

Listing items under project {YOUR_PROJECT}, repository mvn-jenkins.

PACKAGE                   CREATE_TIME          UPDATE_TIME
com.mycompany.app:my-app  2019-06-25T17:09:44  2019-06-25T17:09:44