【问题标题】:TFS 2017 - how to fail build when published Tests failTFS 2017 - 发布测试失败时如何构建失败
【发布时间】:2017-12-04 04:35:42
【问题描述】:

我在 TFS 2017 中有一个使用 CI/CD 演示的简单构建过程,如 https://msdn.microsoft.com/en-us/powershell/dsc/dsccicd 中所述

构建定义包含四个步骤:

  • 运行 powershell 脚本。作为脚本的一部分,Pester 测试在代理上运行,结果使用 NUnit 格式保存到文件夹中
  • 使用该文件夹发布测试结果
  • 将文件复制到暂存目录
  • 发布工件

当 Pester 测试失败时,我希望整个构建失败。目前,即使已发布的测试结果显示为失败,构建也会成功(在构建详细信息的问题部分中)。 查看构建定义参数,我看不出如何强制整个构建失败。

【问题讨论】:

    标签: powershell tfs build continuous-integration


    【解决方案1】:

    我没有使用 TFS,但在我的构建过程中,测试失败会通过输出错误触发构建失败。

    这是通过将-PassThru 开关添加到Invoke-Peter 并将命令的结果发送到变量来完成的:

    $TestResults = Invoke-Pester -Path .\Tests -PassThru
    

    如果有任何失败的测试则写一个错误:

    if($TestResults.FailedCount -gt 0)
    {
        Write-Error "Failed '$($TestResults.FailedCount)' tests, build failed"
    }
    

    然后在脚本中使用Invoke-PSake:

    exit ( [int]( -not $psake.build_success ) )
    

    【讨论】:

    • 谢谢你,马克,我已经在做这样的事情了。如果 Pester 测试失败,脚本会向 TFS 返回错误:' Write-Output "##vso[task.logissue type=error]$errorMessage" 。但是,这不会导致整个构建失败。
    • Write-Output 不会触发异常,它只是将文本发送到默认输出流(主机)。将 Write-Output 更改为 Write-Error 并查看是否有帮助(它应该触发异常,同时还将文本发送到主机错误流)。
    • 我已在第 21 行 github.com/PowerShell/Demo_CI/blob/master/InfraDNS/Build.ps1 中将 Write-Output 替换为 Write-error ,不幸的是这无济于事。虽然 UnitTest 失败并在 Build status 中显示为 failed ,但整个 Build 仍然愉快地完成
    • 在我的build.ps1Invoke-psake 之后我也这样做:exit ( [int]( -not $psake.build_success ) )
    【解决方案2】:

    您可以使用Logging Commands 和退出代码使构建任务失败,然后使整个构建失败。

     Write-Error ("Some error")
     exit 1
    

    添加一个powershell任务来捕获发布的Tests日志或状态来判断你是否必须让任务失败。有关如何使 vNext 构建失败的更多详细信息,请参阅此问题:How to fail the build from a PowerShell task in TFS 2015

    【讨论】:

      【解决方案3】:

      VSTS 和 TFS 2017 为当前作业状态设置环境变量。

      所以将 Publish Test Results 任务设置为 Always Run,然后添加以下 PowerShell 任务以使构建失败:

      https://docs.microsoft.com/en-us/vsts/pipelines/build/variables?view=vsts&tabs=batch

          $hasTestFailed = [Environment]::GetEnvironmentVariable("agent.jobstatus")
          if ( $hasTestFailed -ne 'Succeeded')
          {
            exit 666
          }
      

      【讨论】:

        猜你喜欢
        • 2018-03-03
        • 2010-11-28
        • 2018-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-12
        • 2013-05-24
        • 2017-11-15
        相关资源
        最近更新 更多