S3 部署
此页面记录了使用下一主要版本 dpl v2 的部署,该版本目前处于 beta 发布阶段。有关详细信息,请参阅 我们的博客文章。当前默认版本为 dpl v1。在此处查看 dpl v1 文档。
请务必阅读 v2 部署概述。
Travis CI 可以在构建成功后自动将您的构建上传到 Amazon S3。
对于最小配置,请将以下内容添加到您的 .travis.yml
中
deploy:
provider: s3
access_key_id: <encrypted access_key_id>
secret_access_key: <encrypted secret_access_key>
bucket: <bucket>
edge: true # opt in to dpl v2
您可以在 Amazon 控制台中找到您的 AWS 访问密钥。
请注意,部署到 S3 仅将文件添加到您的存储桶中,不会删除它们。如果您需要删除过时的文件,可以在 Amazon S3 控制台中手动执行此操作。
状态 #
对 AWS S3 部署的支持 *稳定**。
已知选项 #
使用以下选项进一步配置部署。
access_key_id |
AWS 访问密钥 ID — 必需,秘密,类型:字符串 |
secret_access_key |
AWS 密钥 — 必需,秘密,类型:字符串 |
bucket |
S3 存储桶 — 必需,类型:字符串 |
region |
S3 区域 — 类型:字符串,默认:us-east-1 |
endpoint |
S3 终结点 — 类型:字符串 |
upload_dir |
要上传到的 S3 目录 — 类型:字符串 |
local_dir |
要上传的本地目录 — 类型:字符串,默认:. ,例如:~/travis/build(绝对路径)或 ./build(相对路径) |
glob |
要上传的文件 — 类型:字符串,默认:**/* |
dot_match |
上传以点开头的隐藏文件 — 类型:布尔值 |
acl |
上传对象的访问控制 — 类型:字符串,默认:private ,已知值:private ,public_read ,public_read_write ,authenticated_read ,bucket_owner_read ,bucket_owner_full_control |
detect_encoding |
使用 gzip 和 compress 实用程序压缩的文件的 HTTP 标头 Content-Encoding — 类型:布尔值 |
cache_control |
HTTP 标头 Cache-Control,建议浏览器缓存文件 — 类型:字符串或字符串数组,默认:no-cache ,已知值:/^no-cache.*/ ,/^no-store.*/ ,/^max-age=\d+.*/ ,/^s-maxage=\d+.*/ ,/^no-transform/ ,/^public/ ,/^private/ ,注意:接受映射值到 glob |
expires |
缓存对象过期的日期和时间 — 类型:字符串或字符串数组,格式:/^"?\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} .+"?.*$/ ,注意:接受映射值到 glob |
default_text_charset |
要附加到文本文件内容类型的默认字符集 — 类型:字符串 |
storage_class |
要上传的 S3 存储类别 — 类型:字符串,默认:STANDARD ,已知值:STANDARD ,STANDARD_IA ,REDUCED_REDUNDANCY |
server_side_encryption |
使用 S3 服务器端加密 (SSE-AES256) — 类型:布尔值 |
index_document_suffix |
S3 网站的索引文档后缀 — 类型:字符串 |
overwrite |
是否覆盖现有文件 — 类型:布尔值,默认:true |
force_path_style |
是否强制在路径上保留存储桶名称 — 类型:布尔值 |
max_threads |
用于 S3 文件上传的线程数 — 类型:整数,默认:5 ,最大:15 |
verbose |
详细说明上传文件 — 类型:布尔值 |
共享选项 #
cleanup |
在部署之前清理 Git 工作目录中的构建工件 — 类型:布尔值 |
run |
在部署成功完成后的命令 — 类型:字符串或字符串数组 |
环境变量 #
如果所有选项都以 AWS_
或 S3_
为前缀,则可以作为环境变量提供。
例如,access_key_id
可以作为
AWS_ACCESS_KEY_ID=<access_key_id>
或S3_ACCESS_KEY_ID=<access_key_id>
保护秘密 #
秘密选项值应作为构建配置(.travis.yml
文件)中的加密字符串或存储库设置中的环境变量提供。
环境变量可以在存储库的设置页面上设置,或者使用 travis env set
设置。
travis env set AWS_ACCESS_KEY_ID <access_key_id>
为了在将选项值添加到 .travis.yml
文件时加密它们,请使用 travis encrypt
travis encrypt <access_key_id>
或者使用 --add
直接将其添加到您的 .travis.yml
文件中。请注意,此命令必须在您的存储库的根目录中运行。
travis encrypt --add deploy.access_key_id <access_key_id>
设置 ACL #
您可以通过 acl
选项设置上传文件的 acl,如下所示。
deploy:
provider: s3
acl: public_read
# ⋮
有关有效 ACL 值,请参阅 已知选项。
为了设置 acl
,存储桶的策略必须通过 s3:PutObjectAcl
操作允许此类操作。策略示例可能如下所示。请确保根据您的需求设置主体和资源。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowPublicRead",
"Effect": "Allow",
"Principal": {
"AWS": "PRINCIPAL_ID"
},
"Action": [
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": "arn:aws:s3:::BUCKET_NAME/*"
}
]
}
设置工件 ACL 的另一种方法是通过 S3 存储桶策略。例如,以下策略授予公共读取权限。
{
"Version": "2014-09-25",
"Statement":[{
"Sid":"AllowPublicRead",
"Effect":"Allow",
"Principal": "*",
"Action":["s3:GetObject"],
"Resource":["arn:aws:s3:::"YOUR BUCKET NAME"/*"
]
}
]
}
S3 存储桶区域 #
默认情况下,在部署到 S3 时使用区域 us-east-1
。如果您的存储桶托管在其他区域,则使用默认区域进行部署会导致以下错误。
The bucket you are attempting to access must be addressed using the specified endpoint.
Please send all future requests to this endpoint. (AWS::S3::Errors::PermanentRedirect)
这可以通过使用 region
配置指定存储桶的区域来解决。例如,此示例使用 eu-west-1
区域。
deploy:
provider: s3
# ⋮
region: eu-west-1
仅从一个文件夹部署 #
通常,您不想将整个项目上传到 S3。您可以使用 local_dir
选项仅将单个目录上传到 S3。例如
deploy:
provider: s3
# ⋮
local_dir: ./build
部署到特定 S3 文件夹 #
通常,您只想上传到特定的 S3 文件夹。您可以使用 upload-dir
选项设置 S3 目标文件夹。例如
deploy:
provider: s3
# ⋮
upload-dir: travis-builds
部署到多个存储桶:#
如果您想上传到多个存储桶,请使用多个部署配置。
deploy:
- provider: s3
access_key_id: <access_key_id>
secret_access_key: <secret_access_key>
bucket: "One S3 Bucket"
- provider: s3
access_key_id: <access_key_id>
secret_access_key: <secret_access_key>
bucket: "Another S3 Bucket"
条件发布 #
您只能在满足某些条件时才进行部署。请参阅 使用 on:
进行条件发布。
设置内容编码 #
S3 上传可以选择设置 HTTP 头部 Content-Encoding
。此头部允许文件在压缩的同时保留文件扩展名和关联的 MIME 类型。
要启用此功能,请添加
deploy:
provider: s3
# ⋮
detect_encoding: true
如果文件使用 gzip
或 compress
压缩,它将使用相应的头部上传。
在 content-type 上设置字符集 #
S3 可以接受 content-type 头部。通常这也不包括字符集。如果您想添加字符集,请添加 default_text_charset
选项,并指定您想要的字符集。例如
deploy:
provider: s3
# ⋮
default_text_charset: utf-8
HTTP 缓存控制 #
S3 上传可以选择设置 Cache-Control
和 Expires
HTTP 头部。
设置 HTTP 头部 Cache-Control
以建议浏览器缓存文件。默认值为 no-cache
。有效选项为 no-cache
、no-store
、max-age=<seconds>
、s-maxage=<seconds> no-transform
、public
、private
。
Expires
设置缓存对象不再可缓存的日期和时间。默认情况下不设置。日期必须使用格式 YYYY-MM-DD HH:MM:SS -ZONE
。
deploy:
provider: s3
# ⋮
cache_control: max-age=31536000
expires: "2012-12-21 00:00:00 -0000"
细粒度的 HTTP 缓存控制 #
可以选择在每个文件扩展名基础上设置更细粒度的缓存控制。
以下示例允许缓存图像文件(如 .png、.jpg 或 .webp),而 .html 文件根本不缓存。
deploy:
provider: s3
# ⋮
cache_control: "max-age=31536000: *.jpg, *.gif, *.png, *.webp, *.css, *.js, *.ico"
expires: "Wed, 21 Oct 2015 07:28:00 GMT: *.{jpg,gif,png,webp,css,js,ico}"
或者一个更复杂的示例
deploy:
provider: s3
# ⋮
cache_control: "public, max-age=31536000: *.jpg, *.gif, *.png, *.webp, *.css, *.js, *.ico"
expires: "$(date -u +'%Y-%m-%d %H:%M:%S -0000' --date 'next Year'): *.{jpg,gif,png,webp,css,js,ico}" # for Linux
请注意,给出的示例适用于 Linux。在使用 BSD 版本的 date
的 macOS 上,这将是一个等效的解决方案
date -j -f "%s" $(( $(date -u +"%s") + 365*24*60*60 )) +"%Y-%m-%d %H:%M:%S -0000"
上传以点开头的文件 #
S3 上传可以设置为上传所有以 .
开头的文件。
deploy:
provider: s3
# ⋮
dot_match: true
使用与 S3 兼容的对象存储 #
您可以通过设置 endpoint
键来使用与 S3 兼容的对象存储,例如 Digital Ocean Spaces。
deploy:
provider: s3
# ⋮
endpoint: https://nyc3.digitaloceanspaces.com
拉取请求 #
请注意,拉取请求构建完全跳过部署步骤。