【问题标题】:How can I clear S3 bucket before travis deploy如何在 travis 部署之前清除 S3 存储桶
【发布时间】:2015-08-28 18:26:06
【问题描述】:

这是我的.travis.yml

deploy:
  provider: s3
  access_key_id: $AWS_ACCESS_KEY
  secret_access_key: $AWS_SECRET_KEY
  bucket: domain.com
  skip_cleanup: true
  acl: public_read
  region: ap-northeast-1
  endpoint: domain.com.s3-website-ap-northeast-1.amazonaws.com
  detect_encoding: true
  on:
    branch: master

但它只是将文件上传到存储桶,而不是同步。 如何同步或清除 S3 存储桶文件?

【问题讨论】:

  • 是的,我对此很感兴趣。自 2015 年 6 月以来有何进展? :D

标签: amazon-web-services amazon-s3 travis-ci


【解决方案1】:

为了解决这个问题,我从 pip 安装了 AWS cli 并执行了部署前脚本。

这是您在 .travis.yml 中需要的:

before_install:
  - pip install --user awscli
  - export PATH=$PATH:$HOME/.local/bin
before_deploy: bin/deploy.sh

您还需要保护您的 .travis.yml 中的两个环境变量,这已由 aws-cli 准备好:

travis encrypt AWS_ACCESS_KEY_ID=YOUR_KEY_HERE --add
travis encrypt AWS_SECRET_ACCESS_KEY=YOUR_SECRET_HERE --add

您的 bin/deploy.sh 应如下所示

#!/bin/sh

echo "Clearing bucket: s3://your-bucket/path/inside/bucket/if/you/want"
aws s3 rm s3://your-bucket/path/inside/bucket/if/you/want --recursive --region eu-central-1

不是我们指定区域,这对于 aws cli 来说似乎是强制性的。

希望这会有所帮助!

【讨论】:

  • 如果您同时运行多个部署目标,请谨慎使用上述脚本,每个部署阶段都会触发一次。
  • 为避免上述情况,您可以将运行部署脚本的指令移动到after_success: "bin/deploy.sh"
【解决方案2】:

更新帮助我找到了解决方案。谢谢!它比 hussfelt 提出的答案更干净。

使用 awscli

由于使用列出的命令需要进行一些研究,因此我将解释如何为找到此帖子的任何其他人更改我的 .travis.yml

before_deploy: pip install --user awscli

首先安装 awscli 以启用与您的 S3 存储桶的同步。要在 Travis 的基于容器的架构上运行,我们不能使用 sudo,因此请使用 --user 安装到主目录。在 Linux 上,这是 Travis 的默认操作系统,使用此选项安装的二进制文件位于 ~/.local/bin/-

deploy:
  provider: script

接下来,使用script 提供程序运行自定义命令作为部署方法。

  script: ~/.local/bin/aws s3 sync dist s3://example.com --region=eu-central-1 --delete

这一行是您的文件已上传。 aws s3 sync 用于在本地机器和存储桶之间同步文件。完整文档可在here 获得。

在我的示例中,dist 是我们要上传到 S3 的构建文件夹。您的构建系统可能将其称为 build 或其他名称。 “example.com”是您的存储桶的名称。需要 region 参数来唯一标识您的存储桶。

这个命令中真正有趣的一点是--delete 开关,它是我们问题的解决方案。设置后,aws 将删除在您的存储桶中找到的所有文件,但不在您的构建目录中。

  skip_cleanup: true
  on:
    branch: master

skip_cleanup 应该被设置,否则您的任何文件都不会被上传。就我个人而言,我喜欢让 Travis 仅部署对 master 的提交,但这里可以进行任何配置。请参阅the docs 了解更多信息。

环境

我们需要提供 aws 我们的 AWS 凭证来授权任何交互。 aws 使用的环境变量是AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY。 hussfelt 写了如何在他们的回答中提供这些。 Travis 文档中也描述了该过程:encryptionAWS specifics

完整解决方案

# Deploy using awscli to enable pruning of removed files
before_deploy: pip install --user awscli
deploy:
  provider: script
  script: ~/.local/bin/aws s3 sync dist s3://example.com --region=eu-central-1 --delete      
  skip_cleanup: true
  on:
    branch: master

【讨论】:

  • 我在 travis 查找 awscli 时遇到了问题,所以我没有使用before_deploy: pip install --user awscli,而是使用了install: pip install awscli,然后是script: aws s3 syn dist.....,它运行良好
【解决方案3】:

谢谢各位, 上面的脚本帮助我构建了对我有用的以下脚本

before_script: - pip install awscli - export PATH=$PATH:$HOME/.local/bin - AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY aws s3 rm s3://$BUCKET --recursive --region=$REGION

【讨论】:

  • 请不要添加“谢谢”作为答案。在网站上投入一些时间,您将获得足够的 privileges 来为您喜欢的答案投票,这是 Stack Overflow 表达谢谢的方式。
【解决方案4】:

只是想补充其他人的答案。很遗憾,我无法发表评论,因为我的声誉很低。

安装 awscli

pip install awsclipip install awscli --user 脚本出现错误。以下是我在 travisCI 安装 awscli 的方法:

before_deploy:
  - pip install awscli --upgrade --user

添加凭据

如果有人还想知道如何添加 aws 凭据,我找到了这个good answer here

  1. 在 travis-ci 仪表板设置中设置您的 ENV 变量 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY。如果设置了这些变量,您的 aws s3 命​​令应该可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 2021-04-30
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    相关资源
    最近更新 更多