Azure Pipelines の「The current operating system is not capable of running this task」:Linux や macOS のエージェントに Windows 専用のタスク
タスクはそれぞれ task.json に、エージェントがどう動かすかを書いています。Windows・Linux・macOS のどれでも動く Node か、PowerShell3 のような Windows 専用のハンドラーです。Linux や macOS のエージェントで動くジョブが、Windows 用のハンドラーしかないタスクに来ると、エージェントには起動できるものがなく、タスクが何もしないうちにステップが失敗します。そのジョブを Windows のエージェントで動かすか、Node のハンドラーを持つ版や別のタスクを使います(このメッセージについての Stack Overflow の質問は1万回近く見られています)。
これでプルリクエストのビルド検証が落ちると、正しいエージェントでの実行が通るまで必須のビルドは失敗のままです:JetBrains IDE のプラグイン Azure DevOps Pull Requests は、そのプルリクエストのブランチ ポリシーを状態つきで IDE に並べ、Pro ならパイプラインを直したあとで失敗したビルド ポリシーをそこからもう一度動かせます。JetBrains Marketplace で入れる
どう見えるか
##[error]The current operating system is not capable of running this task. That typically means the task was written for Windows only. For example, written for Windows Desktop PowerShell.- ステップのログには、まずタスクの名前と版(
Task : Azure file copy、Version : 6.282.2)が出て、そのあとにこの行が出ます。タスクそのものはまだ何も動いていません。エージェントのソースはステップごとにハンドラーを選び、Linux と macOS では PowerShell3・PowerShell・PowerShellExe・Process のハンドラーを候補にしません(TaskManager.cs)。
Windows 専用のタスクか:task.json を読む
- タスクの
task.jsonのexecutionの欄にハンドラーが並んでいます。PowerShell3(またはPowerShell・Process)だけなら Windows 専用です。Node・Node16・Node20_1・Node24があれば Linux と macOS でも動きます。Microsoft の組み込みのタスクは azure-pipelines-tasks のリポジトリにあり、セルフホストのエージェントでは、ダウンロードしたタスクがエージェントの_work/_tasksフォルダーにあります。 - いま Windows 用のハンドラーしかない組み込みのタスクには、Azure file copy(
AzureFileCopy@5・@6)、Visual Studio build(VSBuild@1)、@3までの Azure PowerShell、Azure SQL Database のデプロイ(SqlAzureDacpacDeployment@1)、Windows machine file copy、PowerShell on target machines、Service Fabric のデプロイ、バッチ スクリプトのタスク(BatchScript@1)があります。 - Microsoft のページにも書いてあります。Azure file copy は PowerShell で書かれていて Windows のエージェントでしか動かず(AzureFileCopy@6)、Visual Studio build は Windows のエージェントだけが対象です(VSBuild@1)。
- Marketplace の拡張機能のタスクも同じしくみです。
task.jsonは拡張機能の中にあり、PowerShell で書かれた拡張機能は Windows でしか動きません。同じ仕事を Node でする別の拡張機能があることもあります。Terraform のタスクについての Stack Overflow の質問では、採用された回答が、3つの OS のどれでも動く拡張機能を2つ挙げています。
ジョブを Windows で動かす
- Microsoft ホストのエージェントなら、ジョブのプールを Windows のイメージにします。YAML では
pool: vmImage: windows-latest、クラシックのパイプラインでは Agent Specification をwindows-latestにします。動かすのは Windows 専用のタスクがあるジョブだけでよく、ほかのジョブはubuntu-latestのままでかまいません。 - 両方の種類のエージェントがいるセルフホストのプールでは、demand の
Agent.OS -equals Windows_NTでジョブを Windows のエージェントに回します(Demands)。ほかのエージェントのAgent.OSはLinuxかDarwinです。 - プールが思っていたものかを確かめます。セルフホストのエージェントについての質問では、YAML を Windows のエージェントがいるプールに向けるのが回答でした。
または、どこでも動くタスクを使う
- Blob ストレージへの Azure file copy:Node のハンドラーを持つ Azure CLI のタスク
AzureCLI@2でaz storage blob upload-batch(またはazcopy)を使います。Azure file copy の Microsoft のページも、Linux のエージェントには Azure CLI のタスクを勧めています。 - Azure PowerShell:
AzurePowerShell@4と@5は PowerShell3 のほかに Node のハンドラーも持っているので、Linux と macOS ではスクリプトをpwshで動かします。@3より前は持っていません。 - Visual Studio build:SDK 形式のプロジェクトは
dotnet build(DotNetCoreCLI@2かスクリプト)でビルドできます。C++ のプロジェクトのように Visual Studio のビルド ツールが要るものは、Windows のエージェントが要ります。 - バッチ スクリプト:
script:かCmdLine@2は、Linux と macOS ではシェルのスクリプト、Windows では cmd を動かします。
見分けかた
- Windows のエージェントでは、同じ状態が
A supported task execution handler was not found. The task does not carry an implementation that is compatible with your current operating systemと、そのあとの OS とアーキテクチャで出ます。たとえば古い PowerShell か AzurePowerShell のハンドラーしかないタスクを、32ビットのエージェントで動かしたときです。 - ジョブが始まらずに待つか、
No agent found in pool ... which satisfies the specified demandsで失敗する:タスクの demand(msbuild・visualstudio・azureps)を、セルフホストのプールのどのエージェントも持っていません。そのページへ。
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 なら失敗したか期限が切れたビルド ポリシーをそこからもう一度動かせます。レビューの受信箱は無料、投票・コメント・完了・作成は Pro(30日間の無料試用つき)です。画面は日本語です。
Azure DevOps・Azure Pipelines は Microsoft Corporation の商標、GitHub は GitHub, Inc. の商標、IntelliJ IDEA・Rider は JetBrains s.r.o. の商標です。このページは Microsoft・GitHub, Inc.・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:デプロイのタスクが探すところに zip がない · プールに demand を満たすエージェントがいない · ジョブの途中でエージェントが応答しなくなった · Microsoft ホストの並列ジョブがまだない · English