Exécutez des tests Ruby on Rails RSpec avec des actions GitHub

Quand j'ai essayé d'exécuter le test RSpec de Ruby on Rails avec des actions GitHub, c'était assez difficile, je vais donc l'écrire.

Qu'est-ce que les actions GitHub?

Il s'agit d'un environnement d'exécution sans serveur qui s'exécute sur GitHub. En décrivant les paramètres dans un fichier dans le référentiel, c'est un mécanisme qui peut déclencher diverses opérations sur GitHub et exécuter des actions arbitraires. Vous pouvez l'utiliser gratuitement s'il s'agit d'un référentiel public.

Cette fois, je vais en faire un CI pour Rails en exécutant RSpec en association avec la création de Pull Request.

Conclusion

Il semble bon de télécharger une image Docker capable d'exécuter Rails sur Docker Hub, d'extraire Docker et d'exécuter le test.

environnement

Il peut être facilement manipulé même s'il est différent du système d'exploitation.

Créez une image Docker et téléchargez-la sur Docker Hub

Dockerfile

C'est un environnement basique. Si vous disposez de la bibliothèque requise, veuillez l'ajouter.

tools/ci/Dockerfile


FROM ubuntu:16.04

SHELL ["/bin/bash", "-c"]

ENV RUBY_VERSION="2.6.6"
ENV BUNDLER_VERSION="2.1.4"
ENV DEBIAN_FRONTEND="noninteractive"
ENV PATH=/root/.rbenv/bin:/root/.rbenv/shims:$PATH

WORKDIR /app

COPY Gemfile .
COPY Gemfile.lock .

