Jenkinsマルチブランチパイプラインの作成方法

かつてはJenkinsのジョブをUIのみで作成していました。しかし、ビルドやデプロイのジョブの複雑性が高まるにつれ、「パイプラインをコードとして扱う」というアイデアが提案されました。Jenkins 2.0では、JenkinsチームはJenkinsfileを導入し、パイプラインをコードとして実現しました。自動化されたプルリクエストベースやブランチベースのJenkins継続的インテグレーションおよび継続的デリバリーパイプラインを構築したい場合、Jenkinsのマルチブランチパイプラインが有力な選択肢です。

Jenkinsのマルチブランチパイプラインは完全にGitベースのパイプラインコードであるため、CI/CDワークフローを構築できます。パイプラインコード(PaaC)は、セレニウムへの自動化やクラウドの移植性の利点を容易に導入できます。マルチブランチパイプラインモデルを使用することで、セレニウムテストを迅速かつ確実にビルド、テスト、デプロイ、監視、レポート、そして管理できるほか、他にも多くのことが可能です。このJenkinsチュートリアルでは、Jenkinsのマルチブランチパイプラインを作成する方法と、セレニウムの自動化テスト向けにJenkinsのマルチブランチパイプラインを構成する際の主要な概念について見ていきます。

始めましょう。

Jenkinsのマルチブランチパイプラインとは何ですか?

公式ドキュメントによれば、マルチブランチパイプラインのジョブタイプは、シングルのGitリポジトリから複数のブランチを検出し、Jenkinsfileが見つかるたびに入れ子になったジョブを作成するジョブを定義できるものです。

上記の定義から、JenkinsがGitリポジトリをスキャンしてJenkinsfileを検索し、自動的にジョブを作成できることが理解できます。私たちから必要なのはGitリポジトリの詳細だけです。この記事では、サンプルGitHubリポジトリを使用します。私たちのサンプルGitHubリポジトリには、Tomcatにデプロイ可能なサンプルSpring Bootプロジェクトが含まれています。

プロジェクトのルートディレクトリにJenkinsfileがあります。このJenkinsfileはJenkinsの宣言型パイプライン構文を使用して作成しました。Jenkinsの宣言型パイプラインに初めて触れる方は、詳細な記事をこちらで読むことをお勧めします。

サンプルJenkinsfile

 

pipeline {
   agent any
   stages {
       stage('Build Code') {
           steps {
               sh """
               echo "Building Artifact"
               """
           }
       }
      stage('Deploy Code') {
          steps {
               sh """
               echo "Deploying Code"
               """
          }
      }
   }
}

Jenkinsfileでは「コードをビルド」と「コードをデプロイ」の2つのステージを作成し、それぞれ適切なメッセージを出力するように設定しました。これでJenkinsfileを含むGitリポジトリが準備できました。

JenkinsサーバーでJenkinsマルチブランチパイプラインを作成しましょう。

Jenkinsパイプラインとマルチブランチパイプライン

Jenkinsパイプラインは新しい流行ですが、すべての人に適しているわけではありません。そしてマルチブランチパイプラインは依然として素晴らしいです。このJenkinsマルチブランチパイプラインチュートリアルのセクションでは、Jenkinsパイプラインとマルチブランチパイプラインの比較を通じて、Jenkinsパイプラインとマルチブランチパイプラインの理想的な使用ケースを理解しましょう。

Jenkins pipelineは、パイプラインのジョブを自動的に実行するジョブ構成システムです。Jenkins pipelineは複数のステージを持つことができ、各ステージは単一のエージェントによって実行され、1台または複数のマシンで実行されます。パイプラインは通常、特定のソースコードブランチのために作成されます。新しいジョブを作成する際に、ソースコードリポジトリとブランチを選択するオプションが表示されます。また、新しいプロジェクトや既存のプロジェクトの新機能のための新しいパイプラインを作成することもできます。

Jenkins pipelineを使用すると、ビルドのためのステージを持つ柔軟なJenkinsfileを持つことができます。つまり、リンティング、テストなどを実行する初期ステージと、アーティファクトのビルドまたはデプロイメントのための別々のステージを持つことができます。これは、パイプライン内で複数の処理を行いたい場合に非常に便利です。

