Azure DevOps tarefas de pipeline

  • Versão de lançamento: Yokohama
  • Atualizado 30 de jan. de 2025
  • 13 min. de leitura
  • Use essas tarefas no pipeline Azure DevOps para interagir com o modelo de dados Configuração de DevOps.

    Importante:
    A partir da versão Washington DC, o Configuração de DevOps está sendo preparado para descontinuação futura. Ele ficará oculto e não será mais instalado em novas instâncias, mas continuará sendo compatível. Para obter detalhes, consulte o artigo Deprecation Process (Processo de descontinuação) [KB0867184] na Base de conhecimento do Now Support.

    Essas tarefas são fornecidas para criar uma definição de pipeline específica para atingir seu objetivo.

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

      Carregar dados de configuração para um implantável no modelo de dados por meio do Trabalho do agente.

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

      Obtenha os snapshots de uma aplicação.

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

      Extraia o nome de um snapshot.

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

      Publique um snapshot dos dados de configuração.

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

      Exporte um subconjunto dos dados de configuração.

    • ServiceNow-DevOps-Config-Agente-Registro-Pipeline

      Registre um changeset e/ou snapshot em uma execução de pipeline.

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

      Valide os dados de configuração em relação às políticas da organização.

    • ServiceNow-DevOps-Servidor-Aceleração-Mudança

      Crie uma solicitação de mudança como parte do pipeline.

    ServiceNow-DevOps-Config-Agent-Upload-Config

    Tarefa para carregar um arquivo de configuração para um determinado local em um modelo de dados da aplicação.

    Esta tarefa deve ser usada de forma iterativa para todos os arquivos de configuração que o usuário escolhe carregar para o modelo de dados da aplicação durante a execução do pipeline.
    Nota:
    Os arquivos pré-carregados devem estar em um formato compatível.
    Variáveis de entrada
    connectServiceName Especifica a DevOps conexão de endpoint do pipeline.
    applicationName Especifica a aplicação para a qual os dados de configuração são carregados.
    implantávelNome Especifica o implantável da aplicação (necessário se o destino for implantável).
    uploadTarget Especifica o destino do modelo de dados para onde os dados de configuração são carregados (por exemplo, componente, coleção, implantável).
    collectionName (Opcional) Especifica a coleção para onde os dados de configuração serão carregados (obrigatório se o destino for uma coleção).
    namePath

    Especifica o caminho do modelo de dados para onde os dados de configuração são carregados.

    Nota:
    Ao carregar para uma pasta de variáveis, você deve iniciar o caminho do nome com "vars/" para especificar o caminho da pasta de variáveis.
    configFilePath

    Especifica a pasta de origem da qual os dados de configuração são carregados para o componente ou caminho implantável no modelo de dados.

    Vazio é a raiz do repositório. Use variáveis se os arquivos não estiverem no repositório (por exemplo, $(agent.builddirectory)).

    convertPath (Opcional) Especifica se a estrutura de diretórios dos arquivos de configuração deve ser preservada (em relação ao espaço) e convertida o diretório em caminhos dentro do modelo de dados. O valor padrão é falso.
    dataFormat Especifica o formato de dados do config_file (por exemplo, JSON, YAML, XMLetc.).
    changesetNumber

    (Opcional) Especifica o changeset (aberto) ao qual esta atividade de upload está associada. Se não for fornecido, um novo changeset será criado.

    Nota:
    Usado somente para vários cenários de upload.
    confirmação automática Especifica se os dados de configuração devem ser confirmados após o upload (verdadeiro/falso). O valor padrão é falso.
    autoValidate Especifica se os dados de configuração devem ser validados durante a confirmação (verdadeiro/falso). O valor padrão é verdadeiro.
    Variável de saída
    changesetNumber

    Registro de changeset criado/confirmado durante o carregamento.

    Forneça um nome para a tarefa para que ela possa ser usada posteriormente no pipeline (por exemplo, componentsUpload).

    Exemplo - Carregar configuração
    
    -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​
     
    Exemplo - Vários uploads (componente)
    Você pode chamar a tarefa de carregamento mais de uma vez para carregar dados de configuração em diferentes formatos de arquivo de locais diferentes, mantendo os carregamentos parte de um conjunto de mudanças.
    • No primeiro carregamento, nomeie a tarefa para que a variável de saída changesetNumber possa ser reutilizada em carregamentos subsequentes.
      Carregamento de arquivo 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​
    • Em carregamentos subsequentes, faça referência à variável de saída changesetNumber do primeiro carregamento como uma variável de entrada.
      Carregamento de arquivo 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)'
    Exemplo - Vários uploads (coleção e variáveis)
    Você pode chamar a tarefa de carregamento mais de uma vez para carregar dados de configuração em diferentes formatos de arquivo de locais diferentes, mantendo os carregamentos parte de um conjunto de mudanças.
    • No primeiro carregamento, certifique-se de nomear a tarefa para que a variável de saída changesetNumber possa ser reutilizada em carregamentos subsequentes.
      Carregamento de arquivo 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​
    • Em carregamentos subsequentes, faça referência à variável de saída changesetNumber do primeiro carregamento como uma entrada.
      Carregamento de arquivo 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)'
    Nota:
    Para carregar em uma pasta de variáveis, uploadTarget deve ser definido como implantávele os valores corretos devem ser definidos para deployableName e changesetNumber.

    ServiceNow-DevOps-Config-Agent-Get-Snapshot

    Esta tarefa deve ser usada em diferentes cenários:
    • Recupere um snapshot específico.

      Seguindo o fluxo de CD, um snapshot específico é recuperado para que possa ser publicado e exportado para ser consumido no downstream (por exemplo, para provisionar infraestrutura ou aplicação).

    • Recupere o snapshot validado mais recente.

      O snapshot validado mais recente é recuperado para a combinação de aplicação-implantável fornecida.

    • Recupere todos os snapshots de todos os implantáveis afetados.

      Quando os arquivos de configuração forem carregados em um modelo de dados da aplicação, o sistema criará snapshots para todos os implantáveis determinados a serem afetados pelo carregamento. Seguindo o fluxo de IC, supondo que a última chamada de upload tenha a validação habilitada, a próxima etapa seria iterar a lista de snapshots e garantir que todos tenham sido aprovados na validação.

    • Recupere os snapshots mais recentes de um implantável de uma aplicação caso um carregamento não gere nenhum snapshot.

      Um conjunto de dados de configuração está disponível para implantação em um ambiente para uma combinação aplicação-implantável-changeset quando nenhuma mudança de configuração é feita.

    • Mostre os resultados da validação de política em uma execução de pipeline.

      Exiba os resultados de validação de política como resultados de testes na página de resultados de testes de compilação do ADO, incluindo conformidade com exceção, ao obter um snapshot.

    Variáveis de entrada
    connectServiceName Especifica a DevOps conexão de endpoint do pipeline (definida nas configurações de conexão de serviço do projeto).
    applicationName Especifica a aplicação para carregar dados de configuração ou de onde os dados serão exportados.
    implantávelNome (Opcional) Especifica o implantável (de acordo com a aplicação especificada) no qual os dados de snapshot mais recentes serão obtidos.
    changesetNumber (Opcional) Especifica o ID do changeset para o conjunto aplicável de mudanças de configuração.
    estáValidado (Opcional) Especifica se devem ser retornados somente snapshots aprovados ou aprovados com exceção (verdadeiro/falso). O valor padrão é verdadeiro.
    continuarComMais Recente (Opcional) Especifica se deve retornar o snapshot mais recente pela combinação applicationName-deployableName-changesetNumber se nenhum snapshot for gerado (verdadeiro/falso). O valor padrão é falso.
    Variável de saída
    snapshotObject

    Um objeto JSON que contém os snapshots solicitados.

    Forneça um nome para a tarefa para que ela possa ser usada posteriormente no pipeline (por exemplo, getSnapshot).

    Exemplo - snapshot específico
    
    -task: ServiceNow-DevOps-Config-Agent-Get-Snapshot
     name: getSnapshot
     inputs:
       connectedServiceName: 'MyServiceNowInstance'
       applicationName: 'PaymentDemo'
       deployableName: 'Production'
       changesetNumber: 'Chset-16'
       isValidated: true
       continueWithLatest: true
    
    Exemplo - Snapshots validados mais recentes (para uma determinada combinação de aplicação-implantável)
    
    -task: ServiceNow-DevOps-Config-Agent-Get-Snapshot
     name: getSnapshot
     inputs:
       connectedServiceName: 'MyServiceNowInstance'
       applicationName: 'PaymentDemo'
       deployableName: 'Production'
       isValidated: true
    
    Exemplo - todos os snapshots do conjunto de mudanças
    
    -task: ServiceNow-DevOps-Config-Agent-Get-Snapshot
     name: getSnapshot
     inputs:
       connectedServiceName: 'MyServiceNowInstance'
       applicationName: 'PaymentDemo'
       changesetNumber: 'Chset-16'
    
    Exemplo - Mostrar resultados de validação de política

    Atribua uma variável ao caminho do arquivo que contém os resultados de validação de snapshot gerados durante a tarefa ServiceNow-DevOps-Config-Agent-Get-Snapshot.

    Para carregar os resultados da validação de snapshot na execução do pipeline, você precisa aproveitar a tarefa Publicar resultados de testes v2nativa do ADO, usando a variável como uma entrada.

    
    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

    Esta tarefa é usada como um acompanhamento da tarefa ServiceNow-DevOps-Config-Agent-Get-Snapshot-Name para obter o nome do snapshot de um snapshot específico. A partir daqui, o nome do snapshot pode ser usado como uma entrada para uma tarefa descendente, como a publicação do snapshot.

    Variáveis de entrada
    implantávelNome Especifica o implantável para obter o objeto de snapshot que foi retornado da tarefa ServiceNow-DevOps-Config-Agent-Get-Snapshot.
    script Especifica o script para extrair o nome do snapshot do objeto de snapshot.
    Variável de saída
    nomeSnapshot

    O nome do snapshot do implantável.

    Forneça um nome para a tarefa para que ela possa ser usada posteriormente no pipeline (por exemplo, getSnapshotName).

    Exemplo - Obter nome do snapshot

    Use este script para extrair o nome do snapshot recuperado da tarefa 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();
    
    Exemplo - Obter nome do snapshot usado com obter snapshot

    Chame a tarefa ServiceNow-DevOps-Config-Agent-Get-Snapshot-Name logo após a tarefa ServiceNow-DevOps-Config-Agent-Get-Snapshot para retornar o nome do snapshot.

    Obter snapshots (retorna um objeto JSON que contém snapshots afetados):
    
    -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'​
    Obter nome do snapshot (retorna o nome do snapshot de um implantável específico):
    
    -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();
    
    Use o nome do snapshot retornado no pipeline (por exemplo, publicar):
    
    -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

    Esta tarefa publica um snapshot para a aplicação e o implantável fornecidos. A partir daqui, o snapshot pode ser consumido por meio do processo de exportação.

    Variáveis de entrada
    connectServiceName Especifica a conexão do endpoint ServiceNow.
    applicationName Especifica a aplicação a ser publicada.
    implantávelNome Especifica o implantável da aplicação para publicar dados de configuração.
    nomeSnapshot Especifica o nome do snapshot a ser publicado.
    Variável de saída
    Não aplicável (retorna verdadeiro se for bem-sucedido, caso contrário, falso).
    Exemplo
    
    -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

    Esta tarefa exporta um snapshot da aplicação e do implantável fornecidos. Especifique o exportador, os argumentos relevantes do exportador, o formato de exportação (por exemplo, YAML, JSON etc.) e o local de saída para os dados de configuração exportados. A partir daqui, os dados de configuração podem ser usados diretamente como uma entrada para uma ferramenta de implantação ou provisionamento descendente no pipeline.

    Variáveis de entrada
    connectServiceName Especifica a conexão do endpoint ServiceNow.
    applicationName Especifica a aplicação da qual publicar.
    implantávelNome Especifica o implantável da aplicação da qual os dados de configuração serão exportados.
    nomeSnapshot Especifica o nome do snapshot do qual os dados de configuração serão exportados.
    exportName Especifica o exportador a ser aplicado ao snapshot (por exemplo, UniqueCDIs).
    args (Opcional) Especifica os argumentos a serem usados junto com o exportador.
    exportarFormato Especifica o formato para exportar os dados do snapshot (por exemplo, INI, YAML, PROPS).
    salvar arquivo

    Verifica se o arquivo deve ser salvo em um repositório do Azure (verdadeiro/falso). O valor padrão é falso.

    Nota:
    A permissão apropriada/token OAuth de acesso ao script é necessária.

    Caso contrário, o arquivo de exportação será criado no diretório do espaço de pipeline.

    Variável de saída
    Não aplicável (retorna verdadeiro se for bem-sucedido, caso contrário, falso).
    Exemplo
    
    -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-Agente-Registro-Pipeline

    Esta tarefa vincula um changeset e um snapshot ao pipeline para que ele possa ser rastreado durante a execução do pipeline. Em Velocidade de mudança para DevOps, isso é mostrado na IU do Pipeline.

    Variáveis de entrada
    connectServiceName Especifica a DevOps conexão de endpoint do pipeline.
    applicationName Especifica o nome da aplicação.
    changesetNumber (Opcional) Especifica o ID do changeset a ser associado à execução do pipeline.
    nomeSnapshot (Opcional) Especifica o nome do snapshot a ser associado à execução do pipeline.
    Variável de saída
    Não aplicável (retorna verdadeiro se for bem-sucedido, caso contrário, falso).
    Exemplo
    
    -task: ServiceNow-DevOps-Config-Agent-Publish-Snapshot
     inputs:
       connectedServiceName: 'MyServiceNowInstance'
       changesetNumber: 'Changeset-143'
    

    ServiceNow-DevOps-Config-Agent-Validate-Snapshot

    Valide os dados de configuração em relação às políticas da sua organização.
    Variáveis de entrada
    connectServiceName Especifica a conexão do endpoint ServiceNow.
    applicationName Especifica a aplicação a ser validada.
    implantávelNome Especifica o implantável (de acordo com a aplicação especificada) a ser validado.
    nomeSnapshot (Opcional) Especifica o nome do snapshot a ser validado.
    mostrarResultados (Opcional) Especifica para mostrar os resultados de validação no log do console.
    Variável de saída
    Não aplicável (retorna verdadeiro se for bem-sucedido, caso contrário, falso).
    Exemplo
    
    -task: ServiceNow-DevOps-Config-Agent-Validate-Snapshot
     inputs:
       connectedServiceName: 'MyServiceNowInstance'
       applicationName: 'PaymentDemo'
       deployableName: 'Production-2'
       snapshotName: ''
       showResults: false
    

    ServiceNow-DevOps-Servidor-Aceleração-Mudança

    Esta tarefa é necessária para que trabalhos sem agente (servidor) criem automaticamente uma solicitação de mudança em ServiceNow Gestão de mudanças como parte do pipeline Azure DevOps.

    Em Configuração de DevOps, para associar vários snapshots do mesmo conjunto de mudanças a uma solicitação de mudança, use o nome do snapshot e o nome da aplicação para rastrear dados de configuração específicos para um determinado serviço de aplicativos.

    Consulte Acelerando seu DevOps processo de mudança para obter mais informações sobre o DevOps recurso de aceleração de mudança.

    Variáveis de entrada (relacionadas a Configuração de DevOps)
    connectServiceName Especifica a DevOps conexão de endpoint do pipeline.
    applicationName Aplicação associada ao snapshot que está sendo anexado à solicitação de mudança.
    nomeSnapshot Nome do snapshot a ser anexado à solicitação de mudança.
    Exemplo
    
    -stage: ChangeRequest
     jobs:
        -job: 'changerequestjob'
         pool: server
         steps:
            -task: ServiceNow-DevOps-Server-Change-Acceleration
             inputs:
                connectedServiceName: 'MyServiceNowInstance'
                applicationName: 'PaymentDemo'
                snapshotName: 'Production-v23.dpl'
    

    Exemplo de pipeline 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)