Azure DevOps パイプラインタスク

  • リリースバージョン: Yokohama
  • 更新日 2025年01月30日
  • 所要時間:30分
  • Azure DevOpsパイプラインでこれらのタスクを使用して、DevOps コンフィグデータモデルを操作します。

    重要:
    Washington DC リリース以降、DevOps コンフィグ は将来の廃止に備えて準備されます。これは非表示になり、新しいインスタンスにはインストールされなくなりますが、引き続きサポートされます。詳細については、Now Support ナレッジベースの「Deprecation Process (廃止プロセス) [KB0867184]」の記事を参照してください。

    これらのタスクは、目標を達成するための特定のパイプライン定義を作成するために提供されています。

    • ServiceNow-DevOps-Config-Agent-Upload-Config

      エージェントジョブを使用して、構成データをデータモデルの展開可能項目にアップロードします。

    • ServiceNow-DevOps-Config-Agent-Get-Snapshot

      アプリケーションのスナップショットを取得します。

    • ServiceNow-DevOps-Config-Agent-Get-Snapshot-Name

      スナップショットの名前を抽出します。

    • ServiceNow-DevOps-Config-Agent-Publish-Snapshot

      構成データのスナップショットを公開します。

    • ServiceNow-DevOps-Config-Agent-Export-Snapshot

      構成データのサブセットをエクスポートします。

    • ServiceNow-DevOps-Config-Agent-Register-Pipeline

      変更セットやスナップショットをパイプライン実行に登録します。

    • ServiceNow-DevOps-Config-Agent-Validate-Snapshot

      組織のポリシーに対して構成データを検証します。

    • ServiceNow-DevOps-Server-Change-Acceleration

      パイプラインの一部として変更要求を作成します。

    ServiceNow-DevOps-Config-Agent-Upload-Config

    アプリケーションデータモデル内の特定の場所に構成ファイルをアップロードするタスク。

    このタスクは、パイプラインの実行中にユーザーがアプリケーションデータモデルにアップロードすることを選択したすべての構成ファイルに対して反復的な性質で使用することを意図しています。
    注:
    事前アップロードされたファイルは、互換性のある形式である必要があります。
    入力変数
    connectedServiceName DevOpsパイプラインエンドポイント接続を指定します。
    applicationName 構成データのアップロード先のアプリケーションを指定します。
    deployableName アプリケーションの展開可能項目を指定します (ターゲットが展開可能な場合は必須)。
    アップロードターゲット 構成データがアップロードされるデータモデルターゲット ( コンポーネントコレクション展開可能項目など) を指定します。
    collectionName (オプション)構成データがアップロードされるコレクションを指定します (ターゲットがコレクションの場合は必須)。
    namePath

    構成データがアップロードされるデータモデルパスを指定します。

    注:
    vars フォルダーにアップロードする場合、変数フォルダーパスを指定するには、名前パスを「vars/」で始める必要があります。
    configFilePath

    データモデルのコンポーネントまたは展開可能パスに構成データがアップロードされるソースフォルダーを指定します。

    空はリポジトリのルートです。ファイルがリポジトリにない場合は、変数を使用します ( 例: $(agent.builddirectory))。

    変換パス (オプション)構成ファイルのディレクトリ構造を (ワークスペースに関して) 保持し、ディレクトリをデータモデル内のパスに変換するかどうかを指定します。デフォルトは false です。
    dataFormat config_fileのデータ形式 ( JSONYAMLXML など) を指定します。
    changesetNumber

    (オプション)このアップロードアクティビティが関連付けられている (オープンな) 変更セットを指定します。指定しない場合、新しい変更セットが作成されます。

    注:
    複数のアップロードシナリオでのみ使用されます。
    自動コミット アップロード後に構成データをコミットするかどうかを指定します (true/false)。デフォルトは false です。
    autoValidate コミット中に構成データを検証するかどうかを指定します (true/false)。デフォルトは true です。
    出力変数
    changesetNumber

    アップロード中に作成/コミットされた変更セットレコード。

    後でパイプラインで使用できるように、タスクに名前を付けます ( componentUpload など)。

    例 - アップロード構成
    
    -task: ServiceNow-DevOps-Config-Agent-Upload-Config
     name: componentUpload​
     inputs:​
       connectedServiceName: 'MyServiceNowInstance'​
       applicationName: 'PaymentDemo'​
       uploadTarget: 'component'​
       namePath: 'wep-api-v1.0'
       configFilePath: 'k8s/helm/values.yml'​
       dataFormat: 'yaml'
       autoCommit: true​
       autoValidate: true​
     
    例 - 複数のアップロード (コンポーネント)
    アップロードタスクを複数回呼び出して、アップロードを 1 つの変更セットの一部に保持しながら、さまざまな場所からさまざまなファイル形式で構成データをアップロードできます。
    • 最初のアップロードで、changesetNumber 出力変数が後続のアップロードで再利用できるように、タスクに名前を付けます。
      YAML ファイルのアップロード:
      
      -task: ServiceNow-DevOps-Config-Agent-Upload-Config​
         name: componentUpload​
         inputs:​ 
           connectedServiceName: 'MyServiceNowInstance'​
           applicationName: 'PaymentDemo'​
           uploadTarget: 'component'​
           namePath: 'wep-api-v1.0'
           configFilePath: 'k8s/helm/values.yml'​
           dataFormat: 'yaml'
           autoCommit: false​
           autoValidate: false​
    • 後続のアップロードでは、最初のアップロードの changesetNumber 出力変数を入力変数として参照します。
      JSON ファイルのアップロード:
      
      -task: ServiceNow-DevOps-Config-Agent-Upload-Config
         inputs:​
           connectedServiceName: 'MyServiceNowInstance'
           applicationName: 'PaymentDemo'
           uploadTarget: 'component'
           namePath: 'wep-api-v1.0'
           configFilePath: 'featureToggles/set1.json'
           dataFormat: 'json'
           autoCommit: true​
           autoValidate: true​
           changesetNumber: '$(componentUpload.changesetNumber)'
    例 - 複数のアップロード (コレクションと変数)
    アップロードタスクを複数回呼び出して、アップロードを 1 つの変更セットの一部に保持しながら、さまざまな場所からさまざまなファイル形式で構成データをアップロードできます。
    • 最初のアップロードでは、changesetNumber 出力変数が後続のアップロードで再利用できるように、タスクに名前を付けてください。
      XML ファイルのアップロード:
      
      -task: ServiceNow-DevOps-Config-Agent-Upload-Config​
         name: componentUpload​
         inputs:​ 
           connectedServiceName: 'MyServiceNowInstance'​
           applicationName: 'PaymentDemo'​
           uploadTarget: 'collection'​
           collectionName: 'release-1.0'​
           namePath: 'v1-common-configs'
           configFilePath: 'infra/v1/config.xml'​
           dataFormat: 'xml'
           autoCommit: false​
           autoValidate: false​
    • 後続のアップロードでは、最初のアップロードの changesetNumber 出力変数を入力として参照します。
      JSON ファイルのアップロード:
      
      -task: ServiceNow-DevOps-Config-Agent-Upload-Config
         inputs:​
           connectedServiceName: 'MyServiceNowInstance'
           applicationName: 'PaymentDemo'
           uploadTarget: 'deployable'
           deployableName: 'Production-EMEA'
           namePath: 'vars/dbSettings'
           configFilePath: 'infra/prodc/dbSettings.json'
           dataFormat: 'json'
           autoCommit: true​
           autoValidate: true​
           changesetNumber: '$(componentUpload.changesetNumber)'
    注:
    変数フォルダーにアップロードするには、uploadTarget を deployable に設定し、deployableName と changesetNumber に正しい値を設定する必要があります。

    ServiceNow-DevOps-Config-Agent-Get-Snapshot

    このタスクは、さまざまなシナリオで使用することを目的としています。
    • 特定のスナップショットを取得します。

      CD フローに従って、特定のスナップショットを取得して公開し、エクスポートしてダウンストリームで使用できます (たとえば、インフラストラクチャやアプリケーションをプロビジョニングする場合など)。

    • 最新の検証済みスナップショットを取得します。

      指定したアプリケーションと展開可能な組み合わせについて、最新の検証済みスナップショットが取得されます。

    • 影響を受ける展開可能項目のすべてのスナップショットを取得します。

      構成ファイルがアプリケーションデータモデルにアップロードされると、アップロードの影響を受けると判断された展開可能項目のスナップショットが作成されます。CI フローに従って、前回の Upload コールで検証が有効になっていたと仮定して、次のステップではスナップショットのリストを反復処理し、すべてが検証に合格したことを確認します。

    • アップロードでスナップショットが生成されない場合に、アプリケーションの展開可能項目の最新のスナップショットを取得します。

      構成変更が行われていない場合、一連の構成データをアプリケーションに展開可能変更セットの組み合わせの環境に展開できます。

    • パイプライン実行でポリシー検証結果を表示します。

      スナップショットを取得するときに、ポリシーの検証結果を ADO ビルドテスト結果ページでテスト結果として表示します (例外への準拠を含む)。

    入力変数
    connectedServiceName DevOpsパイプラインエンドポイント接続 (プロジェクトのサービス接続設定で定義) を指定します。
    applicationName 構成データのアップロード先またはエクスポート元のアプリケーションを指定します。
    deployableName (オプション)最新のスナップショットデータを取得する展開可能項目を (指定したアプリケーションごとに) 指定します。
    changesetNumber (オプション)適用可能な構成変更セットの変更セット ID を指定します。
    isValidated (オプション)合格したスナップショットのみを返すか、例外 (true/false) を伴って渡されたスナップショットのみを返すかを指定します。デフォルトは true です。
    continueWithLatest (オプション)スナップショットが生成されない場合 (true/false) に、applicationName-deployableName-changesetNumber の組み合わせに従って最新のスナップショットを返すかどうかを指定します。デフォルトは false です。
    出力変数
    スナップショットオブジェクト

    要求されたスナップショットを含む JSON オブジェクト。

    後でパイプラインで使用できるように、タスクに名前を付けます ( getSnapshot など)。

    例:特定のスナップショット
    
    -task: ServiceNow-DevOps-Config-Agent-Get-Snapshot
     name: getSnapshot
     inputs:
       connectedServiceName: 'MyServiceNowInstance'
       applicationName: 'PaymentDemo'
       deployableName: 'Production'
       changesetNumber: 'Chset-16'
       isValidated: true
       continueWithLatest: true
    
    例 - 最新の検証済みスナップショット (特定のアプリケーション展開可能な組み合わせ)
    
    -task: ServiceNow-DevOps-Config-Agent-Get-Snapshot
     name: getSnapshot
     inputs:
       connectedServiceName: 'MyServiceNowInstance'
       applicationName: 'PaymentDemo'
       deployableName: 'Production'
       isValidated: true
    
    例 - すべての変更セットスナップショット
    
    -task: ServiceNow-DevOps-Config-Agent-Get-Snapshot
     name: getSnapshot
     inputs:
       connectedServiceName: 'MyServiceNowInstance'
       applicationName: 'PaymentDemo'
       changesetNumber: 'Chset-16'
    
    例:ポリシー検証結果を表示

    ServiceNow-DevOps-Config-Agent-Get-Snapshot タスク中に生成されたスナップショット検証結果を含むファイルのパスに変数を割り当てます。

    スナップショット検証結果をパイプライン実行に読み込むには、変数を入力として使用して、ADO ネイティブの [テスト結果の公開 v2] タスクを活用する必要があります。

    
    stages:
    - stage: Two
      jobs:
        - job: A
    	variables:
          - name: validationResultsPath
            value: 1/TEST_DATA_$(Build.DefinitionName)_$(Build.BuildNumber)_*.xml
          steps:
            - task: PublishTestResults@2
              inputs:
                 testResultsFormat: 'JUnit'
                 testResultsFiles: '$(validationResultsPath)'
                 searchFolder: '$(System.WorkFolder)'
    

    ServiceNow-DevOps-Config-Agent-Get-Snapshot-Name

    このタスクは、特定のスナップショットからスナップショット名を取得するための ServiceNow-DevOps-Config-Agent-Get-Snapshot-Name タスクのフォローアップとして使用されます。ここから、スナップショット名は、スナップショットの公開などのダウンストリームタスクへの入力として使用できます。

    入力変数
    deployableName ServiceNow-DevOps-Config-Agent-Get-Snapshot タスクから返されたスナップショットオブジェクトを取得する展開可能項目を指定します。
    スクリプト スナップショットオブジェクトからスナップショット名を抽出するスクリプトを指定します。
    出力変数
    snapshotName

    展開可能項目のスナップショット名。

    後でパイプラインで使用できるように、タスクに名前を付けます (getSnapshotName など)。

    例 - スナップショット名を取得

    このスクリプトを使用して、 ServiceNow-DevOps-Config-Agent-Get-Snapshot タスクから取得されたスナップショット名を抽出します。

    
    -task: ServiceNow-DevOps-Config-Agent-Get-Snapshot-Name
     inputs:
       deployableName: 'PRD'
       script: |
    	function run() {
            let name;
            let deployableName = process.argv[2];
            let jsonObj = $(getSnapshot.snapshotObjects);
            let size = jsonObj.result.length;
            for(let i=0; i<size; i++) {
             obj = jsonObj.result[i];
             if(obj[“deployable_id.name”].toLowerCase() == deployableName) {
               name = obj.name;
               console.log(name);
              }
             }
            }
            run();
    
    例 - スナップショット名を取得 スナップショットの取得とともに使用

    ServiceNow-DevOps-Config-Agent-Get-Snapshot タスクの直後に ServiceNow-DevOps-Config-Agent-Get-Snapshot-Name タスクを呼び出して、スナップショット名を返します。

    スナップショットを取得 (影響を受けるスナップショットを含む JSON オブジェクトを返します):
    
    -stage: Two​
     jobs:​
        -job: B​
         steps:​
            -task: ServiceNow-DevOps-Config-Agent-Get-Snapshot
             name: getSnapshot​
             inputs:​
                connectedServiceName: 'MyServiceNowInstance'​​
                applicationName: 'PaymentDemo'​
                deployableName: 'Production-2'
                changesetNumber: 'Chset-16'​
    スナップショット名を取得 (特定の展開可能項目のスナップショット名を返します):
    
    -stage: Two​
     jobs:​
        - job: B​
          steps:​
            - task: ServiceNow-DevOps-Config-Agent-Get-Snapshot
              name: getSnapshotName​
              inputs:​
                  deployableName: 'Production-2'
                  script:|​
                  function run() {​
                   let name;​
                   let deployableName = process.argv[2]; ​
                   let jsonObj = $(getSnapshot.snapshotObjects);​
                   let size = jsonObj.result.length;​
                   for(let i=0; i<size ;i++) {​
                    obj = jsonObj.result[i];​
                    if(obj["deployable_id.name"].toLowerCase() == deployableName) {​
                     name = obj.name;​
                     console.log(name); // This standard output of inline script is given as the task output​
                    }​
                   }​
                  }​
                  run();
    
    パイプラインで返されたスナップショット名を使用します (たとえば、公開します)。
    
    -stage: Three​
     jobs:​
        -job: C​
         variables:​
           varSnapshotName: $[stageDependencies.Two.B.outputs['getSnapshotName.snapshotName']]​
         steps:​
            -task: ServiceNow-DevOps-Config-Agent-Publish-Snapshot
             inputs:​
               connectedServiceName: 'MyServiceNowInstance'
               applicationName: 'PaymentDemo'
               deployableName: 'Production-2'
               snapshotName: '$(varSnapshotName)'​

    ServiceNow-DevOps-Config-Agent-Publish-Snapshot

    このタスクは、指定されたアプリケーションと展開可能項目のスナップショットを公開します。ここから、エクスポートプロセスを通じてスナップショットを消費できます。

    入力変数
    connectedServiceName ServiceNowエンドポイント接続を指定します。
    applicationName 公開するアプリケーションを指定します。
    deployableName 構成データを公開するアプリケーションの展開可能項目を指定します。
    snapshotName 公開するスナップショットの名前を指定します。
    出力変数
    適用外です (成功した場合は true を返し、それ以外の場合は false を返します)。
    
    -task: ServiceNow-DevOps-Config-Agent-Publish-Snapshot
     inputs:
       connectedServiceName: 'MyServiceNowInstance'
       applicationName: 'PaymentDemo'
       deployableName: 'Production-2'
       snapshotName: 'Production-v23.dpl'
    

    ServiceNow-DevOps-Config-Agent-Export-Snapshot

    このタスクは、指定されたアプリケーションと展開可能項目のスナップショットをエクスポートします。エクスポートされた構成データのエクスポーター、関連するエクスポーター引数、エクスポート形式 (YAML、JSON など)、および出力場所を指定します。ここから、構成データをパイプラインのダウンストリームにある展開ツールまたはプロビジョニングツールの入力として直接使用できます。

    入力変数
    connectedServiceName ServiceNowエンドポイント接続を指定します。
    applicationName 公開元のアプリケーションを指定します。
    deployableName 構成データのエクスポート元のアプリケーションの展開可能項目を指定します。
    snapshotName 構成データのエクスポート元のスナップショットの名前を指定します。
    exporterName スナップショットに適用するエクスポーター ( UniqueCDI など) を指定します。
    引数 (オプション)エクスポーターとともに使用する引数を指定します。
    エクスポート形式 スナップショットデータをエクスポートする形式 ( INIYAMLPROPS など) を指定します。
    saveFile

    ファイルを Azure リポジトリに保存するかどうかを確認します (true/false)。デフォルトは false です。

    注:
    スクリプトへの適切な権限/OAuth トークンアクセスが必要です。

    それ以外の場合、エクスポートファイルはパイプラインワークスペースディレクトリに作成されます。

    出力変数
    適用外です (成功した場合は true を返し、それ以外の場合は false を返します)。
    
    -task: ServiceNow-DevOps-Config-Agent-Export-Snapshot
     inputs:
       connectedServiceName: 'MyServiceNowInstance'
       applicationName: 'PaymentDemo'
       deployableName: 'Production-2'
       exporterName: 'returnAllData-nowPreview'
       dataFormat: 'yaml'
       args: ''
       snapshotName: 'Production-v23.dpl'
       saveFile: true​
       fileName: 'ExporterOutput/ExportData_$(build.definitionName)_$(build.buildNumber).yaml'
       

    ServiceNow-DevOps-Config-Agent-Register-Pipeline

    このタスクは、変更セットとスナップショットをパイプラインに関連付けて、パイプラインの実行中に追跡できるようにします。DevOps チェンジベロシティでは、これはパイプライン UI に表示されます。

    入力変数
    connectedServiceName DevOpsパイプラインエンドポイント接続を指定します。
    applicationName アプリケーション名を指定します。
    changesetNumber (オプション)パイプライン実行に関連付ける変更セットの ID を指定します。
    snapshotName (オプション)パイプライン実行に関連付けるスナップショットの名前を指定します。
    出力変数
    適用外です (成功した場合は true を返し、それ以外の場合は false を返します)。
    
    -task: ServiceNow-DevOps-Config-Agent-Publish-Snapshot
     inputs:
       connectedServiceName: 'MyServiceNowInstance'
       changesetNumber: 'Changeset-143'
    

    ServiceNow-DevOps-Config-Agent-Validate-Snapshot

    組織のポリシーに対して構成データを検証します。
    入力変数
    connectedServiceName ServiceNowエンドポイント接続を指定します。
    applicationName 検証するアプリケーションを指定します。
    deployableName 検証する展開可能項目を (指定したアプリケーションごとに) 指定します。
    snapshotName (オプション)検証するスナップショットの名前を指定します。
    結果を表示 (オプション)検証結果をコンソールログに表示するように指定します。
    出力変数
    適用外です (成功した場合は true を返し、それ以外の場合は false を返します)。
    
    -task: ServiceNow-DevOps-Config-Agent-Validate-Snapshot
     inputs:
       connectedServiceName: 'MyServiceNowInstance'
       applicationName: 'PaymentDemo'
       deployableName: 'Production-2'
       snapshotName: ''
       showResults: false
    

    ServiceNow-DevOps-Server-Change-Acceleration

    このタスクは、エージェントレス (サーバー) ジョブがAzure DevOpsパイプラインの一部として ServiceNow 変更管理 で変更要求を自動的に作成するために必要です。

    DevOps コンフィグで、同じ変更セットの複数のスナップショットを変更要求に関連付けるには、スナップショット名とアプリケーション名を使用して、特定のアプリケーションサービスの特定の構成データを追跡します。

    DevOps変更の促進機能の詳細については、DevOps変更プロセスの加速を参照してください。

    入力変数 ( DevOps コンフィグ関連)
    connectedServiceName DevOpsパイプラインエンドポイント接続を指定します。
    applicationName 変更要求に添付されているスナップショットに関連付けられているアプリケーション。
    snapshotName 変更要求に添付するスナップショットの名前。
    
    -stage: ChangeRequest
     jobs:
        -job: 'changerequestjob'
         pool: server
         steps:
            -task: ServiceNow-DevOps-Server-Change-Acceleration
             inputs:
                connectedServiceName: 'MyServiceNowInstance'
                applicationName: 'PaymentDemo'
                snapshotName: 'Production-v23.dpl'
    

    YAML パイプラインの例

    trigger:
      branches:
        include:
        - none
    stages:
    - stage: One
      displayName: Upload Configuration Data
      pool:
        vmImage: ubuntu-latest
      jobs:
      - job: A
        displayName: Upload
        steps:
        - task: ServiceNow-DevOps-Config-Agent-Upload-Config@1
          name: componentUpload
          inputs:
            connectedServiceName: 'MyServiceNowInstance'
            applicationName: 'PaymentDemo'
            uploadTarget: 'component'
            configFile: 'k8s/helm/values.yml'
            namePath: 'processor-api-v1.0'
            dataFormat: 'yaml'
            autoValidate: true
            autoCommit: true
            convertPath: true
    - stage: Two
      displayName: Get Latest Snapshot
      pool:
        vmImage: ubuntu-latest
      jobs:
      - job: B
        displayName: Get Snapshot
        variables:
        - name: varChangesetNumber
          value: $[stageDependencies.One.A.outputs['componentUpload.changesetNumber'] ]
        - name: varConfigValidationResults
            value: 1/TEST_DATA_$(Build.DefinitionName)_$(Build.BuildNumber)_*.xml
        steps:
        - task: ServiceNow-DevOps-Config-Agent-Get-Snapshot@1
          name: getSnapshot
          inputs:
            connectedServiceName: 'MyServiceNowInstance'
            applicationName: 'PaymentDemo'
            deployableName: 'Production-EMEA'
            changeSetNumber: '$(varChangesetNumber)'
            continueWithLatest: true
        - task: ServiceNow-DevOps-Config-Agent-Get-Snapshot-Name@1
          name: getSnapshotName
          inputs:
            deployableName: 'Production-EMEA'
            script: "function run() {\n  let name;\n  let deployableName = process.argv[2]; \n  let jsonObj = $(getSnapshot.snapshotObjects);\n  let size = jsonObj.result.length;\n  for(let i=0; i<size ;i++) {\n    obj = jsonObj.result[i];\n    if(obj[\"deployable_id.name\"].toLowerCase() == deployableName) {\n      name = obj.name;\n      console.log(name);   // This standard output of inline script is given as the task output\n    }\n  }\n}\nrun();\n"
        - task: PublishTestResults@2
              inputs:
                 testResultsFormat: ‘JUnit’
                 testResultsFiles: ‘$(varConfigValidationResults)’
                 searchFolder: ‘$(System.WorkFolder)’
        - task: ServiceNow-DevOps-Config-Agent-Register-Pipeline@1
          inputs:
            connectedServiceName: 'MyServiceNowInstance'
            snapshotName: '$(getSnapshotName.snapshotName)'
            applicationName: 'PaymentDemo'
    - stage: Three
      displayName: Publish Snapshot
      pool:
        vmImage: ubuntu-latest
      jobs:
      - job: C
        displayName: Publish
        variables:
        - name: varSnapshotName
          value: $[stageDependencies.Two.B.outputs['getSnapshotName.snapshotName']]
        steps:
        - task: ServiceNow-DevOps-Config-Agent-Publish-Snapshot@1
          inputs:
            connectedServiceName: 'MyServiceNowInstance'
            applicationName: 'PaymentDemo'
            deployableName: 'Production-EMEA'
            snapshotName: '$(varSnapshotName)'
    - stage: ChangeRequest
      dependsOn:
      - Two
      - Three
      jobs:
      - job: 'changerequestjob'
        timeoutInMinutes: 2
        pool:
          name: server
        variables:
        - name: varSnapshotName
          value: $[stageDependencies.Two.B.outputs['getSnapshotName.snapshotName']]
        steps:
        - task: ServiceNow-DevOps-Server-Change-Acceleration@1
          inputs:
            connectedServiceName: 'MyServiceNowInstance'
            applicationName: 'PaymentDemo'
            snapshotName: '$(varSnapshotName)'
    - stage: Four
      displayName: Export Snapshot
      dependsOn:
      - Two
      - Three
      - ChangeRequest
      pool:
        vmImage: ubuntu-latest
      variables:
      - name: varSnapshotName
        value: $[stageDependencies.Two.B.outputs['getSnapshotName.snapshotName']]
      jobs:
      - job: D
        displayName: Export
        steps:
        - task: ServiceNow-DevOps-Config-Agent-Export-Snapshot@1
          inputs:
            connectedServiceName: 'MyServiceNowInstance'
            applicationName: 'PaymentDemo'
            deployableName: 'Production-EMEA'
            exporterName: 'returnAllData-now'
            dataFormat: 'yaml'
            snapshotName: '$(varSnapshotName)'
            saveFile: true
            fileName: 'ExportData_$(build.definitionName)_$(build.buildNumber).yaml'
        - task: CmdLine@2
          inputs:
            script: |
              echo Write your commands here
              echo Hello world
              tree $(Pipeline.Workspace)