DEV Community

Allan
Allan

Posted on • Edited on

How To Set Up A Ruby On Rails CI Workflow Using Github Actions.

Continuous Integration(CI) is a development practice that enables developers to integrate code regularly into a central repository, where builds and tests run. The rationale behind this is that it helps development teams detect bugs quickly, improves code quality and security.

There are several tools we can use to automate tests. Examples of such tools are GitHub Actions, CircleCI, and many more.

This guide covers how you can set up a CI workflow for a Ruby on Rails app using GitHub Actions.

PREREQUISITES

  • Ruby On Rails app
  • Git
  • GitHub Account

WHAT IS GITHUB ACTIONS?

GitHub Actions is an automation platform that helps developers to automate workflow. Since GitHub Actions come included in your GitHub projects, it is pretty easy to set up a CI workflow without relying on any third-party integrations.

COMPONENTS OF GITHUB ACTIONS

WORKFLOW

Workflow is an automated steps that is made up of one or more jobs that can be scheduled or triggered by an event. They are defined by a YAML file in the .github/workflows directory and can be used to build, test, package, release or deploy a project on GitHub.

EVENTS

Events are specific tasks that trigger the execution of a workflow. An example is when you push a commit to a repository or create a pull request.

JOBS

A job is a series of steps that executes on the same runner.

STEPS

Steps consist of individual tasks to run a job. They group actions that are carried out on the runner.

ACTIONS

Actions are the smallest building blocks of a workflow that are combined into steps to create a job.

RUNNERS

A runner is a server on which our jobs will be executed.

CREATING A RUBY ON RAILS WORKFLOW

I. Create a repository on GitHub.
II. Create a new rails application, navigate to the directory, and push it to GitHub.
III. Go to the repository, and in the Actions tab, click on setup a workflow yourself. By default, this will create folder .github, a sub-folder workflow, and a main.yml file.
IV. Commit this and run git pull in the terminal to pull this.

Now let's follow these steps to set up a CI workflow using GitHub Actions.

1. Name the workflow.

name: CI
Enter fullscreen mode Exit fullscreen mode

2. Set the events.

on:

  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]
Enter fullscreen mode Exit fullscreen mode

In this code snippet, the events will trigger the action to run whenever we push a code to the master branch or we perform a pull request. Note: The branch is set to the master branch by default, but you can configure it for different branches as well.

3. Define The Job.

 jobs:
  test:
    runs-on: ubuntu-latest
Enter fullscreen mode Exit fullscreen mode

We define a job, give it a name and tell it to run on the latest version of ubuntu.

4. Define The Services.

  services: 
      postgres:
        image: postgres:12
        env:
          POSTGRES_PASSWORD: postgres
        ports: ['5432:5432']
Enter fullscreen mode Exit fullscreen mode

Here, we specify the services we need to run the job and the database we need to run the tests.

5. Define the steps and Setup Dependencies

steps:
      - uses: actions/checkout@v2
      - name: Setup Ruby
        uses: ruby/setup-ruby@v1.80.0
        with:
          ruby-version: 2.6.6

      - uses: Borales/actions-yarn@v2.3.0
        with:
          cmd: install

      - name: Install Dependencies
        run: |
          sudo apt install -yqq libpq-dev
          gem install bundler

      - name: Install Gems
        run: |
          bundle install
Enter fullscreen mode Exit fullscreen mode

The code above checkouts the source code, sets up ruby with version 2.6.6, install gems, and Postgres dependencies.

6. Set up the database

  - name: Setup database
        env:
          PG_DATABASE: postgres
          PG_HOST: localhost
          PG_USER: postgres
          PG_PASSWORD: password
          RAILS_ENV: test
          WITH_COVERAGE: true
          DISABLE_SPRING: 1
        run: |
          bundle exec rails db:prepare
          bundle exec rake test
Enter fullscreen mode Exit fullscreen mode

Here we specify the database required for rails to create, run and connect to Postgres.

7. Add Rspec Test.

  - name: Build and test with RSpec
        env:
          PG_DATABASE: postgres
          PG_HOST: localhost
          PG_USER: postgres
          PG_PASSWORD: password
          RAILS_ENV: test
        run: |
          bundle exec rspec spec
Enter fullscreen mode Exit fullscreen mode

Since we don't have RSpec included in the gemfile when we push the changes to GitHub we will have a failing workflow. Now, let's add gem 'rspec-rails' to the gemfile like so:

 group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: %i[mri mingw x64_mingw]
  gem 'rspec-rails'
end
Enter fullscreen mode Exit fullscreen mode

Add some models and controllers to your app and write tests against them.

8. Add Code Coverage.

  - name: Create Coverage Artifact
        uses: actions/upload-artifact@v2
        with:
          name: code-coverage
          path: coverage/
Enter fullscreen mode Exit fullscreen mode

and in the gemfile add gem 'simplecov', require: false

group :test do
  # Adds support for Capybara system testing and selenium driver
  gem 'capybara', '>= 3.26'
  gem 'selenium-webdriver'
  gem 'webdrivers'
  gem 'simplecov', require: false
end

Enter fullscreen mode Exit fullscreen mode

This will generate a coverage report from the testing environment.

Here is the complete workflow file.

name: CI
on:

  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:
  test:
    runs-on: ubuntu-latest

    services: 
      postgres:
        image: postgres:12
        env:
          POSTGRES_PASSWORD: postgres
        ports: ['5432:5432']

    steps:
      - uses: actions/checkout@v2
      - name: Setup Ruby
        uses: ruby/setup-ruby@v1.80.0
        with:
          ruby-version: 2.6.6

      - uses: Borales/actions-yarn@v2.3.0
        with:
          cmd: install

      - name: Install Dependencies
        run: |
          sudo apt install -yqq libpq-dev
          gem install bundler

      - name: Install Gems
        run: |
          bundle install

      - name: Setup database
        env:
          PG_DATABASE: postgres
          PG_HOST: localhost
          PG_USER: postgres
          PG_PASSWORD: password
          RAILS_ENV: test
          WITH_COVERAGE: true
          DISABLE_SPRING: 1
        run: |
          bundle exec rails db:prepare
          bundle exec rake test

      - name: Build and test with rspec
        env:
          PG_DATABASE: postgres
          PG_HOST: localhost
          PG_USER: postgres
          PG_PASSWORD: password
          RAILS_ENV: test
        run: |
          bundle exec rspec spec

      - name: Create Coverage Artifact
        uses: actions/upload-artifact@v2
        with:
          name: code-coverage
          path: coverage/



Enter fullscreen mode Exit fullscreen mode

Now, commit this to the repository and push the file to GitHub. Go to the Actions tab, and in the Actions logs click on the latest build that outputs the name of each step in the workflow file. Be sure that the test runs successfully when you push a code to GitHub.

CONCLUSION

In this guide, we demonstrated how to set up a CI workflow using GitHub Actions. I hope you learned a lot, and thanks for following along.

REFERENCES

Top comments (1)

Collapse
 
pitosalas profile image
Pito Salas

I went looking for your article because my github action was failing with rails (activerecord) not succeeding to connect to postgres. Now that I am using your approach I still get this error. Have you ever seen it? Any idea?

Image description