Gitlab CI - 部署到Heroku并运行迁移

9
我有一个托管在gitlab.com上的Rails应用程序,并且正在按照这个指南将其配置为部署到Heroku:http://docs.gitlab.com/ce/ci/examples/test-and-deploy-ruby-application-to-heroku.html。一切正常。

我的问题是,我如何在每次部署到Heroku时运行迁移?当通过CLI部署时,我通常会执行以下操作:

git push heroku master && heroku run rake db:migrate

但是使用gitlab-ci.yml我不知道如何做到这一点...


你可以分享一下你最终使用的gitlab-ci.yml是什么吗? - geoboy
1
我最终使用了被接受答案的示例。 - Fabiano Arruda
4个回答

14

如果想要在GitLab CI过程中能够充分使用Heroku CLI的功能(包括出现任何迁移失败原因导致构建失败),您也可以尝试这种方法,它将安装Heroku CLI并将Heroku命令的状态代码返回给GitLab,当然还有命令行输出。在命令行上无需凭据使用heroku run需要设置HEROKU_API_KEY环境变量为一个具有访问该应用程序权限的密钥。

before_script:
  - echo "deb http://toolbelt.heroku.com/ubuntu ./" > /etc/apt/sources.list.d/heroku.list
  - wget -O- https://toolbelt.heroku.com/apt/release.key | apt-key add -
  - apt-get update
  - apt-get install -y heroku-toolbelt
  - gem install dpl

stages:
  - deploy

test_on_heroku:
  type: deploy
  script:
    - dpl --provider=heroku --app=my_heroku_app --api-key=$HEROKU_API_KEY
    - heroku run <your command here> --exit-code --app my_heroku_app

我实际上在Heroku的实例上运行我的测试,以确保环境完全相同。这就是这个功能真正方便的地方。


这拯救了我的理智,我不太满意已接受的答案,因为旧的API很快就要EOL了。 - Chris McCabe
互联网上的事情变化很快。 :-) - Jimmy Bosse

7

更新@huesforalice的回答,这也适用于新的Heroku CLI,该CLI在2016年11月取代了Heroku Toolbelt:

before_script:
  - apt-get update
  - apt-get install apt-transport-https
  - echo "deb https://cli-assets.heroku.com/branches/stable/apt ./" > /etc/apt/sources.list.d/heroku.list
  - wget -O- https://cli-assets.heroku.com/apt/release.key | apt-key add -
  - apt-get update
  - apt-get install -y heroku
  - gem install dpl

staging:
  type: deploy
  variables:
    HEROKU_API_KEY: $HEROKU_STAGING_API_KEY
  script:
    - dpl --provider=heroku --app=$HEROKU_STAGING_APP --api-key=$HEROKU_STAGING_API_KEY
    - heroku run rails db:migrate --exit-code --app $HEROKU_STAGING_APP
  only:
    - master

production:
  type: deploy
  variables:
    HEROKU_API_KEY: $HEROKU_PRODUCTION_API_KEY
  script:
    - dpl --provider=heroku --app=$HEROKU_PRODUCTION_APP --api-key=$HEROKU_PRODUCTION_API_KEY
    - heroku run rails db:migrate --exit-code --app $HEROKU_PRODUCTION_APP
  only:
    - tags

7

这个答案中的信息可能已经过时。请查看下面的两个答案,并记得点赞最新的答案以帮助未来的访问者。

这里有一个样例 .yml 文件,它运行我的测试,然后将代码推送到 Heroku 的 stage(对于 master 分支推送)或 production(对于标签推送)。

image: "ruby:2.3"

test:
  script:
  - apt-get update -qy
  - apt-get install -y nodejs
  - gem install bundler
  - bundle install -j $(nproc) --without production
  - bundle exec rails db:create RAILS_ENV=test
  - bundle exec rails db:migrate RAILS_ENV=test
  - bundle exec rails RAILS_ENV=test

staging:
  type: deploy
  environment: staging
  script:
  - gem install dpl
  - dpl --provider=heroku --app=$HEROKU_STAGING_APP_NAME --api-key=$HEROKU_API_KEY
  - "curl -n -X POST https://api.heroku.com/apps/$HEROKU_STAGING_APP_NAME/ps -H \"Accept: application/json\" -H \"Authorization: Bearer ${HEROKU_API_KEY}\" -d \"command=bundle exec rails db:migrate\""
  only:
  - master

production:
  type: deploy
  environment: production
  script:
  - gem install dpl
  - dpl --provider=heroku --app=$HEROKU_PRODUCTION_APP_NAME --api-key=$HEROKU_API_KEY
  - "curl -n -X POST https://api.heroku.com/apps/$HEROKU_PRODUCTION_APP_NAME/ps -H \"Accept: application/json\" -H \"Authorization: Bearer ${HEROKU_API_KEY}\" -d \"command=bundle exec rails db:migrate\""
  only:
  - tags

bundle exec rails db:migrate 命令中应该使用 rake 而不是 rails。除此之外,看起来一切都没问题。谢谢! - Fabiano Arruda
哦,对不起。我正在运行Rails 5,它已经将所有的rake命令移动到rails中了。 :-) - Jimmy Bosse
可能不是所有的rake,而是任务和测试。http://edgeguides.rubyonrails.org/upgrading_ruby_on_rails.html#use-bin-rails-for-running-tasks-and-tests - Jimmy Bosse

0
为了进一步改进@huesforalice和@Jimmy Bosse的答案 - 如果您想要:
  • 避免将Heroku CLI安装放在全局before_script中,而只在部署阶段使用它
  • 同时,避免将安装片段复制并粘贴到不同的阶段中
您可以使用YAML锚点来DRY up,做如下操作:
before_script:
  # the global before_script
  - gem install bundler --no-document
  - bundle check || bundle install --jobs $(nproc)

.deployment_before_script: &deployment_before_script
  before_script:
    - echo "deb http://toolbelt.heroku.com/ubuntu ./" > /etc/apt/sources.list.d/heroku.list
    - wget -O- https://toolbelt.heroku.com/apt/release.key | apt-key add -
    - apt-get update
    - apt-get install -y heroku-toolbelt
    - gem install dpl

# other stages...

staging:
  stage: deploy
  <<: *deployment_before_script
  script:
    - dpl --provider=heroku --app=$HEROKU_APP_STAGING --api-key=$HEROKU_API_KEY_STAGING
    - heroku run bundle exec rails db:migrate --exit-code --app $HEROKU_APP_STAGING
  only:
    - master

production:
  stage: deploy
  <<: *deployment_before_script
  script:
    - dpl --provider=heroku --app=$HEROKU_APP_PRODUCTION --api-key=$HEROKU_API_KEY_STAGING
    - heroku run bundle exec rails db:migrate --exit-code --app $HEROKU_APP_PRODUCTION
  when: manual
  only:
    - tags

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