如何从Travis-CI部署Rails应用到Heroku?

18

在travis-ci成功构建后,有没有任何方式可以部署一个Heroku Rails应用程序?


我刚刚看了一下,似乎可以编写一个脚本来安装Heroku gem,然后再编写另一个脚本,在成功登录后执行git push heroku master。关于具体细节我不太清楚,只是猜测这是可能的。 - Ismael
1
没错!但是如何在Travis-CI上处理SSH密钥? - danielgatis
1
我认为以下的答案之一值得被采纳,@danielgatis。我使用了@Odi和@Marius Butuc的答案中的信息来实现我的持续部署。我在这里补充一下,因为我使用需要在application.rb中设置config.assets.initialize_on_precompile = true的gems,所以我通常需要在手动部署到Heroku之前预编译资产。运行$ heroku labs:enable user-env-compile -a YOUR_HEROKU_APP后,我不需要在我的**.travis.yml**中运行rake assets:precompile。我只希望Heroku能够保留这个功能。 - Paul Fioravanti
另外,为了其他人的参考,如果您正在运行测试套件并且只想在测试套件通过(而不是失败)时部署到Heroku,请将上面的after_script更改为下面答案中的after_success - Paul Fioravanti
4个回答

9

5

我刚刚在我的应用程序中实现了这个案例。 实际上并不难做,但需要一些步骤:

  1. 您需要您的Heroku API密钥
  2. 查看此Gist以获取示例.travis.yml和获取travis_deployer.rb脚本
  3. 然后安装travis gem,请参见另一个问题的答案,以了解如何保护您的API密钥
    • 如果您不关心,只需使用上面的Gist中的示例即可。
    • 运行travis encrypt your_username/your_repo HEROKU_API_KEY=<your key here>
    • 将结果复制到您的.travis.yml中的env ->全局部分

travis_deployer.rb文件负责Heroku的ssh密钥和远程分支。

如果您完成了所有这些步骤,您的.travis.yml可能如下所示:

env:
  global:
    - secure: "1u21hjnmHjkghduUIJhhs76saljlkajdlfhGhgdJgfaVtgasfLLmNBnb87dad="

after_success:
  - gem install heroku
  - yes | ruby travis_deployer.rb
  - heroku keys:clear
  - yes | heroku keys:add
  - git push heroku master

你应该将 after_script 更改为 after_success,否则可能会部署损坏的代码。 - Ivan
最终我使用了这个except,而不是执行keys:clear,我在结尾添加了以下内容: - for i in $(grep '[^\ ]*$' ~/.ssh/id_rsa.pub -o); do heroku keys:remove $i;done这将简单地删除新添加的密钥,而不会影响其他内容。这意味着如果您在本地开发中使用此帐户,则无需为每次部署添加密钥。 - Ryan

2

我在Mark Bates的博客上找到了一个版本。它类似于Odi的版本,只是它仅依赖于您.travis.yml文件中的after_script部分。

  1. First of all, use Travis' feature to encrypt environment variables so your secret API keys remain protected:

    gem install travis
    travis encrypt username/repository HEROKU_API_KEY=YOUR_HEROKU_API_KEY
    
  2. Then append the following to your .travis.yml file:

    env:
      global:
        - secure: YOUR_SECURED_HEROKU_API_KEY
    after_script:
      # Install the Heroku gem (or the Heroku toolbelt)
      - gem install heroku
      # Add your Heroku git repo:
      - git remote add heroku git@heroku.com:YOUR_HEROKU_APP.git
      # Turn off warnings about SSH keys:
      - echo "Host heroku.com" >> ~/.ssh/config
      - echo "   StrictHostKeyChecking no" >> ~/.ssh/config
      - echo "   CheckHostIP no" >> ~/.ssh/config
      - echo "   UserKnownHostsFile=/dev/null" >> ~/.ssh/config
      # Clear your current Heroku SSH keys:
      - heroku keys:clear
      # Add a new SSH key to Heroku
      - yes | heroku keys:add
      # Push to Heroku!
      - yes | git push heroku master
    
  3. And you're done: commit your new changes and enjoy deploying to Heroku via TravisCI.


编辑:如果你在使用travis encrypt命令时遇到任何错误,这可能是解决方案


我该怎么做来提供构建所需的内容?当Travis解析我的.travis.yml并到达heroku keys:clear时,我看到以下代码,但不知道如何提供电子邮件。`heroku-cli:正在安装CLI... 22.44MB / 22.44MB输入您的Heroku凭据。电子邮件:` - Afolabi Olaoluwa

0

我之前就考虑过这种情况,尽管我没有特别考虑Heroku作为首选平台。不管怎样,这是我想出来的方案:

  1. 拉取请求发送到"development"分支
  2. Travis会为您测试拉取请求
  3. 如果我们要部署当前在"develop"中的内容 - 人类将拉取请求、审核并合并到"release/candidate"分支中
  4. 合并后,Travis再次进行测试
  5. 一旦该分支上的测试通过 - 让Travis创建一个针对"release/production"的拉取请求(也许可以从Travis编写一个包装器来创建实际的拉取请求)。
  6. 根据我们是否真正想要部署或者还不想部署 - 人类将合并(到"release/production")或关闭由Travis创建的拉取请求
  7. 有一个部署主机或每个应用程序主机(如果您有很多并且不想拥有SPF)来跟踪"release/production"分支。

我相信你可以实现一个Heroku应用程序,来处理成为部署主机或者更疯狂的事情。

此外,您可能希望尝试让Travis通过IRC通知您,并在客户端上拥有另一个IRC机器人,该机器人将访问您的个人SSH密钥并向Heroku进行推送,您还可以通过与自己的机器人或脚本化GUI界面进行私人对话来实现确认界面,其中包含一个"Go ahead!"按钮。如果您不是那么老派,您也可以使用Hubot来实现这一目的。

顺便说一下,您还可以在上述步骤之间引入某种分段分支或其他任何您喜欢的东西。您可能还应该使用标签,回滚只需将已知工作标签推送到"release/production"中,然后由部署脚本接收。


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