TeamCity On-Premises 2024.03 Help

构件依赖性

这个页面详述了TeamCity 工件依赖项 的配置,允许您将文件从一个构建传递给另一个构建。 例如,典型的 部署构建配置 会发布由其他(生产)配置生成的文件。

制品可以通过如下途径传递:

  • 在同一 Build Chain(构建链) 中,目标配置之前运行的配置。

  • 将不是同一构建链的配置与目标配置分开。

  • 同一配置的先前构建。

使用 Web UI 配置 Artifact 依赖项

要在构建配置中添加一个工件依赖项:

  1. 编辑构建配置时,打开依赖关系页面。

    添加构件依赖
  2. 点击 添加新的构件依赖 并指定以下设置:

    添加工件依赖对话框
    • 依赖于—— 当前构建配置所依赖的构建配置。

    • 从此处获取制品 — 需要获取其制品的构建类型:

      • 最新成功构建 —— 构件将从具有最新修订版本(最新更改ID)的成功依赖构建中获取

      • 最新的 pinned build—— 构件将从最新修订版本(最新的更改ID)的 pinned dependency build 中获取

      • 最新完成的构建:如果构建配置中还设置了快照依赖,那么将从与当前构建具有相同源代码的构建中获取工件

      • 从相同的链中构建 —— 当您拥有一个 snapshot dependency 并希望从具有相同源代码的构建中获取工件时,这个选项很有用

      • 使用指定的构建编号进行构建

      • 具有指定标签的最新完成构建

    • 构建编号—— 这是工件的确切构建编号。 如果您在 从以下位置获取构件 列表中选择了具有特定构建号的构建,那么这个字段就会可用。

    • 构建标签—— 该标签表示将要使用其构建成果的构建。 在解决依赖关系时,TeamCity 将寻找带有给定标签的最后一次成功构建,并使用其构建工件。 如果您在 从中获取工件 列表中选择了具有特定标签的最后一个完成的构建,那么这个字段就会出现。

    • 构建分支过滤器 — 允许设置一个 分支过滤器,只限制源构建在匹配的分支中。 如果未指定,将使用默认分支。 如果依赖项在 VCS 根设置中指定了 分支,则该字段将显示。

    • Artifacts Rules—— 指定哪些文件和文件夹应该被下载,以及他们应该被存储在哪里的字符串表达式。 参阅此部分以获取更多信息:构建工件规则

    • 在下载工件之前清理目标路径 — 勾选此选项,将在复制工件之前删除目标目录的内容。 它将被应用于所有包含的规则。

  3. 点击 Save 来添加您的新依赖项。

在任何时候,您都可以使用 自定义构建依赖项 来启动构建。

构建工件规则

构建工件规则指定了应下载源构建的哪些工件,以及应将它们存储在代理存储的何处。

每个单独的工件规则都应该从新的一行开始,并且有以下语法:

[+:|-:|?:]SourcePath[!ArchivePath][=>DestinationPath]

规则的顺序并不重要。 对于每个构建工件,将应用最具体的规则(在第一个通配符符号之前前缀最长的那个)。

前缀

  • +: 前缀指定了一个强制包含的构件依赖。 这是默认的前缀,意味着所有没有前缀的规则都被视为包容性的( +:mylib.dllmylib.dll 规则是相同的)。

  • -: 前缀允许您从下载或解包中排除特定文件。 例如,如果您希望将目录作为构建依赖项传递的内容中包含一些对构建无关的文件,您可以遍历所有必要的文件并使用 +:directory/file 语法将它们包含进来,或者添加整个目录( +:目录 )并排除一些被忽略的文件( -:directory / junkfile)。

  • ?: 前缀允许您创建可选的包含依赖项。 如果构建无法获取在 +:... 规则中引用的工件,此构建将以 "无法解析工件依赖" 的消息失败。 《ph id="inline-2" />规则允许您运行依赖性构建(在构建日志中会打印出未找到所需构件的警告)。 您可以使用 ?: 前缀来标记独立文件( ? :/myfile.txt )和来自 档案 的文件( ?:dist.zip!myfile.txt )为可选。 请参考以下示例获取更多信息:可选依赖项

源路径

SourcePath 应相对于 "source" 构建的 artifacts 目录。 路径可以指定特定的文件,目录,或使用通配符匹配多个文件。 支持Ant-like 通配符

下载的工件将保持以第一个 *? 通配符开始的 "source" 目录结构。

档案路径

ArchivePath 用于提取下载的 压缩 制品。 zip7zipjartartar.gz 都是受支持的。

ArchivePath 遵循 SourcePath 的一般规则:允许使用像蚂蚁一样的通配符,匹配到的存档内的文件将被放置在与第一个通配符匹配的目录中(相对于目标路径)。 例如, release.zip!*.dll 规则会提取位于 release.zip 工件根目录中的所有 .dll 文件。

目标路径

DestinationPath 指定了代理上下载的工件应放置的目标目录。 如果路径是相对的(这是推荐的做法),它将根据构建检出目录进行解析。 如果需要,可以在下载工件之前清理目标目录。 如果目标路径为空,那么构建工件将直接下载到检出根目录。

