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

How to write appspec.yml for Ruby on Rails on AWS CodeDeploy

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

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

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

所以这是我的问题:对于使用 CodeDeploy 部署的所有 Rails 应用程序,这不是有些相同吗?这不应该已经可用,希望由比我更了解他或她正在做什么的人来完成吗?我没有通过 Google 找到太多信息,所以我希望有人能为我提供一些启示。恐怕即使我让它工作,它最终也不会是一个好的、健壮的和生产就绪的 appspec.yml...

已经非常感谢了!

Travis tutorial。这为您提供了一种 step-by-step 设置方法。希望对你有帮助。

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

我搜索了一下,发现以下 post 他们也在使用 NGINX 和 Passenger,它看起来非常像我会采用的方法,我可以看到它们包括之前以及安装脚本后。

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

以防万一post以后不可用这里是关键点:

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

application/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>

application/script/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

application/script/ApplicationStart.sh

#!/bin/sh
sudo service nginx restart

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