次の方法で共有


パイプラインで変数とパラメーターを安全に使用する

Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020

変数とパラメーターを安全に利用してパイプライン ユーザーから入力を収集する方法について説明します。 詳細については、次の記事をご覧ください。

シークレット変数には注意してください。 シークレット変数を設定するための推奨される方法は、UI の使用、変数グループの作成、または Azure Key Vault から提供される変数グループの使用です。 詳しくは、「シークレット変数を設定する」をご覧ください。

変数

変数は、ユーザー入力を事前に収集し、パイプラインステップ間のデータ転送を容易にする便利な方法として機能します。 ただし、変数を操作するときは注意が必要です。 既定では、YAML で定義されているかスクリプト化されているかに関係なく、新しく作成された変数は読み取り/書き込みになります。 ダウンストリームの手順では、変数の値が予期せず変更される可能性があります。

たとえば、次のスクリプト スニペットを考えてみましょう。

msbuild.exe myproj.proj -property:Configuration=$(MyConfig)

前の手順で MyConfigDebug & deltree /y c:に設定すると、意図しない結果になる可能性があります。 この例では、ビルド エージェントの内容を削除するだけですが、このような設定の潜在的な危険性が強調されています。

変数を読み取り専用にすることができます。 Build.SourcesDirectory、タスク出力変数、キュー時間変数などのシステム変数は、常に読み取り専用です。 YAML で作成された変数、またはスクリプトによって実行時に作成される変数は、読み取り専用として指定できます。 スクリプトまたはタスクが新しい変数を作成すると、そのログ コマンドで isReadonly=true フラグを渡して、変数を読み取り専用にすることができます。

YAML では、次の特定のキーを使用して読み取り専用変数を指定できます。

variables:
- name: myReadOnlyVar
  value: myValue
  readonly: true

キュー時間変数

Pipelines UI エディターで変数を定義する場合、ユーザーがパイプラインの実行中にその値をオーバーライドできるようにすることができます。 これらの変数はキュー時間変数と呼ばれ、パイプライン UI エディター内で常に定義されます。

キュー時間変数の定義のスクリーンショット。

キュー時間変数は、パイプラインを手動で実行するとエンド ユーザーに公開され、値を変更できます。 キュー時間変数の値を更新するスクリーンショット。

ユーザーは、キューに入れるときに設定された変数を指定するため、パイプラインに対するキュー ビルド構成の編集アクセス許可が必要です。

キュー時に設定できる変数を制限する

パイプラインの実行に使用される UI と REST API は、ユーザーがキュー時に新しい変数を定義するための手段を提供します。

パイプラインを実行する直前にキュー時間変数を追加するスクリーンショット。

Azure Pipelines の初期の頃、この機能には次の問題がありました。

  • これで、ユーザーは定義内のパイプライン作成者によってまだ定義されていない新しい変数を定義できます。
  • ユーザーは、システム変数をオーバーライドすることができました。

これらの問題に対処するために、キューの時刻に設定できる変数を limit する設定を定義しました この設定を有効にすると、"キュー時に設定可能" として明示的にマークされている変数のみを設定できます。 つまり、この設定が有効でない限り、キューの時刻に任意の変数を設定できます。

この設定は、組織レベルとプロジェクト レベルで動作するように設計されています。

  • 組織レベル:
    • この設定をオンにすると、組織内のすべてのプロジェクトのすべてのパイプラインに対して、明示的に "Settable at queue time" としてマークされた変数のみを変更できるようになります。
    • プロジェクト コレクション管理者は、この設定を有効または無効にすることができます。
    • この設定には、 Organization 設定>Pipelines>Settings でアクセスします。 組織レベルで待ち時間に設定できる変数を制限している様子を示すスクリーンショット。
  • プロジェクト レベル:
    • 組織レベルと同様に、この設定を有効にすると、特定のプロジェクト内のすべてのパイプラインに対して、"Settable at queue time" としてマークされた変数のみを変更できます。
    • 組織レベルの設定が有効になっている場合、すべてのプロジェクトに適用され、オフにすることはできません。
    • プロジェクト管理者は、この設定を有効または無効にすることができます。
    • この設定には、 プロジェクトの設定>Pipelines>Settingsでアクセスします。 プロジェクト レベルでキュー時に設定できる変数を制限するスクリーンショット。

次の例は、設定がオンであり、パイプラインでキュー時に設定できない my_variable という名前の変数を定義しています。 クラシック パイプラインで変数を定義するスクリーンショット。

次に、パイプラインを実行するとします。 [変数] パネルには変数が表示されず、[変数の追加] ボタンがありません。

設定がオンになっている変数パネルのスクリーンショット。

Builds - QueueRuns - Run Pipeline REST API 呼び出しを使用して、パイプラインの実行をキューに登録し、my_variableまたは新しい変数の値を設定すると、次のようなエラーが発生して失敗します。

{
  "$id": "1",
  "innerException": null,
  "message": "You can't set the following variables (my_variable). If you want to be able to set these variables, then edit the pipeline and select Settable at queue time on the variables tab of the pipeline editor.",
  "typeName": "Microsoft.Azure.Pipelines.WebApi.PipelineValidationException, Microsoft.Azure.Pipelines.WebApi",
  "typeKey": "PipelineValidationException",
  "errorCode": 0,
  "eventId": 3000
}

パラメーター

変数とは異なり、実行中のパイプラインではパイプライン パラメーターを変更できません。 パラメーターには、 numberstringなどのデータ型があり、特定の値のサブセットに制限できます。 この制限は、パイプラインのユーザーが構成可能な側面で、定義済みのリストからの値のみを受け入れ、パイプラインが任意のデータを受け入れないようにする必要がある場合に重要です。

シェル タスク引数パラメーターの検証を有効にする

パイプラインは、パイプライン内で実行されるタスクを参照できます。 一部のタスクには、タスクのオプションをさらに指定できる arguments パラメーターが含まれています。

有効なシェル タスク引数パラメーターの検証が有効になっている場合、引数パラメーターは、セミコロン、引用符、かっこなどの文字をシェルが正しく実行することを確認するために確認されます。 キュー時に設定できる Limit 変数 オプションと同様に、Settings>Pipelines>Settings の下の組織レベルまたはプロジェクト レベルでシェル タスク引数パラメーターの検証を構成できます。

この機能を有効にすると、 arguments パラメーターに関連する検証の問題によって、次のようなエラー メッセージがトリガーされます。

Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`).

この問題を解決するには、エラー メッセージに示されているように特殊文字をエスケープして引数を調整します。 この検証は、次の特定のタスクの arguments パラメーターに適用されます。

  • PowerShell
  • BatchScript
  • Bash
  • SSH
  • AzureFileCopy
  • WindowsMachineFileCopy

次のステップ