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,已知值:privatepublic_readpublic_read_writeauthenticated_readbucket_owner_readbucket_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,已知值:STANDARDSTANDARD_IAREDUCED_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

如果文件使用 gzipcompress 压缩,它将使用相应的头部上传。

在 content-type 上设置字符集 #

S3 可以接受 content-type 头部。通常这也不包括字符集。如果您想添加字符集,请添加 default_text_charset 选项,并指定您想要的字符集。例如

deploy:
  provider: s3
  # ⋮
  default_text_charset: utf-8

HTTP 缓存控制 #

S3 上传可以选择设置 Cache-ControlExpires HTTP 头部。

设置 HTTP 头部 Cache-Control 以建议浏览器缓存文件。默认值为 no-cache。有效选项为 no-cacheno-storemax-age=<seconds>s-maxage=<seconds> no-transformpublicprivate

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

拉取请求 #

请注意,拉取请求构建完全跳过部署步骤。

另请参见 #