BambooのエージェントとCapabilityについて

BambooとCapability

Atlassian Bamboo(以下Bamboo)のジョブの割り振りには、Capabilityという概念があります。

Bambooのcapabilityについてのドキュメントを見ると

A capability is a feature of an agent.

(Capabilityとは、特定のエージェントが備えるフィーチャーのことである)とあり、なるほどわからんという感じなのですが、このことについてこれから説明しますが、その前に「エージェント」について説明します。

なおBamboo6.4から、今までのエージェントを使う方法に加えてDockerイメージをBambooのジョブの実行環境として使用できること が出来るようになっていますが、これについては後日取り上げたいと思います。

エージェントとは

エージェントとはBambooがジョブを実行する際に、ジョブを実行する単位となるBambooのプロセス上の仮想プロセスです。

エージェントには「ローカルエージェント」と「リモートエージェント」の二種類があります。ローカルエージェントとはBambooを実行しているプロセス上で動作するエージェントで、無制限に作成することができます。

リモートエージェントとは、ビルドするプラットフォームがBamboo本体のサーバーと違う、ビルドの負荷分散などの理由で、Bamboo本体とは、別のマシン上でエージェントを動作させたい場合に用います。リモートエージェントを作成できる数は所有しているBambooのライセンスによって決まります。

Capability

それぞれのエージェントがBamboo上のどの処理を実行可能か示すラベルのことを「Capability」と呼びます。

f:id:setoazusa:20180403214122p:plain

Bambooのエージェントの指定方法には、処理を実行可能なCapabilityに応じてエージェントに割り振る方法が基本です。

これに対して、Job/Deployment Project単位で、実行するエージェントを直接指定する方法があり、この方法を「Dedicated Agent」と呼びます。

Bambooのエージェントには「Dedicated Agent」によるエージェントの割り振りを行った場合は、そのエージェントにはCapabilityによるジョブの割り振りはできない仕様があります。

なお、Build PlanにDedicated Agentによるエージェントの割り振りを行う場合は、 BambooのAdministraor権限が必要です。

Capabilityとエージェント

Bambooのエージェントには、Maven/JDK/Dockerなど、エージェント上で実行できる コマンドに応じたCapabilityが割り振られています。

BambooのBuild Planの設定でどのようなコマンドを設定しているかによって、 明示的にエージェントの割り振りを行うことなく 透過的にエージェントの割り振りを行うのがBambooの設計思想です。

以下は、MavenJDKのCapabilityによって、エージェントの振り分けを行っている例です。

f:id:setoazusa:20180403214323p:plain

f:id:setoazusa:20180403214402p:plain

しかし、実際にはフロントエンドやモバイルアプリのビルドツールなど、 シェルスクリプトによってビルドを行う場合が多く、 コマンドに応じたCapabilityによる割り振りができない場合があります。

また、BambooのリモートエージェントはJavaVM(JDK)で起動しているため、 Javaのビルドを行わないエージェントであってもJDKのCapabilityを エージェントが認識してしまうと言う問題があります。

このため、実際にBambooを使用する上では、CustomのCapabilityを使って エージェントに対してフラグを割り振り、Build PlanおよびDeployment Projectでは、 そのフラグを指定してエージェントの割り振りを行う方法が一般的です。

以下はエージェントの「app」というフラグを割り当てたことで、 エージェントを振り分けしている設定の例です。

f:id:setoazusa:20180403225532p:plain

f:id:setoazusa:20180403225552p:plain

またBuild Plan内でバージョン管理システム(SCM)からのチェックアウトを行うには、 エージェントがSCMを実行するCapabilityを持っている必要があります。

通常は、エージェントの起動時にgit等のSCMのコマンドにパスが通っていれば、SCMのCapabilityとして認識されます。