使用Gitlab CI自动部署到Heroku的详细指南

208 阅读2分钟

使用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来运行测试案例。

测试

为了运行测试用例,我们必须首先安装缺失的依赖,如nodejspostgresql-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

Gitlab Variables

我们可以根据我们的设置,标记变量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 的文档时,请注意这个版本。