4

ビルド エージェントが nuget.exe を格納している場所を知ることに依存するビルド ステップを TFS 内に記述しようとしています (標準の nuget-install ステップは、ビルドの実行を中断するような方法で引数の順序をいじくり回します。バッチ/シェル/ps ステップのいずれかを使用して、自分で exe を実行します)。

そのパスを使用してビルド エージェントに機能を設定することは理にかなっているように見えますが、どのビルド手順でも値を参照できないようで、MSDN で役立つ情報が見つかりません。

のようなものになると予想しています$(Env.MyUserCapability)が、値に解決されることはありません。

ビルドステップ内で機能値を取得することはできますか? もしそうなら、どのようにしますか?そうでない場合、実行可能な代替手段は何ですか?

4

2 に答える 2

1

更新:私はこれから公開拡張機能を作成しました

更新: これは 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 に付与するようにも見えます。


または、VssConnectionWindows 資格情報を使用して最初から作成し、エージェント アカウントにプールに対するリーダー ロールを付与することもできます。

于 2018-03-28T16:04:13.810 に答える