Amazon S3 与 S3 兼容存储
TeamCity 配备了 Amazon S3 Artifact Storage 插件,允许在 Amazon S3 桶中以及与 S3 兼容的桶中存储构建工件,比如 MinIO, Backblaze B2 等等。 S3 兼容存储可以在 AWS 和非 AWS 环境中托管。
创建并设置新的 AWS S3 存储
导航至 Administration | <Your_Project> 页面并切换至 Artifacts Storage 标签页。
如果您希望您的新存储对所有 TeamCity 项目可用,打开 <Root project> 的设置。
如果您的新存储只应用于此项目及其子项目,那么可以编辑一个特定的项目。
内置的 TeamCity 工件存储默认显示并标记为活动状态。 点击 添加新储存 按钮以创建新的存储空间。
指定自定义存储名称,如有需要,还可以指定其内部使用的 ID。
将 类型 字段设置为 "AWS S3"。
选择一个现有的 AWS Connection ,TeamCity 应使用它来访问您的 Amazon 资源。 如果没有合适的 AWS 连接存在,请点击 "+" 图标来添加一个。
被选中的 AWS 连接使用的用户凭证(或者它扮演的 IAM 角色)应该具有以下权限以访问 S3 桶:
ListAllMyBuckets获取存储桶位置获取对象ListBucketPutObject删除对象获取加速配置(如果启用了 Transfer Acceleration)
TeamCity 使用选定的 AWS 连接来获取可用的 S3 桶的列表。 打开 存储桶 下拉菜单,从列表中选择一个特定项。
(可选)如果您想要为所有 TeamCity 项目使用相同的 S3 桶,并配置基于前缀的权限,请指定 path prefix。
Amazon S3 存储桶支持两种加速文件上传和下载的选项:
AWS CloudFront—— 这是一个内容分发网络(CDN),允许 TeamCity 使用低延迟的 CloudFront 服务器进行附件的传输。
Transfer Acceleration——一种桶级功能,旨在优化从世界各地到集中式 S3 存储桶的传输速度。 它可以实现您的客户端与 S3 桶之间长距离、快速、便捷且安全的文件传输。
如果您的存储桶配置为使用 Transfer Acceleration 或 CloudFront,请在 加速传输 部分下选择相应的选项。 否则,如果您希望 TeamCity 以常规模式传输文件,请选择 无 类型。

为了优化大文件到存储的 上传 ,您可以启用 多部分上传。 为了实现这一点,请勾选 自定义阈值和部分大小 的设置,并设置多部分上传阈值。 允许的最小值是
5MB。 支持的后缀名:KB、MB、GB、TB。 如果您将此字段留空,则会自动为所有大于 8 MB 的文件启动分段上传(8MB是默认值)。 此外,您可以配置每个上传文件部分的最大允许大小。 最小值为
5MB。 如果留空,TeamCity 将使用8MB作为默认值。
取消选中 强制虚拟主机寻址 选项,以关闭 相应功能 (默认启用)。 目前,TeamCity 支持托管式和路径式的请求。 请注意,自2020年9月以来, Amazon 停止支持路径样式访问新的存储桶。
勾选 上传后验证文件完整性 ,允许 TeamCity 对上传的文件进行额外的 检查。 如果完整性验证失败,TeamCity将在构建日志中写入相应的消息。
点击 Save 以保存您的新存储并返回至可用存储的列表。
当查看项目可用的存储列表时,点击 设为活动开始为该项目的所有新构建使用对应的存储。 has N usages 链接允许您查看哪些构建使用了此存储来上传他们的构建工件。

