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

Beginner

はじめに

Jenkins のマルチブランチパイプライン(Multibranch Pipeline)は、ソース管理リポジトリをスキャンし、Jenkinsfile を含むブランチを検出して、ブランチごとに 1 つのパイプラインジョブを作成します。これにより、main ブランチやフィーチャーブランチが、1 つの親プロジェクトの下でそれぞれのパイプライン定義を保持できるようになります。

この実験では、2 つのブランチを持つ小さなローカル Git リポジトリを準備し、Jenkins ダッシュボードからマルチブランチパイプラインを作成します。その後、リポジトリをスキャンし、検出された各ブランチのコンソール出力を比較します。

2 ブランチ Git リポジトリの準備

このステップでは、Jenkins がスキャン可能な小さな Git リポジトリを準備します。このリポジトリは Jenkins コンテナ内に配置されるため、GitHub などの外部サービスに依存することなく、Jenkins コントローラーから直接アクセスできます。

ターミナルで以下のコマンドを実行し、Jenkinsfile を含む main ブランチを作成します。

docker exec jenkins bash -lc '
set -e
rm -rf /var/jenkins_home/multibranch-src /var/jenkins_home/multibranch-demo.git
mkdir -p /var/jenkins_home/multibranch-src
cd /var/jenkins_home/multibranch-src
git init -b main
git config user.email "jenkins@example.com"
git config user.name "Jenkins Multibranch"
cat > Jenkinsfile <<'"'"'EOF'"'"'
pipeline {
    agent any
    stages {
        stage("Branch Info") {
            steps {
                echo "Running main branch pipeline"
                sh "echo BRANCH_NAME=${BRANCH_NAME}"
            }
        }
    }
}
EOF
git add Jenkinsfile
git commit -m "Add main branch Jenkinsfile"
'

次に、異なるパイプラインメッセージを持つ feature/demo ブランチを作成し、両方のブランチをベアリポジトリにプッシュします。

docker exec jenkins bash -lc '
set -e
cd /var/jenkins_home/multibranch-src
git checkout -b feature/demo
sed -i "s/Running main branch pipeline/Running feature demo pipeline/" Jenkinsfile
git add Jenkinsfile
git commit -m "Customize feature branch Jenkinsfile"
git init --bare --initial-branch=main /var/jenkins_home/multibranch-demo.git
git remote add origin /var/jenkins_home/multibranch-demo.git
git push origin main
git push origin feature/demo
touch /var/jenkins_home/multibranch-demo.git/git-daemon-export-ok
if [ -f /tmp/multibranch-git-daemon.pid ]; then
  kill "$(cat /tmp/multibranch-git-daemon.pid)" 2>/dev/null || true
  rm -f /tmp/multibranch-git-daemon.pid
fi
git daemon --reuseaddr --base-path=/var/jenkins_home --export-all --detach --pid-file=/tmp/multibranch-git-daemon.pid /var/jenkins_home
'

Jenkins がスキャンするブランチを確認します。

docker exec jenkins git --git-dir=/var/jenkins_home/multibranch-demo.git branch -a | tee /home/labex/project/multibranch-branches.txt

両方のブランチが表示されるはずです。

  feature/demo
* main

マルチブランチパイプラインプロジェクトの作成

このステップでは、Jenkins ダッシュボードからマルチブランチパイプラインプロジェクトを作成します。このプロジェクトは git://localhost/multibranch-demo.git をスキャンし、各ブランチ内の Jenkinsfile を検索します。

デスクトップインターフェースを開きます。Firefox が自動的に Jenkins を開きます。開かない場合は http://localhost:8080 にアクセスしてください。

Jenkins ダッシュボードから:

New Item をクリックし、multibranch-demo と入力して Multibranch Pipeline を選択し、OK をクリックします。

設定ページにて:

Branch Sources セクションで Add source をクリックし、Git を選択します。

Git ソースに以下の値を入力します。

  • Project Repository: git://localhost/multibranch-demo.git
  • Credentials: - none -

