【CloudBees CI奮闘記】第3章:共有エージェントを利用する


Jenkinsは世界中で人気があるフリーでオープンソースの自動化サーバーです。そのため気軽に運用を開始することができ、Jenkinsの豊富な機能やプラグインを用いることで環境を発展させていくことが可能です。その一方でJenkinsの運用を進めていくうちに課題も発生してくることがあります。
CloudBees CI奮闘記として、Jenkinsを利用していると発生し得る課題の紹介をしながら、それらを解消するエンタープライズ機能を強化した有償版JenkinsであるCloudBees CIの紹介を行っていきます。
本ブログでは、CloudBees CIと区別するためにhttps://www.jenkins.io/のJenkinsをOSS Jenkinsと記載します。

そもそも「CloudBees CIとは?」といったことや、Jenkinsの利用上の課題についてはこちらのブログより確認ください。

はじめに

登場人物

吉田:転職したてのエンジニア。前職では積極的にCIやCDに取り組みながら開発をしていた。CI奮闘記では服部に色々アドバイスを行った。

服部:元々CIやJenkinsについては言葉は聞いたことがある程度であったが、吉田からのサポートをうけつつCI環境の導入担当として日々奮闘している。CI奮闘記では自部署にJenkinsを導入した。

共有エージェントとは

前回無事にOperations CenterとClient Controllerを作成できたので、今回は共有エージェントという機能を利用してみましょう。

共有エージェント…?こちらのテクマトリックスのサイトを見ると…複数のJenkinsから同一のエージェントを利用できるって書いてありますね。

そうなの。ちょうど今隣の部署から、うちの部署で使っているノードロックライセンスのテストツールを使ってみたいって話が挙がっていてね。
うちの部署で24時間テストツールを使い続けているわけではないじゃない?
この仕組みをうまく使って共同で利用できたら、テストツールをもっと効率的に活用できると思ったの。

なるほど!OSS Jenkinsじゃ1つのエージェントは1つのJenkinsとしか関連付けられないですからね。
早速試してみましょう。

OSS Jenkinsの場合、1つのJenkinsに対して複数のエージェントを接続することはできますが、1つのエージェントに対しては1つのJenkinsしか接続することができません。
例えば会話であったように、ノードロックライセンスのツールを複数のJenkinsからエージェントとして利用しようとした場合、以下のような形をとることになります。

  • 複数のJenkinsを一つにまとめる。
  • ノードロックライセンスを追加、またはフローティングライセンスに切り替え、複数のエージェントマシンで利用できる様にする。
  • Jenkinsの標準機能外の開発等を行い利用できるようにする。

しかしいずれもデメリットが発生します。Jenkinsを一つにまとめた場合、「モノリシックJenkinsの課題」として挙げられるような問題に直面します。ライセンスの変更や追加は費用がかかる場合が多いですし、エージェントマシンの調達もコストになるでしょう。Jenkinsの標準機能外の開発は安定性や保守性という観点で問題が発生する可能性があります。

CloudBees CIの共有エージェントという機能を用いることでこの問題は解決できます。
CloudBees CIには前回紹介したようにOperations Centerという仕組みがあります。
エージェントをClient Controller(Jenkins)に接続するのではなく、Operations Centerに接続することで、Operations Centerに関連づいている複数のClient Controllerから利用できるようになります。

構築する

Operations Centerの準備:共有エージェントの作成と接続

それでは実際に共有エージェントを構築します。
共有エージェントはOSS Jenkinsのエージェントの追加と異なり、「新規ジョブの追加」から追加します。

ジョブ名に「SharedAgent」と入力しOKを押します。
共有エージェントの設定項目はOSS Jenkinsのエージェントと大きな差異はありません。後ほどの実行時に利用するために、Labelには「SharedAgent」と設定します。

項目を入力し設定を保存します。その後OSS Jenkinsのエージェントと同じようにエージェントを接続します。今回はLaunch methodを「Launch agent by connecting it to the controller」を選択したので、エージェントマシンのコマンドプロンプトから接続しました。

問題なく接続が完了しました。Operations Centerからも接続されていることが確認できます。


今回は「Launch agent by connecting it to the controller」の方法でOperations Centerと接続しましたが、ほかの接続方法も可能です。接続方法についてはこちらのドキュメントも併せてご確認ください。
Connecting a shared agent