创建并设置新的 S3 兼容存储
导航至 Administration | <Your_Project> 页面并切换至 Artifacts Storage 标签页。
如果您希望您的新存储对所有 TeamCity 项目可用,打开 <Root project> 的设置。
如果您的新存储只应用于此项目及其子项目,那么可以编辑一个特定的项目。
内置的 TeamCity 工件存储默认显示并标记为活动状态。 点击 添加新储存 按钮以创建新的存储空间。
指定自定义存储名称,如有需要,还可以指定其内部使用的 ID。
将 类型 字段设置为 "Custom S3"。
指定 访问密钥 ID 和 密钥访问密钥 值。 请参阅您的 S3 兼容存储供应商的文档,了解如何发布访问密钥的信息。
指定 TeamCity 应使用的存储端点以访问您的存储桶。
(可选)如果您想要为所有 TeamCity 项目使用相同的 S3 桶,并配置基于前缀的权限,请指定 path prefix。
为了优化大文件到存储的 上传 ,您可以启用 多部分上传。 为了实现这一点,请勾选 自定义阈值和部分大小 的设置,并设置多部分上传阈值。 允许的最小值是
5MB。 支持的后缀名:KB、MB、GB、TB。 如果您将此字段留空,则会自动为所有大于 8 MB 的文件启动分段上传(8MB是默认值)。
此外,您可以配置每个上传文件部分的最大允许大小。 最小值为
5MB。 如果留空,TeamCity 将使用8MB作为默认值。取消选中 强制虚拟主机寻址 选项,以关闭 相应功能 (默认启用)。 目前,TeamCity 支持托管式和路径式的请求。 请注意,自2020年9月以来, Amazon 停止支持路径样式访问新的存储桶。
勾选 上传后验证文件完整性 ,允许 TeamCity 对上传的文件进行额外的 检查。 如果完整性验证失败,TeamCity将在构建日志中写入相应的消息。
点击 Save 以保存您的新存储并返回至可用存储的列表。
当查看项目可用的存储列表时,点击 设为活动开始为该项目的所有新构建使用对应的存储。 has N usages 链接允许您查看哪些构建使用了此存储来上传他们的构建工件。

S3 存储类
Amazon S3 存储类别允许您根据存储的期望性能,以及数据的可用性和弹性进行精细调整。
有两种方式可以启用所需的存储类:
在 TeamCity 端. 当向 S3 桶上传工件时,TeamCity 会在其
x-amz-storage-class请求中添加PUT头。 标头值取决于 TeamCity 中相应的存储设置(例如,x-amz-storage-class: INTELLIGENT_TIERING)。 这种模式在 AWS方面不需要任何额外的设置。虽然目前我们还不支持这种方法,但我们希望在未来的发布周期中实现这个功能。 赞成并评论这个 YouTrack 工单以支持该功能并分享您的反馈: TW-79992。
在 AWS 端. 在此模式下,TeamCity以规定的方式上传工件,预设的生命周期规则在工件上传后应用所需的存储类别。 要设置此规则,请按照以下步骤操作:
打开所需的 S3 存储并切换到 管理层 选项卡。
点击 创建生命周期规则。
在 生命周期规则操作 部分下检查 在存储类别之间移动对象的当前版本。
选择所需的存储类别和上传与转换日期之间的延迟。 将 对象创建后的天数 设置为 "0",以便在 TeamCity 上传工件后立即转换它们。
启用存储的工件的附加规则。 例如,您可以检查 使对象的当前版本过期 以将先前上传的工件标记为已过期,并检查 永久删除对象的非当前版本 以定期清理您的存储。
指定规则范围,以选择其应用于整个存储还是仅应用于符合所需过滤器的那些工件。
在页面底部复查您的规则。 它可能看起来如下:

