Azure Pipelines の「No agent found in pool ... which satisfies the specified demands」:足りない capability、古いエージェント、エージェントのいないプール
ジョブがプールと demand の一覧を指定していて、そのプールのどのエージェントも、すべての demand に当たる capability を持っていません。コロンの後ろの一覧を読みます。たいていは1つが答えで、エージェントが見つけていないツール(maven・npm・java・msbuild)か、エージェントより新しい版の Agent.Version -gtVersion です。ツールを入れてエージェントを再起動するか、エージェントを更新します(この文についていちばん見られている Stack Overflow の質問は3万6千回以上)。
これでプルリクエストのビルド検証が落ちると、実行が通るまでプルリクエストは完了できません:JetBrains IDE のプラグイン Azure DevOps Pull Requests は、そのプルリクエストのブランチ ポリシーを状態つきで IDE に並べ、必須のものが通っていないときは、完了の画面がまず自動完了を勧めます。JetBrains Marketplace で入れる
どう見えるか
##[error]No agent found in pool Default which satisfies the specified demands: maven, Agent.Version -gtVersion 3.243.1。先にプールの名前、続けてジョブの demand がすべて、カンマ区切りで並びます。- 古い実行では一覧がカンマでなく空白で区切られ(
msbuild visualstudio vstest Agent.Version -gtVersion 2.103.0)、TFS 2015 ではNo agent could be found with the following capabilitiesでした。
demand の読み方
- demand は、エージェントがその名前の capability を持っていれば(exists)、または名前と値が合えば(
-equals)満たされます。大文字と小文字は区別しません。パイプラインに書けるのはこの2つだけです(Microsoft の pool.demands)。 - タスクも自分の demand を足します。たとえば Visual Studio Build のタスクは
msbuildとvisualstudioを求めます。書いた覚えのない demand は、ジョブの中のタスクから来ていることがあります。 Agent.Version -gtVersion 3.243.1も自分で書いたものではありません。ジョブの中のタスクが必要とするので、その版より新しいエージェントを求めています。Microsoft は、パイプラインのタスクやプラットフォームの機能が新しいエージェントを必要とするときにエージェントの更新が求められる、と書いています(エージェントのバージョンとアップグレード)。- エージェントが持っているものを見るには:Project settings(または Organization settings)→ Agent pools → そのプール → Agents → そのエージェント → Capabilities。System capabilities はエージェントが見つけたもの、User capabilities は自分で足したものです。
Agent.Versionもここにあります。
エージェントが見つけていないツール(maven・npm・java・msbuild)
- エージェントは起動するときにツールを探し、見つけたものを登録します。なので、エージェントが動いている間に入れたツールは、エージェントを再起動するまで capability になりません(Microsoft もセルフホストのエージェントについて同じことを書いています)。
- Linux と macOS では、エージェントのサービスが、構成したときの PATH や JAVA_HOME などの環境変数の写しを持っています。ソフトを入れた後は、エージェントのフォルダーで
./env.shを実行してから、サービスを再起動します(sudo ./svc.sh stop、sudo ./svc.sh start)。写しは同じフォルダーの.envと.pathにあります(Linux のエージェント、環境変数の更新)。 - 名前が合っている必要があります。Windows のエージェントが登録するのは
maven・npm・java・jdk・MSBuild・VisualStudio・SqlPackage、版つきのjava_17・jdk_17などです(エージェント自身の capability のスクリプト)。別の名前や別のフォルダーに入っているツールは見つかりません。 - ツールは入っているのにエージェントの一覧に出ないときは、エージェントの Capabilities のタブでユーザーの capability として足します(たとえば
mavenとそのパス)。maven の例で採用された答えもこれでした。
ジョブが求めるより古いエージェント(Agent.Version -gtVersion)
- メッセージの版と、エージェントの
Agent.Versionの capability を比べます。 - 違うのがマイナーバージョンだけなら、Azure Pipelines がセルフホストのエージェントを自分で更新できます(既定で有効・設定は Agent pools の Settings)。対話モードで動かしているエージェントや、新しいメジャーバージョンは手で更新します:Agent pools → そのプール → Update all agents、または1台ずつ Update agent。更新は、エージェントが今のジョブを終えてから動き、約 200 MB を取得します。
- Azure DevOps Server では、更新として出るのはサーバーに付いてきた版のエージェントです。Azure DevOps Server 2019 からは、GitHub の Azure Pipelines Agent のリリースから新しいエージェントを取って、各アプリケーション層の
%ProgramData%\Microsoft\Azure DevOps\Agents(なければフォルダーを作る)に置くと、サーバーがそれを更新として出します。インターネットにつながらないサーバーでも同じです。 - TFS 2015 から TFS 2017 へ上げたときの答え:古いエージェントを消し、サーバーから新しいエージェントを取り直す必要がありました。
このジョブに合うエージェントがいないプール
- Default プールは、セルフホストのエージェントを登録するプールです(エージェントプール)。誰も登録していなければ、
pool: Defaultのジョブはエージェントを見つけられません。Microsoft のマシンで動かすなら、pool:の下にイメージを書きます:vmImage: ubuntu-latest。それが「No hosted parallelism has been purchased or granted」で落ちるなら そのページへ。 - Microsoft ホストのエージェントでは、demand を書く代わりにイメージを選びます。system capabilities も表示されず、Microsoft はイメージごとに入っているソフトを一覧にしています。
- クラシックのパイプラインでは、エージェントのジョブが、パイプラインのプールとは別のプールを指定できます(Stack Overflow の答えに、パイプラインとジョブの両方でプールを指定していた例があります)。メッセージに出ているのはジョブが使ったプールなので、意図したプールかを確かめます。
- 1つのプールに複数の OS があるとき:Linux が必要なジョブは
Agent.OS -equals Linuxを求めることができ、プールに Linux のエージェントがいなければ同じように落ちます。
IntelliJ IDEA と Rider で Azure DevOps のプルリクエスト
Azure DevOps Pull Requests は、Lesstep が作っている JetBrains IDE(2024.1 以降)と Android Studio のプラグインです。組織・プロジェクト・リポジトリを git のリモートから読み、自分のレビューを待っているプルリクエストを IDE のツールウィンドウに並べます。Azure DevOps Services でも Azure DevOps Server でも使えます。プルリクエストのブランチ ポリシーを状態つきで並べるので、まだ通っていない必須のビルドがそのプルリクエストの横に出ます。必須のポリシーが通っていないときは、完了の画面がまず自動完了を勧めます。レビューの受信箱は無料、投票・コメント・完了・作成は Pro(30日間の無料試用つき)です。画面は日本語です。
Azure DevOps・Azure Pipelines は Microsoft Corporation の商標、GitHub は GitHub, Inc. の商標、IntelliJ IDEA・Rider は JetBrains s.r.o. の商標です。このページは Microsoft・GitHub, Inc.・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:ジョブの途中でエージェントが応答しなくなった · Microsoft ホストの並列ジョブがまだない · Permit を待っている実行 · Node.js 6・10・16 は2026年11月24日にエージェントから外される · English