如何在 AWS CodeDeploy 上为 Ruby on Rails 编写 appspec.yml

hen*_*eck 3 ruby-on-rails amazon-web-services aws-code-deploy aws-codepipeline

我正在尝试将我的 Rails 应用程序从 Heroku 迁移到 AWS。我让我的 AWS CodePipeline 一直工作到最后一点,为 CodeDeploy 编写 appspec.yml。

这需要我编写 Ubuntu 命令来停止我的应用程序,可能会做一些迁移的事情,然后再次启动应用程序。

这不是我的强项,所以我在这部分有点挣扎。我想我会从执行“rails server”作为“AfterInstall”动作开始。但是后来我打开了一整箱新问题,即 EC2 实例上没有安装 Rails 和 Bundler 等等。当我试图一次只解决一个小问题时,我想知道我是否真的应该编写这个文件从头开始。

所以这是我的问题:对于使用 CodeDeploy 部署的所有 Rails 应用程序,这是否有些相同?难道这不应该已经可用,希望由比我更了解他或她在做什么的人来完成?我没有通过谷歌找到太多东西,所以我希望有人能为我解释一下。我担心即使我让它工作,它最终也不会是一个好的、健壮的和生产就绪的 appspec.yml 无论如何......

已经非常感谢了!

Tho*_*zus 5

听起来您正在尝试直接在 EC2 实例上运行 Rails 服务器,我可能会将 NGINX 与乘客一起使用,因为在部署后重新启动 Rails 应用程序就像运行安装后脚本来触摸 tmp/restart.txt 一样简单导致乘客重新启动应用程序。

我搜索了一下,发现以下帖子中他们也使用了 NGINX 和Passenger,它看起来非常像我会采用的那种方法,我可以看到它们也包含安装前后的脚本。

http://sfviapgh.com/blog/2016/2/18/how-to-deploy-rails-with-aws-codedeploy

以防万一帖子稍后不可用,这里是关键点:

  1. 使用生产服务器所需的一切设置 EC2 实例。在我们的例子中,这是 Ruby、Passenger 和 nginx。您不想提前通过 git 将您的应用程序克隆到服务器,但您需要知道您希望应用程序在服务器上的位置(例如 www/var/...)。确保您知道每个进程将使用哪些用户(克隆代码、重新启动进程)。
  2. 将 AWS CodeDeploy 代理安装到服务器上。
  3. 将 EC2 实例移动到生产应用程序组 AMI。
  4. 在我们的代码库中,我们将以下 bash 脚本添加到我们的 /script 文件夹中。我们的完整脚本稍微复杂一些(从安全的 s3 存储桶中克隆我们的环境变量),但这些将使您有一个良好的开端。CodeDeploy 当前仅挂钩到 GitHub。幸运的是,我们使用 GitHub 来管理我们的代码库。
  5. 在引用这些脚本的应用程序根目录中设置必需的 AWS CodeDeploy appspec.yml(见下文)。

应用程序/appspec.yml

version: 0.0
os: linux
files:
  - source: /
    destination: <the directory your code will live>
permissions:
  - object: <the directory your code will live>
    owner: <user who will deploy your code>
    group: <group that user lives in>
  AfterInstall:
    - location: script/AfterInstall.sh
      runas: <user who will deploy your code>
  ApplicationStart:
    - location: script/ApplicationStart.sh
      runas: <root user>
Run Code Online (Sandbox Code Playgroud)

应用程序/脚本/AfterInstall.sh

#!/bin/bash
cd /var/www/<app location>
RAILS_ENV=production bundle install --path vendor/bundle
RAILS_ENV=production bundle exec rake db:migrate
RAILS_ENV=production bundle exec rake assets:clobber
RAILS_ENV=production bundle exec rake assets:precompile
Run Code Online (Sandbox Code Playgroud)

应用程序/脚本/ApplicationStart.sh

#!/bin/sh
sudo service nginx restart
Run Code Online (Sandbox Code Playgroud)

我希望这对您的部署有所帮助。