Azure DevOps 파이프라인 작업

  • 릴리스 버전: Xanadu
  • 업데이트 날짜 2024년 08월 01일
  • 소요 시간: 28분
  • 파이프라인에서 이러한 작업을 사용하여 데이터 모델과 DevOps 구성 상호 작용합니다Azure DevOps.

    중요사항:
    Washington DC 릴리스부터 DevOps 구성는 향후 사용 중단을 준비 중입니다. 이 항목은 숨겨지고 새 인스턴스에 더 이상 설치되지 않지만 지원은 계속됩니다. 자세한 내용은 Now Support 지식베이스에서 사용 중단 프로세스 [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-변경-가속화

      파이프라인의 일부로 변경 요청을 생성합니다.

    ServiceNow-DevOps-Config-Agent-Upload-Config

    애플리케이션 데이터 모델 내의 지정된 위치에 구성 파일을 업로드하는 작업입니다.

    이 작업은 파이프라인 실행 중에 사용자가 애플리케이션 데이터 모델에 업로드하도록 선택한 모든 구성 파일에 대해 반복적인 특성으로 사용됩니다.
    주:
    사전 업로드된 파일은 호환 가능한 형식이어야 합니다.
    입력 변수
    connectedServiceName 파이프라인 끝점 연결을 지정합니다 DevOps .
    applicationName 구성 데이터가 업로드되는 애플리케이션을 지정합니다.
    'deployableName' 애플리케이션의 배포 가능 항목을 지정합니다(대상이 배포 가능한 경우 필수).
    '업로드타겟' 구성 데이터가 업로드되는 데이터 모델 대상(예: 구성요소, 컬렉션, 배포 가능)을 지정합니다.
    collectionName (선택 사항) 구성 데이터가 업로드될 컬렉션을 지정합니다(대상이 컬렉션인 경우 필수).
    namePath

    구성 데이터가 업로드되는 데이터 모델 경로를 지정합니다.

    주:
    vars 폴더에 업로드할 때 변수 폴더 경로를 지정하려면 이름 경로를 "vars/"로 시작해야 합니다.
    configFilePath

    구성 데이터가 데이터 모델의 구성요소 또는 배포 가능 경로에 업로드되는 소스 폴더를 지정합니다.

    비어 있는 것은 리포지토리의 루트입니다. 파일이 리포지토리에 없는 경우 변수를 사용합니다(예: $(agent.builddirectory)).

    변환 경로 (선택 사항) 작업 공간과 관련하여 구성 파일의 디렉터리 구조를 유지할지 여부를 지정하고 디렉터리를 데이터 모델 내의 경로로 변환할지 여부를 지정합니다. 기본값은 false입니다.
    데이터 포맷 config_file의 데이터 형식(예: JSON,YAML, XML 등)을 지정합니다.
    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​
     
    예 - 다중 업로드(구성요소)
    업로드 작업을 두 번 이상 호출하여 한 변경 집합의 업로드 부분을 유지하면서 다른 위치에서 다른 파일 형식으로 구성 데이터를 업로드할 수 있습니다.
    • 첫 번째 업로드에서 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)'
    예 - 다중 업로드(컬렉션 및 변수)
    업로드 작업을 두 번 이상 호출하여 한 변경 집합의 업로드 부분을 유지하면서 다른 위치에서 다른 파일 형식으로 구성 데이터를 업로드할 수 있습니다.
    • 첫 번째 업로드에서 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 플로우를 따라가면서 마지막 업로드 호출에서 확인이 활성화되었다고 가정하면 다음 단계는 스냅샷 목록을 반복하고 모두 확인을 통과했는지 확인하는 것입니다.

    • 업로드에서 스냅샷이 생성되지 않는 경우 애플리케이션의 배포 가능 항목에 대한 최신 스냅샷을 검색합니다.

      구성이 변경되지 않은 경우 구성 데이터 집합을 애플리케이션-배포 가능-변경 집합 조합의 환경에 배포할 수 있습니다.

    • 정책 확인 표시 결과 파이프라인 실행.

      스냅샷을 가져올 때 ADO 빌드 테스트 결과 페이지에서 정책 유효성 검사 결과를 테스트 결과로 볼 수 있습니다(예외 준수 포함).

    입력 변수
    connectedServiceName 파이프라인 끝점 연결( DevOps 프로젝트의 서비스 연결 설정에 정의됨)을 지정합니다.
    applicationName 구성 데이터를 업로드하거나 데이터를 익스포트할 애플리케이션을 지정합니다.
    'deployableName' (선택 사항) 최신 스냅샷 데이터를 가져올 배포 가능 항목(지정된 애플리케이션당)을 지정합니다.
    changesetNumber (선택 사항) 적용 가능한 구성 변경 세트에 대한 변경 세트 ID를 지정합니다.
    isValidated입니다. (선택 사항) 통과된 스냅샷만 반환할지 또는 예외(True/False)를 제외하고 통과된 스냅샷을 반환할지 여부를 지정합니다. 기본값은 true입니다.
    continueWithLatest (영문) (선택 사항) 스냅샷이 생성되지 않은 경우(true/false) applicationName-deployableName-changesetNumber 조합에 따라 최신 스냅샷을 반환할지 여부를 지정합니다. 기본값은 false입니다.
    출력 변수
    snapshotObject

    요청된 스냅샷을 포함하는 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 게시할 스냅숏의 이름을 지정합니다.
    출력 변수
    해당 사항 없음(성공 시 예 반환, 그렇지 않으면 아니오 반환)
    예제
    
    -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 구성 데이터를 익스포트할 스냅샷의 이름을 지정합니다.
    익스포터 이름 스냅샷에 적용할 익스포터(예: UniqueCDIs)를 지정합니다.
    args (선택 사항) 익스포터와 함께 사용할 인수를 지정합니다.
    내보내기 형식 스냅샷 데이터를 익스포트할 형식(예: INI, YAML, PROPS)을 지정합니다.
    저장 파일

    파일이 Azure 리포지토리에 저장되는지 확인합니다(예/아니오). 기본값은 false입니다.

    주:
    스크립트에 대한 적절한 권한/OAuth 토큰 접근이 필요합니다.

    그렇지 않으면 내보내기 파일이 파이프라인 작업 영역 디렉터리에 만들어집니다.

    출력 변수
    해당 사항 없음(성공 시 예 반환, 그렇지 않으면 아니오 반환)
    예제
    
    -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 (선택 사항) 파이프라인 실행에 연결할 스냅샷의 이름을 지정합니다.
    출력 변수
    해당 사항 없음(성공 시 예 반환, 그렇지 않으면 아니오 반환)
    예제
    
    -task: ServiceNow-DevOps-Config-Agent-Publish-Snapshot
     inputs:
       connectedServiceName: 'MyServiceNowInstance'
       changesetNumber: 'Changeset-143'
    

    ServiceNow-DevOps-Config-Agent-validate-snapshot

    조직 정책에 대해 구성 데이터를 확인합니다.
    입력 변수
    connectedServiceName 끝점 연결을 지정합니다 ServiceNow .
    applicationName 유효성을 검사할 애플리케이션을 지정합니다.
    'deployableName' 유효성을 검사할 배포 가능 항목(지정된 애플리케이션당)을 지정합니다.
    snapshotName (선택 사항) 유효성을 검사할 스냅샷의 이름을 지정합니다.
    쇼결과 (선택 사항) 콘솔 로그에 확인 결과를 표시하도록 지정합니다.
    출력 변수
    해당 사항 없음(성공 시 예 반환, 그렇지 않으면 아니오 반환)
    예제
    
    -task: ServiceNow-DevOps-Config-Agent-Validate-Snapshot
     inputs:
       connectedServiceName: 'MyServiceNowInstance'
       applicationName: 'PaymentDemo'
       deployableName: 'Production-2'
       snapshotName: ''
       showResults: false
    

    ServiceNow-DevOps-Server-변경-가속화

    이 작업은 에이전트 없는(서버) 작업이 파이프라인의 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)