首页 > 解决方案 > Teamcity - 有没有办法在将构建配置分配给代理后选择它?

问题描述

有没有办法在将构建配置从队列中分配给代理后更改它?我希望的工作流程:

change in vcs root -> queue up 'run tests' -> if Agent A, run 'run tests', if Agent B, run 'run tests in Docker'

更多上下文:我有一个我维护的 teamcity 实例,但没有管理员访问权限。这意味着我无法在服务器上安装我需要的东西。我们在某些构建代理服务器上进行了某些安装。我创建了不同版本的“运行测试”构建配置,这样它就可以在所有可用的代理上运行。这是一个相当简单的区别:测试套件使用一个构建配置(在默认代理上)定期运行,并在其他(在其他两个构建服务器上)的 docker 容器中运行。并非所有服务器都安装了 docker。

需要明确的是,这些构建配置彼此不连续——它们是相同的构建配置,但版本不同。我不希望两个作业都监听 vcs 更改 - 因为这将启动两个构建配置。我只是想在运行之前但在队列之后放置一个条件,但是数据流似乎是一种方式(排队作业,然后分配给代理)。

标签: continuous-integrationteamcity

解决方案


您应该能够使用条件构建步骤来实现您所需要的,但我不建议这样做太多,因为该解决方案会有点 hacky:

  1. 将“运行测试”和“在 Docker 中运行测试”这两个构建步骤添加到您的构建配置中。
  2. 为“运行测试”步骤添加条件:如果teamcity.agent.name等于,则执行步骤<dockerless-agent-name>
  3. 为“在 Docker 中运行测试”步骤添加另一个条件:如果teamcity.agent.name 等于,则执行步骤<dockerless-agent-name>
  4. 这是骇人听闻的部分。将 docker步骤强加的隐式代理要求添加到buildAgent.propertiesdockerless 代理的文件中。示例:如果您在“在 Docker 中运行测试”步骤中使用docker wrapper,它将对构建配置施加代理要求。在这种情况下,将该行添加到 dockerless agent 的.docker.server.version existsdocker.server.version=whaterverbuildAgent.properties

TeamCity 会认为没有 docker 的代理可以运行“在 Docker 中运行测试”步骤,并且能够将构建分配给该代理。但如果发生这种情况,将执行“运行测试”步骤而不是“在 Docker 中运行测试”。就是这样。

此外,如果在构建步骤中使用条件时忽略隐式代理要求的功能得到实现,您将能够实现目标而无需破解它buildAgent.properties


推荐阅读