更新:私はこれから公開拡張機能を作成しました。
更新: これは Azure DevOps 2019 で機能します。
TFS 2018u1 では、次のように動作します。
Import-Module "Microsoft.TeamFoundation.DistributedTask.Task.Common"
Import-Module "Microsoft.TeamFoundation.DistributedTask.Task.Internal"
Add-Type -Assembly "Microsoft.TeamFoundation.DistributedTask.WebApi"
$VSS = Get-VssConnection -TaskContext $distributedTaskContext
$AgentCli = $VSS.GetClient([Microsoft.TeamFoundation.DistributedTask.WebApi.TaskAgentHttpClient])
$AgentConfig = Get-Content "$Env:AGENT_HOMEDIRECTORY\.agent" -Raw | ConvertFrom-Json
$Agent = $AgentCli.GetAgentAsync($AgentConfig.PoolId, $Env:AGENT_ID, $TRUE, $FALSE, $NULL, $NULL, [System.Threading.CancellationToken]::None).GetAwaiter().GetResult()
if($Agent.UserCapabilities.MyCapability)
{
Write-Host "Got the capability!";
}
で終わる既定の引数の長い文字列はCancellationToken::None
、Powershell 4 との互換性のためのものです。PS4 は値型のメソッド パラメーターの既定値をサポートしていませんが、PS5 はサポートしています。
このスニペットは、エージェント構成ファイルの場所と構造に依存しており、非常に疑わしいことを行っています。これは壊れやすいです。問題は、GetAgentAsync
メソッドがプール ID とエージェント ID の両方を必要とし、前者が環境変数で公開されていないことです。少しハック的ではないアプローチでは、すべてのプールをチェックし、エージェント ID によって適切なプールを見つけます。
$Pools = $AgentCli.GetAgentPoolsAsync($NULL, $NULL, $NULL, $NULL, $NULL, [System.Threading.CancellationToken]::None).GetAwaiter().GetResult()
$Demands = New-Object 'System.Collections.Generic.List[string]'
foreach($Pool in $Pools)
{
$Agent = $AgentCli.GetAgentsAsync($Pool.ID, $Env:AGENT_NAME, $TRUE, $FALSE, $NULL, $Demands, $NULL, [System.Threading.CancellationToken]::None).Result
if($Agent -and $Agent.Id -eq $Env:AGENT_ID)
{
Break
}
}
これは、文書化されていない別の実装の詳細、特にエージェント ID がグローバルに一意であることに依存しています。これはTFS 2018まで続くようですが、誰にもわかりません。
を使用する$distributedTaskContext
と、タスクは人工的なユーザー ID「Project Collection Build Service」(エージェント サービス アカウントではなく) を使用して TFS に接続し直します。各コレクションにはそのようなユーザーが 1 人いて、それらは区別されます。コレクション内のリリースで実行されているタスクがエージェントにユーザー機能のクエリを実行できるようにするには、関連するプール (またはすべてのプール) に対するリーダー ロールを "プロジェクト コレクション ビルド サービス ( TheCollectionName )" というユーザー アカウントに付与する必要があります。 )" そのコレクションから。
また、一部のアクションは、プールに対する暗黙のリーダー ロールをタスク ID に付与するようにも見えます。
または、VssConnection
Windows 資格情報を使用して最初から作成し、エージェント アカウントにプールに対するリーダー ロールを付与することもできます。