排除性(以 -: 前缀开头)规则中,目标路径将被忽略。

示例

从目标目录下载所有文件

要将所有文件从源构建的目标 a/b 目录复制到依赖构建的 lib 目录,需要添加 a/b/**=>lib 规则。 复制的文件保留其源层次结构。 例如,托管在子目录中的 a/b/c/file.txt 文件将被放置到 lib/c/file.txt 文件夹中。

下载所有符合模式的文件

通配符允许您指定一次匹配多个文件的模式。 例如, **/*.txt=>lib 规则将所有文本文件下载到代理的 lib 目录。

请注意,规则会保留原始目录结构。 例如, a/b/c/file.txt 文件将被存储为 lib/a/b/c/file.txt

从压缩包中提取文件

在构件规则的 档案路径 部分,您可以指定依赖构建应从目标存档下载哪些文件。

  • a.zip!**=>destination 规则将整个存档解包到 目标 库。 该存档按原样解压,保留了子文件夹的内部层次结构。

  • release-*.zip!*.dll=>dlls 规则会从所有匹配 release-*.zip 模式的归档文件中提取 *.dll 库,并将这些库保存到 dlls 目录。

  • a.zip!a/b/c/**/*.dll=>dlls 规则会从 a/b/c 及其子目录中提取所有的 .dll 文件,然后放入 dlls 目录中。 符合此规则的文件将被存储,且不带有 a/b/c 路径。

排除无关文件

使用 -: 前缀开始一个构建规则,告诉 TeamCity 应该不下载与此模式匹配的文件或文件集,以便依赖构建。

  • 以下两条规则将导致从所有目录中下载所有文本文件,除了位于 目录中的 exclude.txt 文件。 下载的文件将保存到 文本 文件夹中。

    **/*.txt=>texts -:bad/exclude.txt
  • 以下一组规则用于查找所有以 发布 开始的归档文件,解压其 .dll 库,并将它们保存到 dlls 目录。 来自 release-0.0.1.zip 归档的 Bad.dll 文件已被跳过。

    +:release-*.zip!**/*.dll=>dlls -:release-0.0.1.zip!Bad.dll
  • 以下组合会将所有工件下载到 目标 目录。 依赖构建将完全忽略 excl 目录,除了 excl/must_have.txt 文件。

    **/*.*=>target -:excl/**/*.* +:excl/must_have.txt=>target

下载隐藏的构件

