Maven
Maven 构建步骤允许使用 Apache Maven 进行自动化构建。
步骤设置
Maven 构建步骤设置及其对应的 UI 标签因构建配置或流水线的不同配置方式而略有差异。
主要设置
高级设置
构建配置设置
这些设置仅适用于用于 构建配置 中的 Maven 步骤。
- 用户设置选择
允许选择不同类型的用户设置。 此设置等同于添加
-s或--设置命令行实参。 可用选项如下:<默认> — 从代理上的默认 Maven 位置导入用户设置。 另请参阅: Maven 服务器端设置。
<Custom> — 允许指定替代用户设置文件的路径。 该路径在代理和 服务器 上均应有效。
预定义设置 — 允许选择已上传到 TeamCity 服务器上的设置文件之一,位于 项目设置 | Maven 设置 页面。 上传的文件适用于当前项目及其所有子项目,并存储于
<TeamCity 数据目录>/config/projects/%projectID%/pluginData/mavenSettings目录中。 上传的文件既用于代理端,也用于服务器端 Maven 功能。
如果使用了自定义或预定义设置,Maven 进程中会通过
teamcity.maven.userSettings.path系统属性提供实际用户设置文件的路径。- 工件存储库
允许选择以下本地工件存储库选项之一:
每个代理(默认)— 使用单独的仓库在代理系统目录下存储该代理运行的所有构建所生成的工件。
每个构建配置 — 使用单独的仓库来存储当前构建配置的所有构建所生成的工件。
Maven 默认值 — 使用默认 Maven 仓库位置。该仓库在所有构建配置和代理之间共享。 该仓库在机器上的所有构建配置和所有代理间共享。
在该模式下,Maven 步骤使用附加命令行参数
-Dmaven.repo.local中指定的位置。 如果未指定参数,它将在settings.xml中搜索设置的值。
- 增量构建
增量构建的一般思想是只处理已更改的模块,而不浪费时间重新处理与之关联但未更改的模块。 TeamCity 使用此方法仅针对已更改的 Maven 模块运行测试,从而在重新运行构建或构建链时节省时间。
由于 Maven 本身对增量构建的支持非常有限,TeamCity 使用自己的变更影响分析算法来确定受影响模块的集合,并使用一个特殊的预备阶段来制定受影响模块的依赖关系。
首先,TeamCity 执行自身的变更影响分析,考虑到父子关系和不同的依赖范围,并确定受影响的模块。 然后,构建被分为两个顺序的 Maven 执行。
第一个叫做准备阶段的 Maven 执行旨在构建受影响模块的依赖项。 准备阶段的目的是确保在第二次执行过程中,由于依赖类的缺失或不一致,不会出现编译器或其他错误。
第二次 Maven 执行称为主阶段,执行主要目标(例如,
test),因此只执行受更改影响的那些测试。另外,查看有关此主题的相关 博客文章。
容器设置
此构建步骤可在由 Docker 或 Podman 部署的容器中运行。
传统构建配置步骤显示一组属性,允许您指定镜像名称、平台和附加运行参数。 显式拉取镜像 可确保 TeamCity 每次运行此步骤时都从目标容器拉取镜像。

要为 TeamCity 指定拉取镜像的注册表,请将 Docker/Podman 连接 添加到项目中。 默认情况下,此连接允许 TeamCity 以匿名模式从 Docker Hub 拉取镜像,但您可以将其配置为使用任何容器注册表。
有关更多信息,请参阅以下文章: 容器包装器。
启用 在 Docker 中运行 以在容器中运行步骤。 启用后,此元素会显示两个选项。

