如何在TeamCity中设置代理要求以检测应用程序是否已安装?

9
我有一个带有多个代理的构建环境。 我想在我的构建中设置代理需求,以检测是否安装了某些软件。在某些情况下,我可以查看env.Path以获取特定字符串。但有些软件不会修改Path。
我意识到,在安装软件后,我可以编辑BuildAgent.properties文件来设置特定属性,但我希望它更加自动化。
具体实例是,我有一个使用MSDeploy部署网站的构建,但如果没有安装MSDeploy,则无法正常工作。如何在我的构建中指定需要安装了MSDeploy的代理?
3个回答

4
您可以构建一个简单的代理插件。以下是一些建议:
  • 扩展AgentLifeCycleAdapter并实现agentInitialized方法
  • agentInitialized方法中实现检测所需应用程序的逻辑(例如,基于某些文件存在性)
  • 使用agent.getConfiguration().addConfigurationParameter()向服务器报告代理参数

如果您的检测逻辑可以通过文件监视来实现,即使不重新启动代理,也可以使用FileWatcher监视特定文件并报告基于它们的参数。


哇...为了这么常见的任务而如此复杂?太遗憾了。 - Imi

3
据我所知,代理要求的工作方式仅通过验证代理参数中存在或设置的值来实现。就像你所说的那样,这需要手动或以某种自动化方式编辑<agent home>/conf/buildAgent.properties配置文件。
在自动化方面,您可以采用编写构建配置作为代理引导程序的方法;即在所有代理上运行的构建(定时过夜/手动触发)并根据代理上的某些条件在<agent home>/conf/buildAgent.properties文件中维护构建代理参数。类似于(伪代码): if [ exists /path/to/MSDeploy ] then echo MSDeployExists to buildAgent.properties 这带有一个很大的免责声明;我自己还没有尝试过这个,而且我认为基于对此文件的更改,代理将自动重新启动,因此可能存在自动编辑该文件的问题。但这是一种在集中管理您的要求的潜在解决方案,如果可行,则非常好。我使用类似的方法将自定义构建脚本引导到所有代理,以增强TeamCity已经丰富的功能集。

3
我同意SteveChapman的回答。很明显,您可以测试环境变量(存在、包含、以...开头等)。TeamCity知道代理上安装的.NET版本(以及Visual Studio和VS SDK)。但是,我找不到任何相当于“testpath”功能的东西。
要确定的确切方法是通过/conf/buildAgent.properties配置文件添加代理参数。

必须重新启动代理程序才能使更改生效,但它运行得非常好。谢谢。 - TinyRacoon
刚刚看到这个内容:“代理程序正在运行时文件可以被编辑: 代理程序侦测到更改并在(如果有)完成运行构建后自动重启以加载新的设置。”来自链接,所以完全不需要重新启动机器。 - TinyRacoon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接