Quick Bit:  Github Action to Test a Rails App
Tags: ruby, devops, showdev, testing
Published: 2021-04-19 20:08:56

---
title: Quick Bit:  Github Action to Test a Rails App
published: true
description: A Github Action to run tests on a rails application against a postgres database.
tags: ruby, devops, showdev, testing
cover_image: https://dev-to-uploads.s3.amazonaws.com/uploads/articles/abd3pytwf1adn9lqjfvo.jpeg
---

## Hello there!

In this quick little post I am going to quickly show how I built a Github Action that will run my Rails application's test suite.  Now there are many posts on this topic, but I legit could not get anything I found on google to work.  So after "days" of banging my head against the wall I was able to piece together a working Github Action.  So if there is anyone in a similar place I hope this helps.  As always, you can find me on [twitter](https://twitter.com/corey_s_), cheers.



![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hdmo6441ab2jnw836b3z.png)


For my Ruby on Rails application I am using the following:

1. Rails v6.1.3.1
2. Postgres v12
3. Standard minitest rails integration.


## Goal

On my many pushes I would like to have a Github Action run that verifies my code and tests.  This should also test any branch that is set to be PR'd into the `main` branch.  Also for note, this is a personal project so I commit a lot and my commit msg's are quite sparse.


### In the Rails Application.

In `config/database.yml` update the settings to use the env vars that we will establish later.

```ruby
test:
  <<: *default
  database: <%= ENV.fetch('PG_DATABASE', 'myapp_test') %>
  host:     <%= ENV.fetch('PG_HOST',  'localhost') %>
  username: <%= ENV.fetch('PG_USER', nil) %>
  password: <%= ENV.fetch('PG_PASSWORD', nil) %>
  port:     <%= ENV.fetch('PG_PORT', 5432) %>

```



### And the Github Action



```yml
name: Rails
on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

env:
  registry: myapp_registry
  DB_HOST: localhost
  DB_USERNAME: myapp
  DB_PASSWORD: password


jobs:
  tests:
    name: Tests
    runs-on: ubuntu-latest

    services:
      postgres:
        image: postgres:12
        ports: ["5432:5432"]
        env:
          POSTGRES_PASSWORD: password
          POSTGRES_DB: myapp_test
          POSTGRES_USER: myapp
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Setup Ruby
        uses: ruby/setup-ruby@v1
        #with:
        #  ruby-version: 2.7.2 not needed with .ruby-version file

      - name: Setup Node
        uses: actions/setup-node@v1
        with:
          node-version: 10.18.0
          
      - name: Find yarn cache location
        id: yarn-cache
        run: echo "::set-output name=dir::$(yarn cache dir)"
        
      - name: JS package cache
        uses: actions/cache@v1
        with:
          path: ${{ steps.yarn-cache.outputs.dir }}
          key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-
            
      - name: Install packages
        run: |
          yarn install --pure-lockfile
      - name: Install PostgresSQL 12 Client
        run: |
          sudo apt-get -yqq install libpq-dev
      - name: Cache Ruby Gems
        uses: actions/cache@v2
        with:
          path: vendor/bundle
          key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}
          restore-keys: |
            ${{ runner.os }}-gems-
      - name: Bundle Install
        run: |
          bundle config path vendor/bundle
          bundle install --jobs 4 --retry 3
      - name: Setup test database and run tests
        env:
          RAILS_ENV: test
          PG_HOST: localhost
          PG_DATABASE: myapp_test
          PG_USER: myapp
          PG_PASSWORD: password
          WITH_COVERAGE: true
          DISABLE_SPRING: 1
        run: |
          bin/rails db:setup
          bin/rails test
      
      - name: Upload Code Coverage
        uses: actions/upload-artifact@v2
        with:
          name: code-coverage
          path: coverage/
```



### Where is this file?

With Github Actions, you can set them up directly in the Github repo.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t3fknt98yy7bqvpnd1wt.png)

This will create a file in your code base under `.github/workflows/{filename}.yml`.


With this in place you should now see the build steps execute 1 by 1 and complete successfully, if your project is indeed passing all tests.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9j8h8aimme6gihwa750x.png)

Cover credit: https://unsplash.com/photos/sJjvg1ybXRk