S3 部署

此页面记录使用 dpl v1 进行的部署,该版本目前是默认版本。下一个主要版本 dpl v2 将很快发布,我们建议您开始使用它。请查看 我们的博客文章 了解详细信息。 dpl v2 文档可在此处找到

Travis CI 可以在构建成功后自动将您的构建上传到 Amazon S3。

对于最小配置,请将以下内容添加到您的 .travis.yml

deploy:
  provider: s3
  access_key_id: "YOUR AWS ACCESS KEY"
  secret_access_key: "YOUR AWS SECRET KEY"
  bucket: "S3 Bucket"

您可以在 Amazon 控制台中找到您的 AWS 访问密钥。您可能需要使用 Travis CI 命令行对密钥进行加密

travis encrypt --add deploy.secret_access_key

前面的示例几乎肯定不理想,因为您可能希望上传构建的二进制文件和文档。将 skip_cleanup 设置为 true 以防止 Travis CI 删除您的构建工件。

deploy:
  provider: s3
  access_key_id: "YOUR AWS ACCESS KEY"
  secret_access_key: "YOUR AWS SECRET KEY"
  bucket: "S3 Bucket"
  skip_cleanup: true

请注意,部署到 S3 只会将文件添加到您的存储桶,不会删除它们。如果您需要删除已过时的文件,您可以在 Amazon S3 控制台中手动进行操作。

除了将 Amazon S3 配置添加到您的 .travis.yml 中,您还可以运行项目目录中的 Travis CI 命令行进行设置

$ travis setup s3

请记住,上述命令必须在您的项目目录中运行,以便它可以为您修改 .travis.yml

通过选项设置 S3 ACL #

您可以通过 acl 选项设置上传文件的 acl,如下所示

deploy:
  provider: s3
  access_key_id: "YOUR AWS ACCESS KEY"
  secret_access_key: "YOUR AWS SECRET KEY"
  bucket: "S3 Bucket"
  skip_cleanup: true
  acl: public_read

有效的 ACL 值为:privatepublic_readpublic_read_writeauthenticated_readbucket_owner_readbucket_owner_full_control。ACL 默认值为 private

请注意,为了设置 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/*"
        }
    ]
}

请务必根据您的需求设置主体和资源。

使用存储桶策略设置 S3 ACL #

设置工件 ACL 的另一种方法是通过 S3 存储桶策略。

此存储桶策略授予公共读取权限

{
  "Version": "2014-09-25",
  "Statement":[{
    "Sid":"AllowPublicRead",
        "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::"YOUR BUCKET NAME"/*"
      ]
    }
  ]
}

您必须禁用 阻止公共访问 存储桶上的权限,才能使此功能正常工作。因此,避免将敏感信息存储在此 S3 存储桶中更安全。

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
  access_key_id: "YOUR AWS ACCESS KEY"
  secret_access_key: "YOUR AWS SECRET KEY"
  bucket: "S3 Bucket"
  skip_cleanup: true
  region: eu-west-1

部署一个或多个匹配模式的文件 #

要上传匹配特定模式的文件,您可以通过 glob 指令添加模式,如下例所示

deploy:
  provider: s3
  access_key_id: "YOUR AWS ACCESS KEY"
  secret_access_key: "YOUR AWS SECRET KEY"
  bucket: "S3 Bucket"
  glob: "*.txt"

这将匹配当前目录中的所有 .txt 文件。

仅从一个文件夹部署 #

通常,您不想将整个项目上传到 S3。您可以告诉 Travis CI 只将单个文件夹上传到 S3。您可以使用 local_dir 选项来执行此操作。此示例将项目的 build 目录上传到 S3

deploy:
  provider: s3
  access_key_id: "YOUR AWS ACCESS KEY"
  secret_access_key: "YOUR AWS SECRET KEY"
  bucket: "S3 Bucket"
  skip_cleanup: true
  local_dir: build

部署到特定 S3 文件夹 #

通常,您只希望上传到特定 S3 文件夹。您可以使用 upload-dir 选项设置 S3 目标文件夹。此示例上传到 S3 存储桶的 travis-builds 文件夹。

deploy:
  provider: s3
  access_key_id: "YOUR AWS ACCESS KEY"
  secret_access_key: "YOUR AWS SECRET KEY"
  bucket: "S3 Bucket"
  skip_cleanup: true
  upload-dir: travis-builds

部署到 S3 托管的网站: #

要上传到 S3 托管的网站,请使用此模板上传到您的网站。

deploy:
  provider: s3
  access_key_id: "YOUR AWS ACCESS KEY"
  secret_access_key: "YOUR AWS SECRET KEY"
  bucket: "S3 Bucket"
  skip_cleanup: true
  region: "Bucket region"

请记住,您需要将存储桶设置为具有 public 的 ACL,以便任何人都可以查看您的网站。

部署到多个存储桶: #

如果您想上传到多个存储桶,您可以这样做

deploy:
  - provider: s3
    access_key_id: "YOUR AWS ACCESS KEY"
    secret_access_key: "YOUR AWS SECRET KEY"
    bucket: "S3 Bucket"
    skip_cleanup: true
  - provider: s3
    access_key_id: "YOUR AWS ACCESS KEY"
    secret_access_key: "YOUR AWS SECRET KEY"
    bucket: "Second S3 Bucket"
    skip_cleanup: true

条件发布 #

您可以在满足某些条件时才进行部署。请参阅 使用 on: 进行条件发布

在发布前后运行命令 #

有时您想在发布 gem 之前或之后运行命令。您可以使用 before_deployafter_deploy 阶段来实现这一点。这些阶段只有在 Travis CI 实际推送发布时才会触发。

    before_deploy: "echo 'ready?'"
    deploy:
      ..
    after_deploy:
      - ./after_deploy_1.sh
      - ./after_deploy_2.sh

设置 Content-Encoding 标头 #

S3 上传可以选择设置 HTTP 标头 Content-Encoding。此标头允许以压缩形式发送文件,同时保留文件扩展名和关联的 MIME 类型。

要启用此功能,请添加

deploy:
  provider: s3
  ..
  detect_encoding: true # <== default is false

如果文件使用 gzipcompress 进行了压缩,则会使用适当的标头上传它。

Content-Type 标头上设置 charset #

S3 可以接受 content-type 标头。通常情况下,这也并不包含字符集。如果您想添加字符集,请使用您想要的字符集添加 default_text_charset 选项。例如

deploy:
  provider: s3
  ..
  default_text_charset: 'utf-8'  # Default is ''

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"

设置 dot_match 标志以上传以句点开头的文件 #

可以将 S3 上传设置为上传所有以 . 开头的文件

deploy:
  provider: s3
  ..
  dot_match: true

使用与 S3 兼容的对象存储 #

您可以通过设置 endpoint 密钥来使用与 S3 兼容的对象存储(例如 Digital Ocean Spaces)。

deploy:
  provider: s3
  ..
  endpoint: https://nyc3.digitaloceanspaces.com