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

时间:2016-05-29 20:40:21

标签: ruby-on-rails heroku gitlab-ci gitlab-ci-runner

我在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我不知道怎么做...

4 个答案:

答案 0 :(得分:11)

如果您希望能够在GitLab CI过程中使用Heroku CLI的全部功能(包括在迁移失败时构建失败,无论出于何种原因),您也可以尝试这种安装Heroku CLI的方法并将Heroku命令的状态代码传递回GitLab,当然还有命令行输出。在命令行上使用不带凭据的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 环境变量设置为可以访问相关应用的密钥。

+----+-------+
| id | name  |
+----+-------+
|  1 | Boss  |
|  2 | Boris |
+----+-------+
create table users(
 id int auto_increment primary key,
 name varchar(255) not null
);

我实际上在Heroku实例上运行我的测试以确保环境完全相同。这就是真正得心应手的地方。

答案 1 :(得分:7)

此回答中的信息可能已过期。请参阅下面的两个答案,并记住提供最新的答案以帮助未来的访问者。

这是一个示例.yml我运行我的测试然后推送到Heroku阶段(用于主分支推送)或生产(用于标签推送)

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

答案 2 :(得分:6)

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

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

答案 3 :(得分:0)

进一步改善@huesforalice和@Jimmy Bosse的答案-如果您愿意

  • 避免将Heroku CLI安装放在全局before_script中,而只能在部署阶段使用
  • 同时避免将安装摘要复制和粘贴到不同的阶段

您可以使用YAML锚点来进行类似的操作

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