Azure DevOps Services |Azure DevOps Server 2022 |Azure DevOps Server 2020
パイプライン ログは、パイプラインエラーの原因を特定するための強力なツールを提供します。詳細ログは、より多くの診断情報を提供するように構成できます。
一般的な開始点は、完了したビルドまたはリリースのログを確認することです。 ログを表示するには、パイプライン実行の概要に移動し、ジョブとタスクを選択します。 特定のタスクが失敗した場合は、そのタスクのログを確認します。 詳細ログを構成 して、より多くの診断情報を含めます。
詳細ログを構成する
トラブルシューティングを支援するために、ログをより詳細に構成できます。
1 回の実行の詳細ログを構成するには、[ パイプラインの実行 ] を選択し、[ システム診断を有効にする] を選択 して、新しいビルドを開始できます。
すべての実行の詳細ログを構成するには、
system.debug
という名前の変数を追加し、その値をtrue
に設定します。
Azure パイプライン ログで、メモリ、CPU 使用率、使用可能なディスク領域などのリソース使用率メトリックをキャプチャできるようになりました。 ログには、パイプライン エージェントによって使用されるリソースと、ジョブで実行されるタスクを含む子プロセスも含まれます。 パイプライン ジョブがリソースの制約に陥る可能性があると思われる場合は、詳細ログを有効にして、リソース使用率情報をパイプライン ログに挿入します。 リソース使用率メトリックは、ホスティング モデルとは無関係に、任意のエージェントで使用できます。
キャプチャされたリソース使用率メトリックを表示するには、各ステップのAgent environment resources
エントリのログを検索します。
2024-02-28T17:41:15.1315148Z ##[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%
ログの表示とダウンロード
各ステップの個々のログを表示するには、実行のビルド結果に移動し、ジョブとステップを選択します。
すべてのログをダウンロードするには、実行のビルド結果に移動し、[ ...] を選択して、[ ログのダウンロード] を選択します。
パイプライン診断ログに加えて、次の特殊なログの種類を使用でき、トラブルシューティングに役立つ情報が含まれている場合があります。
Worker 診断ログ
ビルド エージェントでワーカー プロセスによって生成された完了したビルドの診断ログを取得できます。 完了したビルドの日付と時刻のスタンプを持つ worker
ログ ファイルを探します。 たとえば、「 worker_20160623-192022-utc_6172.log
」のように入力します。
エージェント診断ログ
エージェント診断ログには、エージェントの構成方法と、エージェントの実行時の変更点の記録が表示されます。
agent
ログ ファイルを探します。 たとえば、「 agent_20160624-144630-utc.log
」のように入力します。 エージェント ログ ファイルには、次の 2 種類があります。
config.cmd
の実行時に生成されたログ ファイル。 このログ:上部付近に次の行が含まれます。
Adding Command: configure
行われた構成の選択を示します。
run.cmd
の実行時に生成されたログ ファイル。 このログ:プロセスが終了するまで開くことができません。
Azure DevOps 組織または Team Foundation Server への接続を試みます。
各ジョブが実行された日時と完了した方法を示します
どちらのログも、エージェントの機能が検出され、設定された方法を示しています。
セルフホステッド エージェントのネットワーク診断
Agent.Diagnostic
の値を true
に設定して、セルフホステッド エージェントのネットワークの問題のトラブルシューティングに使用できる追加のログを収集します。
File | 情報 | 対象 |
---|---|---|
cloudinit.* |
Cloud-init が正常に完了しました (使用されている場合) | Linux |
BrokenPackages.* |
パッケージの状態が一貫している | Linux |
Agent.* |
環境変数 | Linux、Windows |
waagentConf.txt |
Azure VM エージェント (waagent.conf) | Azure: Linux、Windows |
environment.txt / agent.* |
アカウント グループメンバーシップリスト | ウィンドウズ |
注
Agent.Diagnostic
が true
に設定されている場合、System.Debug
は自動的に true
に設定されます。
このセクションで説明する Agent.Diagnostic
変数とログは、 Agent v2.200.0 以降で使用できます。
詳細については、microsoft/azure-pipelines-agent Azure Pipelines エージェントのオープン ソース エージェント リポジトリのエージェントのトラブルシューティングを参照してください。
その他のログ
診断ログ内には、 environment.txt
と capabilities.txt
があります。
environment.txt
ファイルには、ビルドを実行した環境に関するさまざまな情報が含まれています。 これには、実行されるタスク、ファイアウォールが有効かどうか、PowerShell のバージョン情報、その他の項目などの情報が含まれます。 このデータは、役に立つよう継続的に追加されます。
capabilities.txt
ファイルは、ビルドを実行したビルド マシンにインストールされているすべての機能を表示するクリーンな方法を提供します。
HTTP トレース ログ
Important
HTTP トレースおよびトレース ファイルには、パスワードやその他のシークレットを含めることができます。 パブリック サイトに投稿 しないでください 。
組み込みの HTTP トレースを使用する
エージェントがバージョン 2.114.0 以降の場合は、HTTP トラフィック ヘッダーをトレースして診断ログに書き込むことができます。 agent.listener を起動する前に、 VSTS_AGENT_HTTPTRACE
環境変数を設定します。
Windows:
set VSTS_AGENT_HTTPTRACE=true
macOS/Linux:
export VSTS_AGENT_HTTPTRACE=true
完全な HTTP トレースを使用する - Windows
Fiddler を起動します。
エージェント トラフィックのみをリッスンすることをお勧めします。 ファイル > キャプチャ トラフィックオフ (F12)
HTTPS トラフィックの暗号化解除を有効にします。 [ツール] > [Fiddler オプション] > [HTTPS] タブ。HTTPS トラフィックの暗号化を解除する
プロキシの使用をエージェントに通知します。
set VSTS_HTTP_PROXY=http://127.0.0.1:8888
エージェントを対話形式で実行します。 サービスとして実行している場合は、サービスが実行されているアカウントのコントロール パネルで環境変数として設定できます。
エージェントを再起動します。
完全な HTTP トレースを使用する - macOS と Linux
Charles プロキシ (Windows の Fiddler と同様) を使用して、エージェントの HTTP トレースをキャプチャします。
Charles Proxy を起動します。
Charles: プロキシ > プロキシ設定 > SSL タブ。有効にします。 URL を追加します。
Charles: Proxy > Mac OSX Proxy. エージェント トラフィックのみを表示するには、無効にすることをお勧めします。
export VSTS_HTTP_PROXY=http://127.0.0.1:8888
エージェントを対話形式で実行します。 サービスとして実行されている場合は、.env ファイルで設定できます。 nix service を参照してください
エージェントを再起動します。
カスタム ログをキャプチャする
組み込みのログに加えて、タスクとスクリプトを使用して、パイプライン内のカスタム ログをキャプチャできます。 次の例では、リソース使用率、ネットワーク トレース、メモリ ダンプ、および perfview トレースをキャプチャする方法を示します。 カスタマー サポートを使用している場合は、次のようなログをキャプチャするように求められる場合があります。
- リソース使用率の詳細をキャプチャする
- ProcDump を使用して dotnet プロセス メモリ ダンプをキャプチャする
- ホストされるエージェントの ETW トレースをキャプチャする
- Capture perfview traces for Visual Studio build
カスタム ログを取得する
パイプラインでカスタム ログをキャプチャした後、それをアップロードしてレビュー用に取得できるようにする必要があります。 カスタム ログは、標準パイプライン ログの一部としてアップロードすることも、成果物としてアップロードすることもできます。 次のセクションの例では、カスタム ログをアップロードする両方の方法を示します。
標準ログの一部としてログをアップロードする
標準パイプライン ログの一部としてカスタム ログをアップロードするには、 ##vso[task.uploadfile]
を使用して目的のファイルをアップロードします。 このコマンドを使用するには、次の例に示すようにスクリプト コマンドの一部として指定します。 ファイルは、標準のパイプライン ログの一部として ダウンロードして表示 できます。
##vso[task.uploadfile]
メソッドは、1 つのログ ファイルをアップロードする場合に適しています。 複数のログ ファイルがある場合は、ファイルごとに個別の ##vso[task.uploadfile]
行を使用する必要があります。
- pwsh: Write-Host "##vso[task.uploadfile]$(Agent.TempDirectory)\resource-usage.txt"
詳細については、「 ログ 記録コマンド 」および「 UploadFile: タスク ログと共にダウンロードできるファイルをアップロードする」を参照してください。
パイプライン成果物としてログをアップロードする
カスタム ログをパイプライン成果物としてアップロードするには、 PublishPipelineArtifact@1 タスクを使用します。
PublishPipelineArtifact@1
は、1 つのファイルまたはディレクトリ パス内のファイルをアップロードできます。アップロードするカスタム ログ ファイルが多数ある場合に便利です。
- task: PublishPipelineArtifact@1
inputs:
targetPath: '$(Pipeline.Workspace)/s/trace'
artifact: 'file_result.pcap'
publishLocation: 'pipeline'
詳細については、「 パイプライン成果物の発行」を参照してください。
リソース使用率の詳細をキャプチャする
Azure DevOps Services を使用する場合は、詳細ログを有効にすることで、ディスク使用量、メモリ使用量、CPU 使用率など、 ログ内のリソース使用率を確認できます。 パイプラインが完了したら、各ステップのAgent environment resources
エントリをログで検索します。
2024-02-28T17:41:15.1315148Z ##[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%
Azure DevOps Server を使用している場合、または追加のメトリックを収集する場合は、PowerShell を使用してリソース使用率をキャプチャし、パイプライン ログにアップロードできます。 パイプラインの実行が完了したら、 パイプライン ログをダウンロードし、キャプチャされたデータを表示できます。
Upload resource usage from pipeline run
ステップがジョブの 6 番目のステップである場合、ログ内のファイル名が 6_resource-usage.txtされます。
# Place this task in your pipeline to log the current resource utilization
# of the pipeline. This task appends the specified resource usage to a logfile
# which is uploaded at the end of the current pipeline job.
- pwsh: |
$logFile = '$(Agent.TempDirectory)\resource-usage.txt'
if (!(Test-Path $logFile))
{
New-Item $logFile
}
Get-Date | Out-File -FilePath $logFile -Append
Get-Volume | Out-File -FilePath $logFile -Append
Get-Counter '\Memory\Available MBytes' | Out-File -FilePath $logFile -Append
Get-Counter '\Processor(_Total)\% Processor Time' | Out-File -FilePath $logFile -Append
sleep 10
displayName: 'Check resource utilization'
# Other tasks here, and you can repeat the "Check resource utilization"
# step if desired, and the results will be appended to the resource-usage.txt file
- pwsh: Write-Host "##vso[task.uploadfile]$(Agent.TempDirectory)\resource-usage.txt"
displayName: 'Upload resource usage from pipeline run'
condition: always()
ProcDump を使用して dotnet プロセス メモリ ダンプをキャプチャする
テストの実行がクラッシュした場合、失敗したテスト実行後に dotnet プロセスのメモリ ダンプをキャプチャするようカスタマー サポートから求められる場合があります。
condition: always()
を使用して、Visual Studio テスト タスクの後に次のタスクを追加します。 パイプラインの実行が完了したら、 メモリ ダンプを含むパイプライン ログをダウンロードできます。
# Run this task after your test execution crashes
# with a condition of alway() so that it always runs
- pwsh: |
Invoke-WebRequest https://download.sysinternals.com/files/Procdump.zip -OutFile $(Agent.TempDirectory)\Procdump.zip
mkdir $(Agent.TempDirectory)\Procdump
unzip $(Agent.TempDirectory)\Procdump.zip -d Procdump
cd $(Agent.TempDirectory)\Procdump
Get-Process dotnet | % { $(Agent.TempDirectory)\procdump.exe -accepteula -ma $_.Id dotnet-$($_.Id).dmp }
Compress-Archive *.dmp -DestinationPath $(Agent.TempDirectory)\dump_files.zip
Write-Host "##vso[task.uploadfile]$(Agent.TempDirectory)\dump_files.zip"
condition: always()
displayName: 'Create and upload a dotnet process memory dump'
ホストされるエージェントの ETW トレースをキャプチャする
Microsoft がホストするエージェントに関するネットワークの問題のトラブルシューティングを行っている場合、カスタマー サポートから ETW トレースの収集を求められる場合があります。 パイプラインの実行が完了したら、 ETW トレースを含むパイプライン ログをダウンロードできます。
# Add this task to start the ETW trace
- script: netsh trace start scenario=InternetClient capture=yes tracefile=$(Agent.TempDirectory)\networktrace.etl
displayName: 'Start ETW trace'
# Other tasks here
# Add these 2 tasks to stop the trace and upload
# the trace to the pipeline logs
- script: netsh trace stop
displayName: 'Stop ETW trace'
- pwsh: |
Write-Host "##vso[task.uploadfile]$(Agent.TempDirectory)\networktrace.etl"
Write-Host "##vso[task.uploadfile]$(Agent.TempDirectory)\networktrace.cab"
displayName: 'Upload ETW trace logs'
Visual Studio ビルド perfview トレースをキャプチャする
カスタマー サポートから Visual Studio ビルドの perfview トレースの作成を求められた場合は、Visual Studio ビルド ステップの前後に次のタスクをパイプラインに追加します。
パイプラインを実行した後、パイプライン実行の詳細から PerfViewLog アーティファクトをダウンロードし、そのファイルカスタマー サポートを送信できます。
steps:
- task: PowerShell@2 # download the perfview exe
inputs:
targetType: 'inline'
script: |
invoke-webrequest https://github.com/microsoft/perfview/releases/download/v3.1.7/PerfView.exe -OutFile PerfView.exe
- task: PowerShell@2
inputs:
targetType: 'inline' # start perfview to capture the traces before build build task
script: '$(System.DefaultWorkingDirectory)\PerfView.exe "/DataFile:PerfViewData.etl" /accepteula /BufferSizeMB:512 /StackCompression /CircularMB:5000 /Providers:"Microsoft-Windows-IIS" /logfile:"PerfView.log" /zip:true /norundown start'
- task: VSBuild@1
displayName: '$(solution)' # build of the solution, note the msbuildargs might be different for your scenario
inputs:
solution: '$(solution)'
clean: true
msbuildArgs: '/p:DeployOnBuild=true /p:PrecompileBeforePublish=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(Build.ArtifactStagingDirectory)" /p:TransformWebConfigEnabled=false /p:AutoParameterizationWebConfigConnectionStrings=false /p:MarkWebConfigAssistFilesAsExclude=false /p:ProfileTransformWebConfigEnabled=false /p:IsTransformWebConfigDisabled=true'
platform: '$(buildPlatform)'
configuration: '$(buildConfiguration)'
- task: PowerShell@2 # stop the perfview tracing
inputs:
targetType: 'inline'
script: |
$(System.DefaultWorkingDirectory)\perfview.exe /accepteula /logfile:"PerfView.log" stop
- task: PowerShell@2 # abort perfview, it seems required.
inputs:
targetType: 'inline'
script: '$(System.DefaultWorkingDirectory)\perfview.exe /accepteula /logfile:"PerfView.log" abort'
- task: PowerShell@2 # add a sleep of 5 mins, to give it time for required traces to be complete
inputs:
targetType: 'inline'
script: 'Start-Sleep -Seconds 300'
- task: PublishPipelineArtifact@1 # upload the traces
displayName: 'Publish Pipeline Artifact'
inputs:
artifactName: webapp