RUN set -x \
  && apt update \
  && apt install -y \
    build-essential \
    curl \
    git \
    libssl-dev \
    libreadline-dev \
    libmysqlclient-dev \
    mysql-client \
    mysql-server \
    tzdata \
    zlib1g-dev \
  # Install rbenv and ruby
  && git clone https://github.com/sstephenson/rbenv.git ~/.rbenv \
  && git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build \
  && CONFIGURE_OPTS='--disable-install-rdoc' /root/.rbenv/bin/rbenv install ${RUBY_VERSION} -s \
  && /root/.rbenv/bin/rbenv global ${RUBY_VERSION} \
  # Install bundler
  && echo 'gem: --no-rdoc --no-ri' > /root/.gemrc \
  && /root/.rbenv/shims/gem install bundler -v ${BUNDLER_VERSION} \
  # bundle install
  && /root/.rbenv/shims/bundle config set without development \
  && /root/.rbenv/shims/bundle install \
  # delete unused file
  && rm -rf /var/lib/apt/lists/* \
  && rm Gemfile Gemfile.lock

Si vous écrivez plusieurs RUN et chevauchez les couches Docker, une erreur se produira au moment de l'exécution autour de MySQL, créez donc tout l'environnement avec une seule commande.

Construire Docker

docker build -t utyosu/build-rails:latest . -f tools/ci/Dockerfile

Télécharger l'image Docker

Vous aurez besoin d'un compte Docker Hub. Enregistrer le référentiel Docker Hub pour la première fois semble être utile.

docker push utyosu/build-rails:latest

Définir des déclencheurs pour les actions GitHub

Créez un fichier pour GitHubAction dans le référentiel de votre projet.

:.github\workflows\build.yml


name: build

#Déclencher une demande d'extraction
on: [pull_request]

jobs:
  build:
    #Basé sur la dernière version d'Ubuntu
    runs-on: ubuntu-latest

    #Extraire l'image de Docker Hub
    container:
      image: utyosu/build-rails:latest

    #Découvrez cette branche
    steps:
    - uses: actions/checkout@v1

    # test.courir sh
    - name: run test
      run: . tools/ci/test.sh

Script de test

Décrivez ce que vous voulez tester. Si ce script échoue, la construction échouera.

tools/ci/test.sh


#!/bin/bash

#Aucun processus n'est en cours d'exécution, alors démarrez d'abord MySQL
service mysql start

#Créer et attribuer des utilisateurs MySQL
mysql -e 'create user "user_name";'
mysql -e 'grant all on *.* to "user_name";'

export RAILS_ENV=test
bundle config set without development

#Installez Gem.
#De rien
bundle install

#Vérifiez si Capistrano fonctionne
#(Je le vérifie juste au cas où cela pourrait ne pas fonctionner en raison d'une incompatibilité de version)
bundle exec cap -T

#Analyse statique avec Rubocop
bundle exec rubocop

#Créer une base de données définie par des rails
bundle exec rails db:create

#Création de schéma de base de données avec ridgepole
#Si vous n'utilisez pas ridgepole, regroupez les rails exec à la place:schema:Exécuter la charge
bundle exec ridgepole -c config/database.yml --apply -f db/schema -E test

#Exécutez RSpec
bundle exec rspec

Essayez en fait

Lorsque je fais une demande d'extraction, il est dit "Certaines vérifications ne sont pas encore terminées".

1.png

Cliquez sur Détails pour voir la progression de CI.

3.png

Après une courte attente, vous verrez la sortie de la console.

4.png

Il sera terminé après un certain temps.

5.png

Lorsque vous revenez à PullRequest, «Tous les contrôles ont réussi» s'affiche, et vous pouvez voir que le test a réussi sans aucun problème.

6.png

Contexte

Depuis que l'environnement d'exécution Ruby standard de GitHub est préparé, je l'ai essayé en me basant dans un premier temps. Cependant, l'installation de Rails et Gem prend plus de 30 minutes, j'ai donc pensé que cela ne convenait pas pour CI dans des projets légers. J'ai utilisé cette méthode car j'ai trouvé que l'exécution du test peut être lancée en environ 40 secondes si la méthode consiste à extraire l'image de DockerHub et à l'exécuter.

Note

Il semble y avoir un moyen de préparer MySQL dans un autre conteneur et d'échanger entre conteneurs, mais le mécanisme était trop difficile à réaliser. J'aimerais bien pouvoir le faire dans l'environnement Rails.

Recommended Posts

Exécutez des tests Ruby on Rails RSpec avec des actions GitHub
[Ruby on Rails] Afficher le test avec RSpec
[Ruby on Rails] Test du contrôleur avec RSpec
[Ruby on Rails] Test de modèle avec RSpec
Présentation de Rspec avec Ruby on Rails x Docker
Comprendre la couverture du code avec Rspec, le framework de test Ruby on Rails
Remarques sur l'utilisation de FCM avec Ruby on Rails
[Ruby on Rails] Jusqu'à l'introduction de RSpec
Publiez l'application avec ruby on rails
Présentation de Rspec, un framework de test pour Ruby on Rails
[Rails] Procédure de liaison de bases de données avec Ruby On Rails
Déterminez la page actuelle avec Ruby on Rails
[Ruby on Rails] Téléversement de plusieurs images avec refile
J'ai fait un portfolio avec Ruby On Rails
Ruby on Rails élémentaire
Principes de base de Ruby on Rails
[Rails] Test avec RSpec
Association Ruby On Rails
[Ruby on Rails] Supprimer les images s3 avec Active Strage
Rendre les tests rspec ratés visibles dans les annotations de vérification sur github
Exécuter les meilleures pratiques RSpec, Brakeman, Rubocop, Rails avec overcommit
Création d'un plan de site au format RSS / Atom avec Ruby on Rails
Record d'apprentissage de Ruby on rails -2020.10.03
Création de portfolio Ruby on Rails
Record d'apprentissage Ruby on rails -2020.10.04
[Ruby on Rails] Debuck (binding.pry)
Record d'apprentissage de Ruby on rails -2020.10.05
Record d'apprentissage de Ruby on rails -2020.10.09
Record d'apprentissage Ruby on rails-2020.10.07 ②
Exécuter des rails à chaque fois dans le docker
Record d'apprentissage Ruby on rails-2020.10.07 ①
Annuler la migration de Ruby on Rails
Record d'apprentissage de Ruby on rails -2020.10.06
Résumé de la validation Ruby on Rails
Mémorandum de base Ruby on Rails
J'ai essayé d'installer le plugin lié à Ruby on Rails avec vim-plug
[Ruby on Rails] Ajouter une colonne avec des contraintes de clé externe
[Ruby on Rails] Implémenter la fonction de connexion par add_token_to_users avec l'API
Installez Ruby sur MSYS2 avec pacman
[Ruby on Rails] Read try (: [] ,: key)
Variables Ruby on Rails, résumé constant
Installation de Ruby + Rails sur Ubuntu 18.04 (rbenv)
[Ruby on Rails] Introduction de la fonction de pagination
Je souhaite ajouter une fonction de navigation avec ruby on rails
Création d'un environnement de développement pour Ruby on Rails à l'aide de Docker + VSCode (Remote Container)
Connaissance de base de Ruby on Rails
Progatez Ruby on Rails
Comment utiliser Ruby on Rails
Programmation avec ruby (en route)