Azure Pipelines の「We stopped hearing from agent」:メモリ・CPU・ディスクが尽きたエージェント、再起動したマシン、切れたネットワーク
ジョブを動かしていたエージェントが Azure Pipelines に応答しなくなり、ジョブはその場で失敗しました。起きかたは3つで、メッセージ自身に書いてあります。エージェントのプロセスが何かに終わらされた、エージェントに CPU が回ってこなかった、ネットワークがふさがれた、です。Microsoft ホストのエージェントでは、たいてい初めの2つで、あるステップがマシンのメモリかディスクを使い切っています。システム診断を有効にして、ログがステップごとに残すメモリ・CPU・ディスクを読みます(このメッセージについての Stack Overflow の質問は1万回近く見られています)。
プルリクエストのビルド検証がこれでエージェントを失うと、新しい実行が通るまで必須のビルドは失敗のままです:JetBrains IDE のプラグイン Azure DevOps Pull Requests は、そのプルリクエストのブランチ ポリシーを状態つきで IDE に並べるので、どの必須のビルドが落ちたかがプルリクエストの横でわかります。JetBrains Marketplace で入れる
どう見えるか
##[error]We stopped hearing from agent Hosted Agent. Verify the agent machine is running and has a healthy network connection. Anything that terminates an agent process, starves it for CPU, or blocks its network access can cause this error.- Microsoft ホストのエージェントでは名前が
Hosted AgentやAzure Pipelines 3、セルフホストのエージェントでは自分で付けた名前です。エージェントが黙ったときに動いていたステップが、ログの最後のステップです。
エージェントが使った量をステップごとに見る
- Run pipeline → Enable system diagnostics で実行するか、変数
system.debugをtrueにします。すると、ログがステップごとにエージェントの資源を残します(詳細なログの構成)。 - ログで
Agent environment resourcesを探します。Microsoft の例の行:##[debug]Agent environment resources - Disk: D:\ Available 12342.00 MB out of 14333.00 MB, Memory: Used 1907.00 MB out of 7167.00 MB, CPU: Usage 17.23%。応答がなくなる前のステップで、メモリが合計に近いか、ディスクがほとんど残っていなければ、それが答えです(このメッセージについての Microsoft のトラブルシューティング)。 - Azure DevOps Server では、マシンの資源をファイルに書いてログと一緒に上げる PowerShell のステップを Microsoft が載せています(リソース使用率の詳細のキャプチャ)。
メモリ・CPU・ディスクが尽きた Microsoft ホストのエージェント
- Windows と Linux のエージェントは、CPU 2コア・メモリ 7 GB・SSD 14 GB の仮想マシンで、ジョブのために少なくとも 10 GB が空いています。Linux では、ステップは実メモリ 6 GB・合計 13 GB の cgroup の中で動きます(Microsoft ホストのエージェント)。
- Microsoft は、これより大きなホストのマシンを出しません。ステップが使う量を減らす(テストのランナーやビルドのツールの並列のワーカーを減らす、ディスクに残す Docker のイメージを減らす)か、必要な大きさのマシンのセルフホストのエージェント、スケール セットのエージェント、Managed DevOps Pools でジョブを動かします。
- ディスクが尽きたときは、先にそのステップ自身が
No space left on deviceで落ちることがあります。そのメッセージについての Microsoft の FAQ も、同じ 10 GB を挙げています。
セルフホストのエージェント:マシン、エージェントのプロセス、ネットワーク
- マシンがスリープした、再起動した、ネットワークが切れた、または何かがエージェントのプロセスを終わらせた(エージェントのサービスが止められた、メモリが尽きてシステムに終わらされた、セキュリティのソフトに終わらされた)。
- エージェント自身のログは、エージェントのディレクトリの
_diagフォルダーにあります(エージェントのトラブルシューティングのメモ)。Agent_*.logは、エージェントがいつつながり、各ジョブがどう終わったかを示し、実行の日時の付いたWorker_*.logは、その実行のワーカーのログです(エージェントの診断ログ)。 system.debugの資源の行はどのエージェントでも出るので、セルフホストのマシンが足りなくなっているときもわかります。
マシンを再起動するステップ
- ジョブはそのマシンのエージェントの中で動くので、マシンを再起動するステップ(更新のインストール、再起動のコマンド)はエージェントも一緒に終わらせ、Azure Pipelines はエージェントから応答を受けなくなります。これについての Stack Overflow の質問への答えの1つは、ジョブの外から、たとえば SSH や PowerShell のリモート処理で再起動するよう勧めています。
見分け方
The job running on agent Hosted Agent ran longer than the maximum time of 60 minutes:エージェントを失ったのではなく、無料の Microsoft ホストのジョブの時間の上限です。Microsoft ホストの並列ジョブのページへ。- ジョブがエージェントをもらえず、
No agent found in pool ... which satisfies the specified demandsで待つか落ちる:そのページへ。
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 のいずれとも提携しておらず、承認も受けていません。
ほかに:プールに demand を満たすエージェントがいない · Microsoft ホストの並列ジョブがまだない · リソースの承認の問題 · English