在Github Push后将静态网站部署到S3的最佳策略是什么?

31

我想要自动部署我们的网站到 AWS S3 上。我已经编写了一个 node 脚本来自动构建和上传网站,但是我希望每当我们的仓库的 master 分支在 GitHub 上更新时,脚本可以自动运行。

我调查了 AWS CodeDeploy,但是它似乎只用于特定地部署到 EC2 上。我还看了看 AWS Lambda,但是似乎没有明确的方法使用 git 来拉取仓库副本以便运行脚本。

有没有任何服务(最好与 AWS 相关)可以使用?

8个回答

12
我之前也有同样的目标,现在发布了一个小工具,至少对我来说解决了这个问题。它使用 AWS Lambda 并在 push 后将存储库的特定分支部署到 S3。您可以充分利用 GitHub 部署密钥,该密钥与个人访问令牌相比权限更少,并且可以为每个存储库进行配置。
请看一下github-bucket,它可能也能帮助您。

github-s3-deploy-architecture


10

如果您不想直接使用AWS服务(正如您所说,它们几乎都需要更复杂的设置,例如部署到EC2等),那么您最好使用诸如ShippableCodeshipWercker之类的CI提供商。

这些提供商都具备从git更新触发、运行构建命令、向CI镜像/容器安装实用程序以及将文件复制到S3的能力。

可能有一些初创公司为您的目的构建了一个精确的工具,但它们还没有出现在我的视野中 :-)


9

我知道这不是git部署... 但是,我没有设置CI服务器,而是使用了s3cmd。

http://s3tools.org/s3cmd

执行此命令将我的构建目录与S3同步。

s3cmd sync -r ~/code/mysite/build s3://www.mysite.com --delete-removed

我正在Linux上使用它。不确定它们在OSX和Windows上的情况。
如果你真的想要一个git push解决方案,你可以设置一个定时任务,将你的git repo拉到一个文件夹中,然后对其执行此操作。我在一台廉价的Linux VM上做了这个。除非你要全面实施CI,否则可能没有太大的意义。

这可以添加到git post-commit钩子中,它会执行。 - Zlatko
是的,好主意。我突然想到,随着最近宣布Windows将能够运行Linux二进制文件,s3cmd也可能在Windows上运行!太酷了。https://blogs.windows.com/buildingapps/2016/03/30/run-bash-on-ubuntu-on-windows/ - Damien Sawyer

7
你可以通过非常简单的两步CodePipeline来设置这个。基本上,只需要在AWS控制台中填写不同部分。不需要单独使用CI工具及其带来的复杂性。
在管道的第一步中,从Github拉取并存储到S3中。你可以通过AWS控制台轻松设置这个。
在接下来的CodeDeploy步骤中,你可以使用AWS CLI(已预安装在CodeDeploy中)来执行操作。
cd /path/to/public/directory && aws s3 sync --acl public-read --delete . s3://your.bucket.name

您需要在部署步骤中设置AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY的环境变量,以便AWS CLI可以运行。这也可以在CodeDeploy的AWS控制台中完成,在“高级”部分下的“环境变量”中进行设置。一旦环境变量被设置并且该AWS用户拥有正确的权限,您就可以在CodeDeploy内运行任何aws-cli命令。
完成以上步骤后,当您提交到Github时,CodePipeline将启动,几分钟后您的文件将出现在S3上。

在您的CodePipeline向导中,它会要求您提供源。Github是其中一个受支持的源,因此请选择Github作为您的源。您需要设置Github身份验证,以便您的CodePipeline具有读取您的Github帐户的权限(如果它是私有存储库),但这一切都是通过控制台完成的。第一次我做这个时,我没有任何问题,所有步骤都非常清晰明了。 - Patrick Chu
我可以将代码输入,但无法将S3设置为输出。 - LC1983
1
你需要编写构建脚本以在CodeDeploy上运行。如果你只想将文件复制到S3,那么你的构建脚本将只是我回答中显示的单行脚本。 - Patrick Chu
谢谢,听起来很有趣 - 我已经开始用Lambda从头编写一些东西,但CodePipeline/CodeDeploy听起来更好。你能给我链接一个教程,告诉我如何设置这个,因为我不知道在哪里放置你建议的代码行,也不知道在哪里指定环境变量。 - LC1983
1
你好。实际上,你甚至不需要使用管道来进行复制。唯一需要的是一个构建项目,应该在CodeDeploy中创建。你可以在那里链接你的GitHub账户,并在附加配置中指定每当你的存储库更改时要运行构建。需要创建@PatrickChu所说的2个环境变量,在BuildSpec部分中,你应该选择“使用构建命令”。在我的情况下,我使用了这个命令:aws s3 sync --acl public-read --delete . s3://MY-BUCKET-NAME-HERE。我之前在S3中创建了一个新的Bucket,我的数据被放置在那里。 - Ruben
显示剩余2条评论

6
如果您正在使用TravisCI,部署非常简单。您只需要在您的.travis.yml文件中添加以下内容即可:
deploy:                         
  provider: s3                         
  access_key_id: "YOUR AWS ACCESS KEY"
  secret_access_key:
    secure: "w/DlbHt1+IAMENCRYPTED"
  bucket: "YOUR BUCKET"

我的博客文章解释了所有AWS方面的细节(用户设置,IAM和S3存储桶配置)以及github和travisCI方面。 查看我的博客文章

1
也许对于您简单的使用情况来说有些过于强大了,但您可以创建一个非常简单的 CodePipeline 来将您的 GitHub 存储库推送到 S3。

在 CodePipeline 中如何选择 S3 作为输出? - LC1983
请看我上面的回答。您需要在CodePipeline(或CodeDeploy)中编写一行代码,将所有内容移动到S3中。 - Patrick Chu

0
我也建议使用Codeship,它简单易用,但您需要创建具有适当权限(即策略)的IAM用户以访问S3存储桶。
Codeship的基本计划是免费的。
目前我看到的问题可能在于,Codeship不会像在GitHub中一样删除文件,毕竟S3不是GitHub repo。但无论如何,大量的GitHub更新操作对于putObject来说已经足够好了。

尚未证实此方法是否有效,但据说:如果您使用 aws s3 sync 命令并添加 --delete 参数(布尔值),则在同步过程中会删除目标位置存在但源位置不存在的文件。来源:http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html - Nigel

0

我以前使用过Deploy Bot,感觉还不错。

它可以通过Git推送到S3甚至FTP,还可以运行您的构建脚本,甚至为您推送Slack通知。

https://deploybot.com/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接