点击 创建规则 以保存您的生命周期规则。
请参阅以下 AWS 帮助文章以获取更多信息: 使用 Amazon S3 存储类别。
通过 CloudFront 传输工件
Amazon CloudFront 是一个内容分发网络,提供低延迟和高传输速度。 启用其对 S3 存储的支持将允许 TeamCity 通过最近的 CloudFront 服务器传输构建工件。 如果您的 S3 存储桶位于与您的 TeamCity 基础设施不同的区域,这可能会大大加快工件的上传/下载速度,并减少费用。
前提条件
TeamCity 可以为您 设置 CloudFront 集成 ,或者您可以 手动设置所有设置。
CloudFront 集成需要进行配置:
一个 OAI 用户
两个 CloudFront distributions ,一个用于上传和下载工件。
一个 受信任的密钥组
一个 SSH-2 RSA 密钥对 (公钥 + 私钥)以 PEM 格式存储
CloudFront 设置
当您将存储类型切换为 AWS CloudFront 时,会出现四个新设置。
另外,您可以点击
图标,让 TeamCity 自动配置所有四个设置。
为了使 Cloudfront 设置正常工作,TeamCity 需要以下权限:
cloudfront:ListDistributions
cloudfront:ListKeyGroups
cloudfront:ListPublicKeys
自动 CloudFront 设置
TeamCity 可以自动配置设置。 这涉及到:
生成密钥对并上传公钥到 CloudFront。
在 CloudFront 中创建新的密钥组。
创建两个新的分布,具体如下:
使用所有边缘位置 价格类别。
一个新的 Origin Access Identity 可以访问当前的存储桶。
定义的默认行为
将新策略添加到 S3 桶中,以允许新分发访问它。 请查看 policy example。
自动设置需要授予 Teamcity 额外的权限:
cloudfront:CreateDistribution
cloudfront:CreateKeyGroup
cloudfront:CreatePublicKey
cloudfront:CreateOriginRequestPolicy
cloudfront:CreateCloudFrontOriginAccessIdentity
cloudfront:CreateCachePolicy
cloudfront:DeleteKeyGroup
cloudfront:DeletePublicKey
cloudfront:ListCloudFrontOriginAccessIdentities
cloudfront:ListCachePolicies
cloudfront:ListOriginRequestPolicies
cloudfront:GetDistribution
cloudfront:GetPublicKey
s3:GetBucketPolicy
s3:PutBucketPolicy
示例策略提供所有必要的权限:
手动设置 CloudFront
出于安全原因,我们建议配置两个单独的分发,用于上传和下载工件。 对于每个分发版:
生成一对 SSH-2 RSA 密钥格式 的密钥对。
将密钥对中的公钥上传到 CloudFront。
在 CloudFront 中 添加一个新的密钥组 ,并将创建的公钥添加到此组中。
创建一个新的缓存策略,并将 缓存键设置 | 查询字符串 设置为 All。
如果您使用的是私有存储桶,请创建一个新的 OAI 用户。
创建一个分发并将您的密钥组附加到它上:
确保选择与在 TeamCity 中指定的相同的 S3 桶。
允许的 HTTP 方法 用于上传工件
GET、头部、选项、PUT、POST、PATCH、DELETE;用于下载GET、头部、选项。限制查看者访问: 是
受信任的授权类型: 受信任的密钥组
缓存键和源请求: 缓存策略和源请求策略
对于私有存储桶,启用 use OAI 选项并使用以下设置配置 OAI:
存储桶策略: 否,我将更新存储桶策略
对于公共存储桶,请禁用 阻止公共访问 选项。
为您的 S3 桶添加新策略。 参见 策略示例。
当配置后,分发应该自动出现在 下载分发 和 上传分发 的下拉菜单中。
选择目标 CloudFront 分发。
在 Public key 中,选择与此分发相关联的公钥。
点击 Upload private key... 按钮上传配对中的私钥。
保存存储设置。
S3 策略示例
通过 OAI 访问私有存储桶:
访问公共桶时:
Kotlin DSL
以下示例说明了如何将 S3 桶添加为项目工件的自定义存储,并将此存储设置为主存储(默认)。
迁移构件至不同的存储
TeamCity 服务器自带一个 命令行工具 ,用于将构建工件从一个存储转移到另一个存储。 您可以在 项目设置 | 构件存储 页面下载此工具。

当前,该工具支持以下迁移路径:
从本地目录到 Amazon S3 存储桶,反之亦然
从一个 Amazon S3 桶到另一个
我们也在努力支持其他云存储选项。
了解更多: 制品迁移工具。