16

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

是否只有在前一个步骤失败时才执行步骤?

4

4 回答 4

9

Theres no way to setup a step to execute only if a previous one failed.

The closest I've seen to this, is to setup a build that has a "Finish Build" trigger that would always execute after your first build finishes. (Regardless of success or failure).

Then in that second build, you could use the TeamCity REST API to determine if the last execution from the first build was successful or not. If it wasn't successful then you could whatever it is you want to do.

于 2013-10-31T02:04:21.117 回答
6

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

在此处输入图像描述

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

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

在此处输入图像描述

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

}
于 2019-04-08T09:56:38.000 回答
0

另一个解决方案是 Webhooks。

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

于 2019-11-05T09:44:41.723 回答
0

我很惊讶 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
于 2021-07-12T19:53:41.933 回答