Behaviors はデフォルトのブランチ検出設定のままにします。Build Configuration では、Modeby Jenkinsfile に、Script PathJenkinsfile に設定します。

Save をクリックします。

Jenkins Multibranch Pipeline Git source

以下のコマンドを実行して、保存された設定内容を記録します。

docker exec jenkins sh -lc "grep -n -E 'WorkflowMultiBranchProject|git://localhost/multibranch-demo.git|<scriptPath>Jenkinsfile</scriptPath>' /var/jenkins_home/jobs/multibranch-demo/config.xml" | tee /home/labex/project/multibranch-config-lines.txt

リポジトリブランチのスキャン

このステップでは、Jenkins ダッシュボードからブランチインデックス作成(Branch Indexing)を実行します。ブランチインデックス作成により、Git リポジトリがスキャンされ、Jenkinsfile を持つブランチが検出され、それらのブランチに対する子ジョブが作成されます。

multibranch-demo プロジェクトページで、Scan Multibranch Pipeline Now をクリックします。

mainfeature/demo の子ジョブが表示されるまで待ちます。Jenkins は検出された各ブランチの最初のビルドを自動的に開始する場合があります。

Jenkins discovered Multibranch jobs

以下のコマンドを実行して、検出された子ジョブを記録します。

curl -fsS http://localhost:8080/job/multibranch-demo/api/json | grep -o '"name":"[^"]*"' | tee /home/labex/project/multibranch-discovered-jobs.txt

出力には両方のブランチジョブが含まれているはずです。

"name":"main"
"name":"feature%2Fdemo"

ブランチビルドの確認

このステップでは、Jenkins が各ブランチをビルドできることを確認します。マルチブランチパイプラインは、各ブランチを個別のパイプラインジョブとして保持します。

multibranch-demo ページから main ブランチジョブを開きます。ビルドが既に実行中の場合は完了するまで待ちます。まだビルドがない場合は Build Now をクリックします。

multibranch-demo に戻り、feature/demo ブランチジョブを開いて同様の操作を行います。

両方のブランチジョブで最新のビルドが成功しているはずです。

Jenkins successful branch builds

以下のコマンドを実行して、各ブランチの最新の成功したビルド結果を記録します。

python3 - <<'PY' | tee /home/labex/project/multibranch-build-results.txt
import json
import urllib.request

for url_name, display in [('main', 'main'), ('feature%252Fdemo', 'feature/demo')]:
    with urllib.request.urlopen(f'http://localhost:8080/job/multibranch-demo/job/{url_name}/lastBuild/api/json') as response:
        data = json.load(response)
    print(f'{display}: {data["result"]}')
PY

以下のように表示されるはずです。

main: SUCCESS
feature/demo: SUCCESS

ブランチパイプライン出力の比較

このステップでは、2 つのブランチビルドのコンソール出力を比較します。main ブランチと feature/demo ブランチの Jenkinsfile には異なるメッセージが記述されているため、ログを確認することで、Jenkins がブランチごとに正しいパイプラインを実行したことを証明できます。

最新の main ブランチビルドを開き、Console Output をクリックします。Running main branch pipeline と表示されているはずです。

次に、最新の feature/demo ブランチビルドを開き、Console Output をクリックします。Running feature demo pipeline と表示されているはずです。

Jenkins Multibranch Pipeline console output

以下のコマンドを実行して、コンソール出力を記録します。

curl -fsS http://localhost:8080/job/multibranch-demo/job/main/lastBuild/consoleText | grep 'Running main branch pipeline' | tee /home/labex/project/multibranch-console-lines.txt
curl -fsS http://localhost:8080/job/multibranch-demo/job/feature%252Fdemo/lastBuild/consoleText | grep 'Running feature demo pipeline' | tee -a /home/labex/project/multibranch-console-lines.txt

まとめ

ローカル Git リポジトリを 2 つのブランチで準備し、Jenkins ダッシュボードからマルチブランチパイプラインを作成し、リポジトリをスキャンして、両方のブランチジョブが正常にビルドされることを確認し、ブランチごとのパイプライン出力を比較しました。