DEV Community

Cover image for Quick Bit:  Github Action to Test a Rails App
Corey Schaf
Corey Schaf

Posted on

3 3

Quick Bit: Github Action to Test a Rails App

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, cheers.

Alt Text

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.

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) %>

Enter fullscreen mode Exit fullscreen mode

And the Github Action

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/
Enter fullscreen mode Exit fullscreen mode

Where is this file?

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

Alt Text

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

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

Qodo Takeover

Introducing Qodo Gen 1.0: Transform Your Workflow with Agentic AI

While many AI coding tools operate as simple command-response systems, Qodo Gen 1.0 represents the next generation: autonomous, multi-step problem-solving agents that work alongside you.

Read full post

Top comments (0)

Qodo Takeover

Introducing Qodo Gen 1.0: Transform Your Workflow with Agentic AI

Rather than just generating snippets, our agents understand your entire project context, can make decisions, use tools, and carry out tasks autonomously.

Read full post