GitHub Actions with Ruby on Rails: Setting up Continuous Integration Discussion
I guess part of Continuous Integration is pushing the chanegs to production once the tests succeed.
Any suggestions on how to push to Heroku from within GitHub actions?
It's of course possible to configure this in Heroku, but I'm curious how to this from GitHub as it would allow you to then also run commands like database migrations after deployment.
There are probably ways to do it, but I'd be prefer my CI setup to be self contained. For example I'm using Codeship right now which runs the tests, deploys to Heroku, runs migrations, and checks whether the site is still up.
I'm sure the same is possible with GitHub Actions, but I'm not just not sure how to push to the Heroku git repository from within GitHub.
You'd just use the Heroku action as the last step I believe: https://github.com/actions/heroku
Thanks. Would love to see an episode on that, as I think most people aren't used to doing Docker Deploys on Heroku.
Anybody has gotten github actions to work on the latest versions of Ruby? (2.6.4, 2.6.5)? Looks like the setup-ruby action has been outdated for a cople of months now.
Still waiting on them to release those Ruby versions. You can use a Ruby Docker image instead or compile and cache Ruby as part of the steps. Other than that, we just have to wait for 2.6.5 support to use setup-ruby. :(
Yeah I was trying that too!! It works fine for running regular tests I think, but it looks like you'd have to do a bit of an extra setup for system tests and chromedriver-helper. Have you had any luck running system tests?
I was having issues with that YML file. This is my working versions. I use Rails, Postgresq, Redis, RSpec.
name: Continuous integration
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
services:
db:
image: postgres:11@sha256:85d79cba2d4942dad7c99f84ec389a5b9cc84fb07a3dcd3aff0fb06948cdc03b
ports: ['5432:5432']
env:
POSTGRES_DB: test
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
redis:
image: redis
ports: ['6379:6379']
options: --entrypoint redis-server
steps:
- uses: actions/checkout@v2
- name: Setup Ruby
uses: actions/setup-ruby@v1
with:
ruby-version: 2.7
- name: Build and test with Rake
env:
RAILS_ENV: test
RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }}
run: |
sudo apt-get -yqq install libpq-dev
gem install bundler
bundle install --jobs 4 --retry 3
- name: Db create Migrate
env:
DATABASE_URL: postgres://postgres:@localhost:5432/test
REDIS_URL: redis://localhost:6379/0
RAILS_ENV: test
RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }}
run: |
bundle exec rails db:schema:load
bundle exec rspec ./spec
Just to confirm, even though the test runs on Github CI, it still uses the test DATABASE instead of production DATABASE right? So the main purpose here is to confirm the rest of the project members' code under testing within the whole project? The reason I ask this question is that before pushing the code to GitHub, I will definitely test it locally, so if it just for my own benefit, it won't need to be tested again on GitHub CI. Or maybe there are some others reasons which make the GitHub CI test necessary.
I am sorry if I asked any low-level questions, I am a newbie of Ruby on Rails and GitHub CI, I am really curious about this question, thanks for your time.
Yes, it uses a database used only inside the CI.
And you want to always run the CI even if your local tests pass. The CI environment may catch something you missed and is most important when you have multiple people merging changes together as it can be easy to miss something. Think of it as double checking your work constantly. 👍
Thank you very much for this video, Chris! I just wanted to share here a little update I had to do in order to make it work:
1) the new postgres images require a password, so I had to add it as an env
variable.
2) actions/setup-ruby is deprecated, now you have to use ruby/setup-ruby instead
3) the borales/actions-yarn is now at v2.3.0, the 2.0.0 is not working anymore
So the final version of this setup looks like this one:
# .github/workflows/ci.yml
name: CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
services:
db:
image: postgres
env:
password: secretpassword
ports: ['5432:5432']
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
redis:
image: redis
ports: ['6379:6379']
options: --entrypoint redis-server
steps:
- uses: actions/checkout@v1
- name: Setup Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: 2.6.x
- uses: borales/actions-yarn@v2.3.0
with:
cmd: install
- name: Build and run tests
env:
DATABASE_URL: postgres://postgres:secretpassword@localhost:5432/test
REDIS_URL: redis://localhost:6379/0
RAILS_ENV: test
RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }}
run: |
sudo apt-get -yqq install libpq-dev
gem install bundler
bundle install --jobs 4 --retry 3
bundle exec rails db:prepare
bundle exec rails test
Getting this error on the Run borales/actions-yarn@v2.0.0 step
yarn install v1.17.3
[1/4] Resolving packages...
[2/4] Fetching packages...
info fsevents@2.3.2: The platform "linux" is incompatible with this module.
info "fsevents@2.3.2" is an optional dependency and failed compatibility check. Excluding it from installation.
info fsevents@1.2.13: The platform "linux" is incompatible with this module.
info "fsevents@1.2.13" is an optional dependency and failed compatibility check. Excluding it from installation.
error webpack-dev-server@4.5.0: The engine "node" is incompatible with this module. Expected version ">= 12.13.0". Got "10.16.3"
error Found incompatible module.
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.
Any ideas?
Your node version is too old (see the webpack-dev-server line)
Expected version ">= 12.13.0". Got "10.16.3"
As a note, for devs with PR process, this setup will cause to be n+1 since you'll be triggering runs on any push without considering the branch, a better approach would be to only count pushes to main
, something like this would work:
name: CI
on:
pull_request:
branches:
- "*"
push:
branches:
- main
- master