Test and Deploy a ruby application with GitLab CI/CD

This example will guide you how to run tests in your Ruby on Rails application and deploy it automatically as Heroku application.

You can checkout the example source and check CI status.

Configure the project

This is what the .gitlab-ci.yml file looks like for this project:

  stage: test
  - apt-get update -qy
  - apt-get install -y nodejs
  - bundle install --path /cache
  - bundle exec rake db:create RAILS_ENV=test
  - bundle exec rake test

  stage: deploy
  - gem install dpl
  - dpl --provider=heroku --app=gitlab-ci-ruby-test-staging --api-key=$HEROKU_STAGING_API_KEY
  - master

  stage: deploy
  - gem install dpl
  - dpl --provider=heroku --app=gitlab-ci-ruby-test-prod --api-key=$HEROKU_PRODUCTION_API_KEY
  - tags

This project has three jobs:

  • test - used to test Rails application.
  • staging - used to automatically deploy staging environment every push to master branch.
  • production - used to automatically deploy production environment for every created tag.

Store API keys

You'll need to create two variables in your project's Settings > CI/CD > Variables:

  • HEROKU_STAGING_API_KEY - Heroku API key used to deploy staging app.
  • HEROKU_PRODUCTION_API_KEY - Heroku API key used to deploy production app.

Find your Heroku API key in Manage Account.

Create Heroku application

For each of your environments, you'll need to create a new Heroku application. You can do this through the Dashboard.

Create Runner

First install Docker Engine. To build this project you also need to have GitLab Runner. You can use public runners available on gitlab.com, but you can register your own:

gitlab-runner register \
  --non-interactive \
  --url "https://gitlab.com/" \
  --registration-token "PROJECT_REGISTRATION_TOKEN" \
  --description "ruby-2.2" \
  --executor "docker" \
  --docker-image ruby:2.2 \
  --docker-postgres latest

With the command above, you create a Runner that uses ruby:2.2 image and uses postgres database.

To access PostgreSQL database you need to connect to host: postgres as user postgres without password.