放置在 .teamcity 目录下的工件被视为 隐藏。 默认情况下,这些工件会被通配符忽略。如果您想要为了任何目的包含来自 .teamcity 目录的文件,一定要明确添加以 .teamcity 开始的工件路径,例如:

  • .teamcity/properties/*.properties

  • .teamcity/*.*

可选依赖项

以下 Kotlin DSL 代码演示了生成 output.txt 工件文件的配置。

import jetbrains.buildServer.configs.kotlin.* import jetbrains.buildServer.configs.kotlin.buildSteps.script object ConfigA : BuildType({ name = "ConfigA" artifactRules = "+:output.txt" steps { script { id = "simpleRunner" scriptContent = """ touch output.txt echo "Config A running..." > output.txt """.trimIndent() } } })

依赖的构建配置在其自身脚本中使用此 output.txt 文件。 然而,脚本中的 如果 ... 否则 语句允许在目标文件丢失的情况下采取另一种行动方案。

import jetbrains.buildServer.configs.kotlin.* import jetbrains.buildServer.configs.kotlin.buildSteps.script object ConfigB : BuildType({ name = "ConfigB" vcs { cleanCheckout = true } steps { script { id = "simpleRunner" scriptContent = """ FILE=output.txt if [ ! -f ${'$'}FILE ] then echo "No source file exists" else cat ${'$'}FILE fi """.trimIndent() } } dependencies { dependency(ConfigA) { snapshot { reuseBuilds = ReuseBuilds.NO } artifacts { artifactRules = "?:output.txt" } } } })

?:output.txt 依赖性确保了即使找不到目标文件,依赖构建也可以开始。 如果发生这种情况,构建日志将包含相应的警告。

可选依赖警告

下载 Artifacts 到代理主目录

默认情况下,构件只能下载到 代理工作目录,下载到 代理主目录 是禁止的。 要覆盖默认设置,通过指定逗号分隔的路径在 buildAgent.properties 中设置自定义规则来下载制品: teamcity.artifactDependenciesResolution.bannedListteamcity.artifactDependenciesResolution.allowedList。 将路径添加到禁止列表中会禁止向此目录下载工件,除非它出现在允许列表中。

使用 Ant 构建脚本配置 Artifact 依赖项

这一部分描述了如何在构建脚本中下载 TeamCity 构建工件。 这些指令也可以用于从 TeamCity 外部下载工件。

为了处理构建之间的工件依赖性,这个解决方案比在 TeamCity UI 中配置依赖性更复杂,但允许更大的灵活性。 例如,以这种方式管理依赖关系将允许您启动个人构建,并验证您的构建是否仍然与依赖关系兼容。

通过 Ant 构建脚本配置依赖项:

1. 下载 Ivy。

2. 将 Ivy 添加到您的构建的类路径中。

3. 创建一个包含有关 TeamCity 仓库部分元数据的 ivyconf.xml 文件。 这个文件应包含以下内容:

<ivysettings> <property name='ivy.checksums' value=''/> <caches defaultCache="${teamcity.build.tempDir}/.ivy/cache"/> <statuses>     <status name='integration' integration='true'/> </statuses> <resolvers>     <url name='teamcity-rep' alwaysCheckExactRevision='yes' checkmodified='true'>         <ivy pattern='http://YOUR_TEAMCITY_HOST_NAME/httpAuth/repository/download/[module]/[revision]/teamcity-ivy.xml' />         <artifact pattern='http://YOUR_TEAMCITY_HOST_NAME/httpAuth/repository/download/[module]/[revision]/[artifact](.[ext])' />     </url> </resolvers> <modules>     <module organisation='.*' name='.*' matcher='regexp' resolver='teamcity-rep' /> </modules> </ivysettings>

4. 将 YOUR_TEAMCITY_HOST_NAME 替换为您的 TeamCity 服务器的主机名称。

5. 将 ivyconf.xml 放置在您的 build.xml 将要运行的目录中。

6. 在同一目录中创建 ivy.xml 文件,定义需要下载哪些构件并将它们放在哪里,例如:

<ivy-module version="1.3"> <info organisation="YOUR_ORGANIZATION" module="YOUR_MODULE"/> <dependencies> <dependency org="org" name="BUILD_TYPE_EXT_ID" rev="BUILD_REVISION"> <include name="ARTIFACT_FILE_NAME_WITHOUT_EXTENSION" ext="ARTIFACT_FILE_NAME_EXTENSION" matcher="exactOrRegexp"/> </dependency> </dependencies> </ivy-module>

where:

  • 您的组织 替换为您的组织名称。

  • YOUR_MODULE 请用您计划或模块的名称替换,那里将会使用到文物。

  • BUILD_TYPE_EXT_ID 用构建配置的 external ID 替换,这是被下载的构件。

  • BUILD_REVISION 可以是编译号,也可以是以下字符串之一: * latest.lastFinished

    • latest.lastSuccessful

    • latest.lastPinned

  • TAG_NAME.tcbuildtag - 最后一个用 TAG_NAME 标签标记的构建

  • ARTIFACT_FILE_NAME_WITHOUT_EXTENSION 艺术品的文件名或正则表达式,不包括扩展名部分。

  • ARTIFACT_FILE_NAME_EXTENSION 文件名中的扩展部分。

7. 修改您的 build.xml 文件并添加用于下载工件的任务,例如(适用于 Ant 1.6 及以后版本):

<target name="fetchArtifacts" description="Retrieves artifacts for TeamCity" xmlns:ivy="antlib:org.apache.ivy.ant"> <taskdef uri="antlib:org.apache.ivy.ant" resource="org/apache/ivy/ant/antlib.xml"/> <classpath> <pathelement location="${basedir}/lib/ivy-2.0.jar"/> <pathelement location="${basedir}/lib/commons-httpclient-3.0.1.jar"/> <pathelement location="${basedir}/lib/commons-logging.jar"/> <pathelement location="${basedir}/lib/commons-codec-1.3.jar"/> </classpath> </taskdef> <ivy:configure file="${basedir}/ivyconf.xml" /> <!--<ivy:cleancache />--> <ivy:retrieve pattern="${basedir}/[artifact].[ext]"/> </target>

制品库受到基础身份验证的保护。 为了访问这些工件,您需要为 <ivy:configure/> 任务提供凭证。 例如:

<ivy:configure file="${basedir}/ivyconf.xml" host="TEAMCITY_HOST" realm="TeamCity" username="USER_ID" passwd="PASSWORD"/>

在这里 TEAMCITY_HOST 是您的 TeamCity 服务器的主机名或 IP 地址(不包括端口和 servlet 上下文)。
作为 用户ID/密码 ,您可以使用常规 TeamCity 用户的用户名 / 密码(该用户应具有相应的权限访问源构建配置的构件)或系统属性 teamcity.auth.userId/teamcity.auth.password

构建级别的认证

系统属性 teamcity.auth.userIdteamcity.auth.password 自动存储生成的独特构建值,这些值可以用于在 TeamCity 服务器上进行认证。 这些数值仅在构建运行期间有效。 此生成的用户拥有有限的权限,允许进行与构建相关的操作。 用户的主要意图是使用身份验证在构建脚本中从其他 TeamCity 构建下载工件。

使用属性优于使用真实用户凭证,因为它允许服务器跟踪您的构建下载的工件。 如果构建配置的工件依赖性或者使用提供的属性下载了工件,那么构建所使用的特定工件将会在 依赖性 标签页中显示,该标签页位于 构建结果 页面上。 此外,用于获取制品的构建,可以配置不同的 清理 逻辑。

最后修改日期: 16日 7月 2024年