【问题标题】:TeamCity job, run step only if a previous one has failed?TeamCity 作业,仅在前一个失败时才运行步骤?
【发布时间】:2021-07-13 03:59:45
【问题描述】:

我们正在使用 TeamCity 7,想知道是否可以仅在前一个步骤失败的情况下运行一个步骤?我们在构建步骤配置中的选项使您可以选择仅在所有步骤都成功(即使步骤失败)时执行,或者始终运行它。

有没有办法只在前一个步骤失败时才执行一个步骤?

【问题讨论】:

  • 我不确定,但也许您需要添加一个构建步骤(powershell、命令行等),它将使用TeamCity REST API 获得最后一次构建的结果,然后执行/不执行您的代码.
  • 有一个功能请求使构建状态可用于构建步骤:youtrack.jetbrains.com/issue/TW-17975(您可以投票)。

标签: teamcity


【解决方案1】:

无法设置仅在前一个步骤失败时才执行的步骤。

我见过的最接近这一点的是设置一个具有“完成构建”触发器的构建,该触发器始终在您的第一个构建完成后执行。 (无论成功或失败)。

然后在第二次构建中,您可以使用 TeamCity REST API 来确定第一次构建的最后一次执行是否成功。如果它没有成功,那么你可以做任何你想做的事情。

【讨论】:

    【解决方案2】:

    作为一种解决方法,可以通过命令行步骤设置一个变量,该步骤仅在成功时运行,稍后可以检查。

    echo "##teamcity[setParameter name='env.BUILD_STATUS' value='SUCCESS']"
    

    然后可以在设置为即使步骤失败也运行的 powershell 步骤中进行查询。

    if($env:BUILD_STATUS -ne "SUCCESS"){
    
    }
    

    【讨论】:

    • 这对我不起作用,因为第一步使用命令行,第二步使用 PowerShell,它不支持在 linux 主机上。如果重写成 bash 的话,无论如何它都不起作用。
    【解决方案3】:

    另一个解决方案是 Webhooks。

    如果构建失败,这个plugin 可以将 webhook 发送到 URL。 在 webhook 端,您可以处理一些操作,例如,发送通知。

    【讨论】:

      【解决方案4】:

      令我惊讶的是,TeamCity 在 2021 年不支持开箱即用。但是 API 为您提供了许多有用的功能,您可以做到

      作为一种解决方案,您需要编写 bash 脚本并在内部调用 TeamCity API

      1. 在 MySettings & Tools 中设置 API 密钥 => 访问令牌
      2. 使用 API 令牌创建环境变量
      3. 使用执行步骤在您的配置中创建一个步骤:即使之前的某些步骤失败
      4. 使用 jq 构建自己的容器或使用任何支持 jq 的现有容器
      5. 放置这个 bash 脚本
          #!/bin/bash
          set -e -x
          
          declare api_response=$(curl -v -H "Authorization: Bearer %env.teamcity_internal_api_key%" -H "Accept: application/json" %teamcity.serverUrl%/app/rest/latest/builds?locator=buildType:%system.teamcity.buildType.id%,running:any,canceled:all,count:2\&fields=build\(id,status\))
          
          declare current_status=`echo ${api_response} | jq '.build[0].status'`
          declare prev_status=`echo ${api_response} | jq '.build[1].status'`
          
          if [ "$current_status" != "$prev_status" ]; then
                  do you code here
          fi
      

      上面代码的一些解释。通过 API 调用,您可以获得当前 buildType 的 2 个最后版本。这是最后一个版本和上一个版本。在您为变量分配状态并在 if 语句中比较它们之后。如果您需要在当前构建失败的情况下运行一些代码,请使用

      if [ "$current_status" = "FAILURE" ]; then
          write your code here
      fi
      

      【讨论】:

        猜你喜欢
        • 2018-12-20
        • 1970-01-01
        • 2020-11-28
        • 2021-11-16
        • 1970-01-01
        • 2020-03-10
        • 1970-01-01
        • 2014-03-24
        • 1970-01-01
        相关资源
        最近更新 更多