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.
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.
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.
Il peut être facilement manipulé même s'il est différent du système d'exploitation.
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.
docker build -t utyosu/build-rails:latest . -f tools/ci/Dockerfile
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
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
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
Lorsque je fais une demande d'extraction, il est dit "Certaines vérifications ne sont pas encore terminées".
Cliquez sur Détails pour voir la progression de CI.
Après une courte attente, vous verrez la sortie de la console.
Il sera terminé après un certain temps.
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.
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.
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