Client Controllerの準備:Configure Clouds

Client ControllerのJenkinsの管理を確認すると以下の注意が表示されています。

共有エージェントを利用できるようにするため、記載の案内の通りJenkinsの管理 > ノードの管理 > Configure Cloudsに「Operations Center Agent Provisioning Service」を追加します。

これで準備は完了です。

共有エージェントでビルドする

実際にClient ControllerのジョブをOperations Centerに登録した共有エージェントを利用して実行します。
実行するパイプラインは以下のシンプルなパイプラインとします。グローバルエージェントは先ほど作成した共有エージェントを利用するため、SharedAgentを指定します。

pipeline {
    agent {
        label 'SharedAgent'
    }

    stages {
        stage('Echo Stage') {
            steps {
                echo '実行中...'
                sleep 60
            }
        }
    }
}

パイプラインを実行すると、ジョブのコンソールから先ほど作成した共有エージェントを利用してジョブが実行されていることが確認できます。

また、実行中は共有エージェント側のアイコンも黄色くマークがつき、利用されていることも確認できます。

実行待機中
実行中

このように共有エージェントを利用してClient Controllerのジョブを実行できました。
OSS Jenkinsでエージェントを用いて分散ビルドを行っているのであれば詰まることなく設定もできると思います。

エージェントと共有エージェントの違い

OSS Jenkinsのエージェントの場合、エージェントを接続するとダッシュボードのビルド実行状態に接続済みのエージェントとして表示されますが、共有エージェントの場合ビルド実行状態には表示されません。ジョブとして作成した共有エージェントが表示されます。

ダッシュボード左下のビルド実行状態は空
ジョブメニューに作成した共有エージェントが表示される

これは「オンライン」の定義がOSS Jenkinsのエージェントと共有エージェントで異なるためです。
共有エージェント場合、OSS Jenkinsのエージェントの様に実行待機の状態にあるわけではなく、ほかのコントローラーに貸出可能な状態にあるためこのような表示になっているとのことです。
こちらの説明については以下のCloudBeesの共有エージェントの紹介動画でも触れられています。

こちらの動画の3:16あたりから触れられています。

共有エージェントの利用範囲

設定自体は難しくありませんでしたね。これでほかの部署からもこのエージェントを利用できるようになってよかったです。

でも、Operations Center関連付けた共有エージェントはOperations Centerに関連づいているすべてのClient Controllerから利用できるようになってしまうのかしら。セキュリティの観点からあまり利用されたくないエージェントもあるのよね。

利用範囲の制御もできるみたいですよ!

例えば特定の共有エージェントはClient Controller1、Client Controller2からは共同利用したいけど、ほかのClient Controllerからは利用されたくない、といった場合があります。
このような共有エージェントの利用権限の範囲については、Operations Centerのジョブタイプ:フォルダを利用しての制御が可能です。

以下の構成で考えてみます。

Client Controllerが実行可能な共有エージェントを走査するロジックは以下になります。

  • 現在のレベルで使用可能な共有エージェントがあり、そのエージェントがジョブに必要なラベルを持っている場合、その共有エージェントが利用される。
  • 現在のレベルに一致する共有エージェントがない場合は、親レベルに進み、これを繰り返す。

例えばClient Controller1で実行した場合、同一レベルのShared Agent1を確認し、Shared Agent1にジョブに必要なラベルが割り当てられていなかった場合、親レベルに進みShared Agent3を確認します。
Client Controller2で実行した場合、同一レベルのShared Agent3を確認します。Client Controller2からShared Agent1やShared Agent2は参照されません。
また、Shared Agent2はどのClient Controllerからも参照されない共有エージェントとなります。

まとめ

今回は共有エージェントを紹介しました。

  • 機能名:共有エージェント
  • 概要:Operations Centerに接続されたClient Controller(Jenkins)全体でエージェントを共有できる。
  • 具体的な活用例:ツールのライセンスやエージェントマシン自体を容易に増設できない場合でも、複数のJenkins全体のCI実行を最適化して、理想的な分散ビルドを実現することができる。

次回はCloudBees CIの「プラグインの管理」について説明します。

CloudBees CI奮闘記一覧

Jenkinsのよくある課題とCIツール比較

CI奮闘記一覧