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」と呼びます。
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の設計思想です。
以下は、MavenとJDKのCapabilityによって、エージェントの振り分けを行っている例です。
しかし、実際にはフロントエンドやモバイルアプリのビルドツールなど、 シェルスクリプトによってビルドを行う場合が多く、 コマンドに応じたCapabilityによる割り振りができない場合があります。
また、BambooのリモートエージェントはJavaVM(JDK)で起動しているため、 Javaのビルドを行わないエージェントであってもJDKのCapabilityを エージェントが認識してしまうと言う問題があります。
このため、実際にBambooを使用する上では、CustomのCapabilityを使って エージェントに対してフラグを割り振り、Build PlanおよびDeployment Projectでは、 そのフラグを指定してエージェントの割り振りを行う方法が一般的です。
以下はエージェントの「app」というフラグを割り当てたことで、 エージェントを振り分けしている設定の例です。
またBuild Plan内でバージョン管理システム(SCM)からのチェックアウトを行うには、 エージェントがSCMを実行するCapabilityを持っている必要があります。
通常は、エージェントの起動時にgit
等のSCMのコマンドにパスが通っていれば、SCMのCapabilityとして認識されます。