もし、1つの処理だけを行いたい場合や、行いたい処理が特定の設定によって異なる場合、Jenkins pipelineを使用することは理にかなっていますか?

これらのケースでは、Multibranch pipelineという別のアプローチがより適している可能性があります。Multibranch pipelineを使用すると、タスクをブランチに分割し、後で統合することができます。これはGitのブランチングの仕組みに非常に似ています。

A multibranch pipeline is a pipeline that has multiple branches. The main advantage of using a multibranch pipeline is to build and deploy multiple branches from a single repository. Having a multibranch pipeline also allows you to have different environments for different branches. However, it is not recommended to use a multibranch pipeline if you do not have a standard branching and CI/CD strategy.

Jenkins pipelineとMultibranch pipelineの比較を見てきたので、Jenkins Multibranch pipelineを作成する手順を説明しましょう。

Jenkins Multibranch Pipelineの作成

ステップ1

Jenkinsのホームページ(ローカルではhttp://localhost:8080)を開き、左側のメニューから「新規アイテム」をクリックします。

ステップ2

Jenkinsのジョブ名」を入力し、スタイルを「マルチブランチパイプライン」に設定して「OK」をクリックします。

ステップ3

設定」ページで、設定する必要があるのは1点だけです:Gitリポジトリのソース

ブランチソース」セクションまでスクロールダウンし、「ソースの追加」ドロップダウンをクリックします。

ソースとして「GitHub」を選択します。これはサンプルのGitHubリポジトリがホストされているためです。

ステップ4

リポジトリのHTTPS URL」にhttps://github.com/iamvickyav/spring-boot-h2-war-tomcat.gitを入力し、「検証」をクリックします。

サンプルのGitHubリポジトリはパブリックリポジトリとしてホストされているため、アクセスするための資格情報の設定は必要ありません。企業/プライベートリポジトリの場合は、アクセスするための資格情報が必要になることがあります。

資格情報OK」メッセージは、JenkinsサーバーとGitリポジトリの間の接続が成功したことを意味します。

ステップ5

残りの設定セクションはそのままにしておき、下部の「保存」ボタンをクリックします。

保存すると、Jenkinsは以下のステップを自動的に実行します:

リポジトリスキャンステップ

  • 設定したGitリポジトリをスキャンします。
  • Gitリポジトリ内の利用可能なブランチリストを探します。
  • Jenkinsfileを持つブランチを選択します。

ビルド実行ステップ

  • 各ブランチに対して、前のステップで見つかったブランチごとにJenkinsfileで述べられている手順に従ってビルドを実行します。

リポジトリスキャンログ」セクションから、リポジトリスキャンステップ中に何が起こったかを理解できます。

私たちのgitリポジトリにはマスターブランチしかないため、リポジトリスキャンログには「処理されたブランチが1つ」と表示されます。

スキャンが完了すると、Jenkinsは各処理されたブランチごとにビルドジョブを作成して実行します。

この場合、マスターという名前のブランチが1つだけありました。したがって、ビルドはマスターブランチのみを対象に実行されます。左側のメニューの「ステータス」をクリックして同じことを確認できます。

ステータスセクションにマスターブランチのビルドジョブが作成されているのを確認できます。

ブランチ名をクリックしてビルドジョブのログとステータスを確認します。

ステージビュー」は、各ステージが実行にどれくらい時間がかかり、ビルドジョブのステータスがどうなっているかを視覚的に表します。

ビルドジョブの実行ログにアクセス

ステップ1

ビルド番号」を「ビルド履歴」セクションでクリックします。

ステップ2

次に、左側のメニューから「コンソール出力」を選択してログを表示します。

もし私たちのGitリポジトリに複数のブランチがある場合、どうなるのでしょうか?今すぐ確認しましょう。

Gitリポジトリで、「開発」という名前の新しいブランチが作成されます。

開発”ブランチのビルドを区別するため、Jenkinsfile内のechoコマンドに小さな変更を加えました。

Jenkinsfileマスターブランチにある

 

pipeline {
   agent any
   stages {
       stage('Build Code') {
           steps {
               sh """
               echo "Building Artifact"
               """
           }
       }
      stage('Deploy Code') {
          steps {
               sh """
               echo "Deploying Code"
               """
          }
      }
   }
}

Jenkinsfile開発ブランチにある

 

pipeline {
   agent any
   stages {
       stage('Build Code') {
           steps {
               sh """
               echo "Building Artifact from Develop Branch"
               """
           }
       }
      stage('Deploy Code') {
          steps {
               sh """
               echo "Deploying Code from Develop Branch"
               """
          }
      }
   }
}

現在、2つの異なるブランチに2つのJenkinsfileがあります。Jenkinsでリポジトリスキャンを再実行して、挙動を確認しましょう。

新しいブランチ(開発ブランチ)がJenkinsに検出され、開発ブランチ用に新しいジョブが別々に作成されたことがわかります。

開発”をクリックすると、開発ブランチのビルドジョブのログが表示されます。

前の例では、マスターと開発ブランチのJenkinsfileに異なる内容を保持しました。しかし、実際のアプリケーションではそうしません。ステージブロック内のwhenブロックを活用してブランチをチェックします。

ここでは、マスターと開発ブランチの組み合わせステップの例を示します。この同じ内容がマスターと開発ブランチの両方のJenkinsfileに配置されます。

 

pipeline {
    agent any
    stages {
        stage('Master Branch Deploy Code') {
            when {
                branch 'master'
            }
            steps {
                sh """
                echo "Building Artifact from Master branch"
                """

                sh """
                echo "Deploying Code from Master branch"
                """
            }
        }
        stage('Develop Branch Deploy Code') {
            when {
                branch 'develop'
            }
            steps {
                sh """
                echo "Building Artifact from Develop branch"
                """
                sh """
                echo "Deploying Code from Develop branch"
                """
           }
        }
    }
}

ステップ3

左側のメニューから“リポジトリをスキャン”をクリックして、JenkinsがGitリポジトリから新しい変更を検出できるようにします。

この時点で、リポジトリからの変更を検出させたいときは常にリポジトリスキャンを使用していることに気付いたかもしれません。

このステップを自動化するのはどうでしょうか?

Jenkinsマルチブランチパイプラインスキャンの定期的なトリガー

ステップ1

左側のメニューから“設定”をクリックします。

ステップ2

リポジトリトリガーのスキャン」セクションまでスクロールし、「それ以外の場合は定期的に」チェックボックスを有効にし、スキャンが定期的に実行される時間間隔を選択します(この例では2分間)。

ステップ3

保存」ボタンをクリックします。

これからは、Jenkinsがリポジトリを2分ごとにスキャンします。もし新しいコミットが任意のブランチで見つかれば、Jenkinsはその特定のブランチのためにJenkinsfileを使用して新しいビルドジョブを実行します。

以下は「リポジトリスキャンログ」で、明らかに2分ごとにスキャンがトリガーされています。

Jenkinsマルチブランチパイプラインのリアルタイムユースケース

以下は、Jenkinsマルチブランチパイプラインが便利ないくつかのシナリオです。

  • マスターブランチに新しいコミットがある場合、サーバーに自動的にデプロイされる必要があります。
  • 開発者が開発ブランチにプルリクエスト(PR)を提起しようとする場合:
    • コードはコンパイルエラーなしで正常にビルドされなければなりません。
    • コードは最小80%のテストカバレッジが必要です。
    • コードはSONARコード品質テストに合格しなければなりません。
  • 開発者がマスターまたは開発以外のブランチにコードをプッシュしようとする場合、コードは正常にコンパイルされなければなりません。さもなくば、アラートメールを送信します。

以下は、上記のいくつかのユースケースをカバーするサンプルJenkinsfileです。

pipeline {
    agent any
    tools {
        maven 'MAVEN_PATH'
        jdk 'jdk8'
    }
    stages {
        stage("Tools initialization") {
            steps {
                sh "mvn --version"
                sh "java -version"
            }
        }
        stage("Checkout Code") {
            steps {
                checkout scm
            }
        }
        stage("Check Code Health") {
            when {
                not {
                    anyOf {
                        branch 'master';
                        branch 'develop'
                    }
                }
           }
           steps {
               sh "mvn clean compile"
            }
        }
        stage("Run Test cases") {
            when {
                branch 'develop';
            }
           steps {
               sh "mvn clean test"
            }
        }
        stage("Check Code coverage") {
            when {
                branch 'develop'
            }
            steps {
               jacoco(
                    execPattern: '**/target/**.exec',
                    classPattern: '**/target/classes',
                    sourcePattern: '**/src',
                    inclusionPattern: 'com/iamvickyav/**',
                    changeBuildStatus: true,
                    minimumInstructionCoverage: '30',
                    maximumInstructionCoverage: '80')
           }
        }
        stage("Build and Deploy Code") {
            when {
                branch 'master'
            }
            steps {
                sh "mvn tomcat7:deploy"
            }
        }
    }
 }

この新しいJenkinsfileをmasterおよびdevelopブランチにコミットしましたので、次回のリポジトリスキャンでJenkinsのマルチブランチによって検出されます。

JenkinsマルチブランチパイプラインによるSelenium自動化テスト

ウェブサイトの自動化テストケースを書いているとしましょう。新しいテストケースがブランチにコミットされるたびに、それらを実行して期待どおりに実行されていることを確認したいと思います。

各ブラウザーとオペレーティングシステムの組み合わせで自動化テストケースを実行することは、開発者にとって悪夢です。そこで、LambdaTestの強力な自動化テストインフラストラクチャが役立つ場合があります。

LambdaTest Seleniumグリッドを使用すると、ブラウザカバレッジを最大化できます。

このセクションでは、JenkinsマルチブランチパイプラインでLambdaTestのテストインフラストラクチャを活用する方法を見ていきます。デモンストレーションのために、ここにサンプルのTodoアプリをホストしました—LambdaTest ToDo App。Cucumberで書かれた自動化テストケースがサンプルリポジトリにコミットされています。

Jenkinsから、これらのテストケースをLambdaTestプラットフォームで実行したいと考えています。LambdaTestでテストケースを実行するには、ユーザー名とアクセストークンが必要です。LambdaTestプラットフォームで無料でサインアップして、あなたの資格情報を取得してください。

環境変数の設定

テストケースが実行されると、LambdaTestのユーザー名(LT_USERNAME)とパスワード(LT_ACCESS_KEY)を環境変数で探します。そのため、事前にそれらを設定する必要があります。

ソースコードと一緒に保存するのを避けるために、Jenkinsでそれらをシークレットとして設定し、環境変数をそれらからロードしました:

 

environment {
               LAMBDATEST_CRED = credentials('Lambda-Test-Credentials-For-multibranch')
               LT_USERNAME = "$LAMBDATEST_CRED_USR"
               LT_ACCESS_KEY = "$LAMBDATEST_CRED_PSW"
}

こちらが最終的なJenkinsfileです:

 

pipeline {
   agent any
   tools {
       maven 'MAVEN_PATH'
       jdk 'jdk8'
   }
   stages {
       stage("Tools initialization") {
           steps {
               sh "mvn --version"
               sh "java -version"
           }
       }
       stage("Checkout Code") {
           steps {
               checkout scm
           }
       }
       stage("Check Code Health") {
           when {
               not {
                   anyOf {
                       branch 'master';
                       branch 'develop'
                   }
               }
          }
          steps {
              sh "mvn clean compile"
           }
       }
       stage("Run Test cases in LambdaTest") {
           when {
               branch 'develop';
           }
           environment {
               LAMBDATEST_CRED = credentials('Lambda-Test-Credentials-For-multibranch')
               LT_USERNAME = "$LAMBDATEST_CRED_USR"
               LT_ACCESS_KEY = "$LAMBDATEST_CRED_PSW"
           }
          steps {
              sh "mvn test"
           }
       }
   }
}

さて、上記のセクションで説明されている手順に従ってJenkinsで新しい「Job」をマルチブランチパイプラインとして作成します。サンプルリポジトリにポイントしましょう。

ビルドが正常に実行されたら、LambdaTest自動化ダッシュボードを訪れてテストログを取得してください。

結論

これで、Jenkinsのマルチブランチパイプラインを作成する方法、その中のgitリポジトリを設定する方法、異なるブランチのための異なるビルドステップ、Jenkinsによるリポジトリの定期的な自動スキャンの使用、そしてLambdaTestの強力な自動化テストインフラストラクチャを活用してCI/CDビルドを自動化する方法を学びました。この記事が役立ったことを願っています。コメントセクションでご意見を共有してください。

Source:
https://dzone.com/articles/how-to-create-jenkins-multibranch-pipeline