Docker 镜像 — 允许您从 Docker 或 Podman 注册表中拉取镜像。 默认情况下,TeamCity 可在匿名模式下从 Docker Hub 拉取镜像。 对于其他情况(私有镜像、自定义镜像注册表、非匿名模式以避免违反 Docker Hub 速率限制),请在流水线或作业级别配置 Docker 集成。
Dockerfile — 允许您从 Dockerfile 构建自定义镜像。
Java 参数
- JDK
选择一个 JDK。 本节详述了可用的选项。 默认值为
JAVA_HOME环境变量或代理自身的 Java。- JDK 主目录路径
当上方选择了 <Custom> 时,此选项便可用。使用此字段来指定用于运行构建的自定义 JDK 的路径。 如果该字段为空,则会从代理机器的
JAVA_HOME环境变量或在 构建代理配置 文件(buildAgent.properties)中指定的env.JAVA_HOME属性读取JDK Home的路径。 如果这些值未被指定,TeamCity 将使用构建代理进程本身的 Java home。- JVM 命令行参数
附加的 JVM 命令行参数允许您设置初始和最大堆大小,启用额外的日志记录,选择所需的字节码验证器模式等等。
您可以指定标准的(例如以
-开始,例如-verbose:[class|module|gc|jni]或--dry-run)和非标准的(例如以-X开始,例如-Xmx<size>或-XstartOnFirstThread)JVM 选项。要指定多个命令行参数,使用空格作为分隔符。 例如:
-verbose:gc -Xdiag -Xcomp -Xmx512m -Xms256m
Code Coverage(代码覆盖率)
Maven 构建运行程序支持基于 IDEA 覆盖引擎的代码覆盖率。 要了解如何配置代码覆盖率选项,请参阅 配置 Java 代码覆盖率 页面。
如果您在同一台机器上安装了多个构建代理,默认情况下它们使用相同的本地仓库。 然而,有两种方法可以为每个构建代理分配自定义本地存储库:
在
teamcity-agent/conf/buildAgent.properties中指定以下属性:system.maven.repo.local=%\system.agent.work.dir%/<subdirectory_name>例如,
%system.agent.work.dir%/m2-repository。在不同的用户帐户下运行每一个构建代理。
Maven 发布与不同的 VCSs
要在 TeamCity 支持的不同 VCS 上运行 release:prepare Maven 任务,请确保您使用的至少是 Maven Release 插件 的 2.0 版本。
使用 Maven Release 配合 Perforce
Maven Release 插件需要一个 ticket 才能在 Perforce 中进行身份验证。
在您的 TeamCity 构建配置中的 Perforce VCS root 设置中:
在 Perforce VCS 根设置中启用 使用基于票证的身份验证。
确保您的构建代理环境中没有任何偶尔出现的 P4 变量,这可能会干扰 Maven Release Plugin 的执行。
在 Maven 构建步骤的 Goals 字段中指定
release:prepare,然后运行构建。
使用 Maven Release 配合 Git VCS
要在 Git 中使用此插件,需要在您的 pom.xml 中将 Git SSH URL 设置为 SCM URL。
在 TeamCity 代理上:
确保代理已安装 Git 并已将其添加到 Unix-like OS 的代理的
$PATH,以及 Windows 的% \PATH%环境变量中。在代理上,通过执行设置您的帐户的身份
git config --system user.email "buildserver@example.com" git config --system user.name "TeamCity Server"确保您的 Git VCS 已添加到代理的已知主机数据库中。
在 TeamCity 服务器上:
将 Git SSH key 上传到您的 TeamCity 服务器。
打开 配置设置 ,并导航到 版本控制设置设置选项卡。
启用代理上的检出。
在您的 Git VCS 根目录中,启用 Private Key 认证。
将 SSH Agent 构建功能添加到您的配置中。
在 Maven 构建步骤的 目标 字段中指定
release:prepare并运行构建。
远程运行限制
与 Maven 运行器相关的远程运行限制:
作为一项规定,TeamCity 中的个人构建不会影响在 TeamCity 服务器上运行的任何“常规”构建,而且其结果只对其发起人可见。 然而,如果使用 Maven runner,这种行为可能会有所不同。
TeamCity 不会以任何方式干扰 Maven 依赖模型。 因此,如果您的 Maven 配置将工件部署到远程存储库, 即使您运行个人构建,它们也会被部署到那里。 因此,个人构建可能会影响依赖于您的配置的构建。
例如,您有一个配置A,它将工件部署到远程仓库,而这些工件由配置B使用。 当 A 的个人构建完成后,您的个人构建工件将出现在 B 中。 如果配置A用于生成发布版本的工件,这可能会特别有害,因为正确的工件将被开发者的工件替换,由于Maven的版本控制模型,这将很难进行调查。 另外,这些构建工件不仅会对 TeamCity 管理的依赖构建开放,而且向所有依赖的构建开放。
为了避免这种情况,我们建议不要在执行构建工件部署的构建配置中使用远程运行。
配置即代码
以下代码段展示了以 YAML (仅限流水线)和 Kotlin DSL 格式自定义的构建步骤。
另请参阅: MavenBuildStep Kotlin DSL 文档。