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.
For my Ruby on Rails application I am using the following:
- Rails v6.1.3.1
- Postgres v12
- 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) %>
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/
Where is this file?
With Github Actions, you can set them up directly in the Github repo.
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.
Cover credit: https://unsplash.com/photos/sJjvg1ybXRk
Top comments (0)