次の方法で共有


パイプライン デコレーター式コンテキスト

Azure DevOps Services

パイプライン デコレーター は、実行されるパイプラインに関するコンテキストにアクセスできます。 パイプライン デコレーターの作成者は、このコンテキストを使用してデコレーターの動作に関する決定を行うことができます。 コンテキストで使用できる情報は、パイプラインとリリースで異なります。 また、デコレーターは、タスク名がタスクのグローバル一意識別子 (GUID) に解決された後に実行されます。 デコレーターがタスクを参照する場合は、名前やキーワードではなく GUID を使用する必要があります。

ヒント

Azure DevOps 拡張機能 SDK を使用した拡張機能開発に関する最新のドキュメントを確認してください。

Note

パイプライン デコレーターは、web 拡張機能ビルドするときに使用されます。 これらの例は、YAML パイプラインで動作するようには設計されていません。

リソース

パイプライン リソースは、 resources オブジェクトで使用できます。

リポジトリ

現在、キーは 1 つだけです: repositoriesrepositories は、リポジトリ ID からリポジトリに関する情報へのマップです。

デザイナー ビルドでは、プライマリ リポジトリのエイリアスが __designer_repoされます。 YAML パイプラインでは、プライマリ リポジトリは self と呼ばれます。 リリース パイプラインでは、リポジトリは使用できません。 リリース成果物変数 を使用できます。

たとえば、 self リポジトリの名前を YAML パイプラインに出力するには、次のようにします。

steps:
- script: echo ${{ resources.repositories['self'].name }}

リポジトリには、次のプロパティが含まれています。

resources['repositories']['self'] =
{
	"alias": "self",
	"id": "<repo guid>",
	"type": "Git",
	"version": "<commit hash>",
	"name": "<repo name>",
	"project": "<project guid>",
	"defaultBranch": "<default ref of repo, like 'refs/heads/main'>",
	"ref": "<current pipeline ref, like 'refs/heads/topic'>",
	"versionInfo": {
		"author": "<author of tip commit>",
		"message": "<commit message of tip commit>"
	},
	"checkoutOptions": {}
}

ジョブ

ジョブの詳細は、 job オブジェクトで使用できます。

データは次のようになります。

job = 
{
	"steps": [
		{
			"environment": null,
			"inputs": {
				"script": "echo hi"
			},
			"type": "Task",
			"task": {
				"id": "d9bafed4-0b18-4f58-968d-86655b4d2ce9",
				"name": "CmdLine",
				"version": "2.146.1"
			},
			"condition": null,
			"continueOnError": false,
			"timeoutInMinutes": 0,
			"id": "5c09f0b5-9bc3-401f-8cfb-09c716403f48",
			"name": "CmdLine",
			"displayName": "CmdLine",
			"enabled": true
		}
	]
}

たとえば、タスクがまだ存在しない場合にのみ、条件付きでタスクを追加するには、次のようにします。

- ${{ if not(containsValue(job.steps.*.task.id, 'f3ab91e7-bed6-436a-b651-399a66fe6c2a')) }}:
  - script: echo conditionally inserted

変数

パイプライン変数 も使用できます。

たとえば、パイプラインに myVar という変数がある場合、その値はデコレーターで variables['myVar']として使用できます。

たとえば、デコレーターにオプトアウトを与えるために、変数を探します。 デコレーターをオプトアウトするパイプライン作成者は、この変数を設定でき、デコレーターは挿入されません。 変数が存在しない場合、デコレーターは通常どおりに挿入されます。

my-decorator.yml

- ${{ if ne(variables['skipInjecting'], 'true') }}:
  - script: echo Injected the decorator

その後、組織内のパイプラインで、作成者はデコレーターに自身を挿入しないように要求できます。

pipeline-with-opt-out.yml

variables:
  skipInjecting: true
steps:
- script: echo This is the only step. No decorator is added.

タスク名と GUID

デコレーターは、タスクが既に GUID に変わった後に実行されます。 次の YAML について考えてみましょう。

steps:
- checkout: self
- bash: echo This is the Bash task
- task: PowerShell@2
  inputs:
    targetType: inline
    script: Write-Host This is the PowerShell task

これらの各ステップはタスクにマップされます。 各タスクには一意の GUID があります。 デコレーターを実行する前に、タスク名とキーワードがタスク GUID にマップされます。 デコレーターが別のタスクの存在を確認する場合は、名前やキーワードではなくタスク GUID で検索する必要があります。

通常のタスク ( task キーワードで指定) の場合は、タスクの task.json を調べて、その GUID を確認できます。 前の例の checkoutbash などの特別なキーワードには、次の GUID を使用できます。

Keyword GUID タスク名
checkout 6D15AF64-176C-496D-B583-FD2AE21D4DF4 n/a、メモを参照してください
bash 6C731C3C-3C68-459A-A5C9-BDE6E6595B5B Bash
script D9BAFED4-0B18-4F58-968D-86655B4D2CE9 CmdLine
powershell E213FF0F-5D5C-4791-802D-52EA3E7BE1F1 PowerShell
pwsh E213FF0F-5D5C-4791-802D-52EA3E7BE1F1 PowerShell
publish ECDC45F6-832D-4AD9-B52B-EE49E94659BE PublishPipelineArtifact
download 30f35852-3f7e-4c0c-9a88-e127b4f97211 DownloadPipelineArtifact

タスク名とキーワードが解決されると、前の YAML は次のようになります。

steps:
- task: 6D15AF64-176C-496D-B583-FD2AE21D4DF4@1
  inputs:
    repository: self
- task: 6C731C3C-3C68-459A-A5C9-BDE6E6595B5B@3
  inputs:
    targetType: inline
    script: echo This is the Bash task
- task: E213FF0F-5D5C-4791-802D-52EA3E7BE1F1@2
  inputs:
    targetType: inline
    script: Write-Host This is the PowerShell task

ヒント

これらの GUID はそれぞれ、対応するボックス タスクのtask.jsonで確認できます。 唯一の例外は、エージェントのネイティブ機能である checkoutです。 その GUID は、Azure Pipelines サービスとエージェントに組み込まれています。