在 Azure 管道中,Powershell 如何使任务失败?

In Azure pipeline, how can Powershell make a task fail?

我正在 Windows 自托管代理上使用 Azure Pipelines。 我需要我的管道 运行 一个 PowerShell 脚本,如果脚本成功,下一阶段进行部署,否则任务失败,我们必须修复一些东西并恢复任务

我将描述管道从一开始就做了什么,因为它可能有助于理解。

首先,管道调用一个带有参数的模板:

stages:
  - template: release.yml@templates
    parameters:
      dbConnectionString: ''

模板release.yml@templates 如下:

parameters:
- name: 'dbConnectionString'
  default: ''
  type: string

有第一阶段简单地构建项目,工作正常

stages:
  - stage: Build
      - job: Build_Project
        steps:
          - checkout: none
          - template: build.yml          

第二阶段取决于前一阶段的结果。 对于模板的某些情况,没有要检查的数据库,所以我 运行 作业只提供了一个参数。 然后,我想 运行 仅当 DBCheck 成功或没有参数时才使用 CompareFile 脚本。

  - stage: Deploy
    dependsOn: 
    - Build
    condition: eq( dependencies.Build.result, 'Succeeded' )
    jobs:
    - job: CheckDb
      condition: ne('${{ parameters.dbConnectionString }}', '')
      steps:
        - checkout: none
        - template: validate-db.yml@templates
          parameters:
            ConnectionString: '${{ parameters.dbConnectionString }}'

    - job: CompareFiles
      dependsOn: CheckDb
      condition: or( eq( dependencies.CheckDb.result, 'Succeeded' ), eq('${{ parameters.dbConnectionString }}', '') )
      steps:
        - checkout: none
        - task: PowerShell@2
          name: compareFiles
          inputs:
            targetType: filePath
            filePath: 'compareFile.ps1'

    - deployment: Deploy2
      dependsOn: CompareFiles
      environment: 'Env ST'
      strategy:
           runOnce:
             deploy:
               steps:
                - task: PowerShell@2
                  inputs:
                    targetType: filePath
                    filePath: 'File.ps1'

接下来的工作是比较文件,下面是CompareFile.ps1文件。 文件 compareFileContent.ps1 试图使任务失败或成功,但我对 PowerShell 了解不够。 我在某处发现 $host.SetShouldExit(10) 可能会使任务失败,所以我尝试 10 失败,0 成功, 我也尝试了退出值,但现在,使用 $equal = $true 测试阶段“Deploy2”被跳过,所以我被阻止了

[CmdletBinding()]
param ()

    ***

    $equal = $true

    if($equal) {
        # make pipeline to succeed
        $host.SetShouldExit(0)
    exit 0
    }
    else {
        # make pipeline to fail
        $host.SetShouldExit(10)
    exit 10
    }

您知道为什么跳过部署作业吗?

我能够使用这些退出值来使管道任务成功或失败:

if($equal) {
    # make pipeline to succeed
    exit 0
}
else {
    exit 1
}

我在它自己的阶段而不是在作业中使用了 PowerShell 脚本并且它起作用了,当任务失败时,我可以执行所需的手动操作并再次 运行 任务。

干杯, 克劳德