使用Gitlab CI自动部署到Heroku
到目前为止,Heroku还不支持从GitLab自动部署。所以我们必须使用Gitlab CI来部署到Heroku。这篇文章将帮助你设置自动部署到Heroku。
在这篇博文中,我们将使用一个带有Postgres数据库的rails应用程序。我们需要Gitlab来运行单元测试并部署到暂存区,然后再部署到生产区。
对于暂存和生产,我们将保留不同的分支,以使事情变得更简单。这也会使我们更容易推送热修复。
设置 Gitlab CI
首先,我们必须设置我们的项目,以便使用 Gitlab CI 运行测试。你可以使用 Gitlab Web UI 中的模板添加新的.gitlab-ci.yml 文件。如果你喜欢手动添加,你可以添加以下部分进行设置:
# .gitlab-ci.yml
image: 'ruby:2.7.1'
然后添加服务部分以支持rails应用的postgres数据库:
services:
- postgres:11.7
variables:
RAILS_ENV: test
POSTGRES_DB: app_test
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_HOST_AUTH_METHOD: trust
DATABASE_URL: 'postgres://postgres:postgres@postgres:5432/app_test'
接下来,让我们添加缓存以使构建更快。我们可以缓存ruby gems和node模块等:
# Cache gems in between builds
cache:
paths:
- node_modules
- .yarn
- vendor/ruby
一旦基本配置完成,让我们配置gitlab ci来运行测试案例。
测试
为了运行测试用例,我们必须首先安装缺失的依赖,如nodejs 、postgresql-client (用于运行迁移)、yarn 等。所有这些安装可以作为before_script 的一部分来完成。
你可以在测试块中使用stage config给这个阶段起个名字:
test:
stage: tests
before_script:
- ruby -v # Print out ruby version for debugging
- apt-get update -q && apt-get install nodejs postgresql-client -yqq
# Install yarn as outlined in (https://yarnpkg.com/lang/en/docs/install/#alternatives-stable)
- curl -o- -L https://yarnpkg.com/install.sh | bash
# Make available in the current terminal
- export PATH="$HOME/.yarn/bin:$HOME/.config/yarn/global/node_modules/.bin:$PATH"
- yarn install
- gem install bundler
- bundle config set path 'vendor'
- bundle install -j $(nproc)
- bundle exec rake db:migrate --quiet
- bundle exec rake db:test:prepare --quiet
script:
- bundle exec rails test
添加环境变量
在配置部署之前,我们需要在 Gitlab 的项目配置中添加 ENV 变量。要添加这些变量,请导航到项目的CI / CD Settings 中的Variables 部分。
我们需要以下的ENV变量:
- $heroku_production_key
- $heroku_app_name
- $heroku_staging_app_name

我们可以根据我们的设置,标记变量Protected &Masked 。受保护的变量将只在受保护的分支中输出。
我们可以在Operations -> Environments 中为项目配置不同的环境。
部署
一旦测试通过,我们就可以在下一阶段配置部署了。部署只从特定的分支运行,例如。
- 从
develop分支,部署到staging - 从
master分支,部署到生产区
这些部署将在dplgem的帮助下进行处理。由于我们要部署到Heroku,需要我们在每次部署后手动运行迁移,所以我们应该在部署阶段之前安装Heroku CLI:
.before_script_deploy:
before_script:
- curl https://cli-assets.heroku.com/install-ubuntu.sh | sh
- gem install dpl
# This deploy job uses a simple deploy flow to Heroku, other providers, e.g. AWS Elastic Beanstalk
# are supported too: https://github.com/travis-ci/dpl
production:
type: deploy
extends: .before_script_deploy
environment: production
variables:
HEROKU_API_KEY: $HEROKU_PRODUCTION_KEY
script:
- dpl --provider=heroku --app=$HEROKU_APP_NAME --api-key=$HEROKU_PRODUCTION_KEY
- heroku run rails db:migrate --exit-code --app $HEROKU_APP_NAME
only:
- master
staging:
type: deploy
extends: .before_script_deploy
environment: staging
variables:
HEROKU_API_KEY: $HEROKU_PRODUCTION_KEY
script:
- dpl --provider=heroku --app=$HEROKU_STAGING_APP_NAME --api-key=$HEROKU_PRODUCTION_KEY
- heroku run rails db:migrate --exit-code --app $HEROKU_STAGING_APP_NAME
only:
- develop
.before_script_deploy 模板将帮助我们在生产区和暂存区之间共享before_script 。在写这篇博文的时候,稳定的dpl gem的版本是1.10.15 ,主分支指向新的工作进展中的2.0版本。当你在阅读dpl 的文档时,请注意这个版本。