Ruby on Rails GitHub Actions con MySQL
Guía básica para crear tu CI con GitHub Actions y MySQL
GitHub Actions te permite configurar un pipeline de integración continua (CI) directamente en tu repositorio. En esta guía te muestro cómo configurar GitHub Actions para un proyecto de Ruby on Rails 6 con MySQL.
Archivo de workflow: .github/workflows/ruby.yml
Crea el siguiente archivo en tu repositorio:
name: Ruby
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
services:
mysql:
image: mysql:5.7
env:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: test_db
ports:
- 3306:3306
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
steps:
- uses: actions/checkout@v2
- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: 2.7
bundler-cache: true
- name: Setup Node
uses: actions/setup-node@v2
with:
node-version: '14'
- name: Install dependencies
run: |
gem install bundler
bundle install --jobs 4 --retry 3
yarn install
- name: Setup database
env:
RAILS_ENV: test
DB_HOST: 127.0.0.1
DB_PORT: 3306
DB_USER: root
DB_PASSWORD: root
run: |
cp config/database.yml.ci config/database.yml
bundle exec rails db:create
bundle exec rails db:schema:load
- name: Run tests
env:
RAILS_ENV: test
DB_HOST: 127.0.0.1
DB_PORT: 3306
DB_USER: root
DB_PASSWORD: root
run: bundle exec rails test
Archivo de configuración: config/database.yml.ci
Crea este archivo para que GitHub Actions pueda conectarse a la base de datos de MySQL del servicio:
test:
adapter: mysql2
encoding: utf8mb4
collation: utf8mb4_unicode_ci
database: test_db
host: <%= ENV['DB_HOST'] %>
port: <%= ENV['DB_PORT'] %>
username: <%= ENV['DB_USER'] %>
password: <%= ENV['DB_PASSWORD'] %>
El archivo database.yml.ci es necesario porque la configuración de base de datos en GitHub Actions es diferente a la de tu entorno local. En el paso "Setup database" del workflow, copiamos este archivo como database.yml para que Rails lo use durante las pruebas. Las variables de entorno (DB_HOST, DB_PORT, etc.) se conectan al servicio de MySQL que definimos en la sección "services" del workflow.