Test and deploy a Ruby application with GitLab CI/CD

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

You can also view or fork the complete example source and view the logs of its past CI jobs.

Configure the project

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

test:
  stage: test
  script:
    - 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

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

production:
  stage: deploy
  script:
    - gem install dpl --pre
    - dpl heroku api --app=gitlab-ci-ruby-test-prod --api-key=$HEROKU_PRODUCTION_API_KEY
  only:
    - 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 CI/CD variables in your project's Settings > CI/CD > Variables and do not check Protect variable or Mask variable:

  • 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 Heroku Dashboard.

Create a 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 or register your own. Start by creating a template configuration file to pass complex configuration:

cat > /tmp/test-config.template.toml << EOF
[[runners]]
[runners.docker]
[[runners.docker.services]]
name = "postgres:latest"
EOF

Finally, register the runner, passing the newly-created template configuration file:

gitlab-runner register \
  --non-interactive \
  --url "https://gitlab.com/" \
  --registration-token "PROJECT_REGISTRATION_TOKEN" \
  --description "ruby:2.6" \
  --executor "docker" \
  --template-config /tmp/test-config.template.toml \
  --docker-image ruby:2.6

With the command above, you create a runner that uses the ruby:2.6 image and uses a PostgreSQL database.

To access the PostgreSQL database, connect to host: postgres as user postgres with no password.