Als ich versuchte, den RSpec-Test von Ruby on Rails mit GitHub-Aktionen auszuführen, war es ziemlich schwierig, deshalb werde ich ihn aufschreiben.
Es ist eine serverlose Ausführungsumgebung, die auf GitHub ausgeführt wird. Durch die Beschreibung der Einstellungen in einer Datei im Repository kann ein Mechanismus verschiedene Operationen auf GitHub auslösen und beliebige Aktionen ausführen. Sie können es kostenlos verwenden, wenn es sich um ein öffentliches Repository handelt.
Dieses Mal werde ich es zu einem CI für Rails machen, indem ich RSpec in Verbindung mit der Erstellung von Pull Request ausführe.
Es scheint gut, ein Docker-Image hochzuladen, mit dem Rails in Docker Hub ausgeführt, Docker gezogen und der Test ausgeführt werden kann.
Es kann leicht gehandhabt werden, auch wenn es sich vom Betriebssystem unterscheidet.
Dockerfile
Es ist eine grundlegende Umgebung. Wenn Sie die erforderliche Bibliothek haben, fügen Sie diese bitte hinzu.
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
Wenn Sie mehrere RUNs schreiben und die Docker-Ebenen überlappen, tritt zur Laufzeit um MySQL ein Fehler auf. Erstellen Sie daher die gesamte Umgebung mit einem Befehl.
docker build -t utyosu/build-rails:latest . -f tools/ci/Dockerfile
Sie benötigen ein Docker Hub-Konto. Erstmaliges Registrieren des Docker Hub-Repositorys scheint hilfreich zu sein.
docker push utyosu/build-rails:latest
Erstellen Sie eine Datei für GitHubAction im Repository Ihres Projekts.
:.github\workflows\build.yml
name: build
#Eine Pull-Anfrage auslösen
on: [pull_request]
jobs:
build:
#Basierend auf der neuesten Version von Ubuntu
runs-on: ubuntu-latest
#Ziehen Sie das Bild vom Docker Hub
container:
image: utyosu/build-rails:latest
#Schauen Sie sich diesen Zweig an
steps:
- uses: actions/checkout@v1
# test.lauf sh
- name: run test
run: . tools/ci/test.sh
Beschreiben Sie, was Sie testen möchten. Wenn dieses Skript fehlschlägt, schlägt der Build fehl.
tools/ci/test.sh
#!/bin/bash
#Es wird kein Prozess ausgeführt. Starten Sie daher zuerst MySQL
service mysql start
#Erstellen und Gewähren von MySQL-Benutzern
mysql -e 'create user "user_name";'
mysql -e 'grant all on *.* to "user_name";'
export RAILS_ENV=test
bundle config set without development
#Installieren Sie Gem.
#Von nichts
bundle install
#Überprüfen Sie, ob Capistrano läuft
#(Ich überprüfe es nur für den Fall, dass es aufgrund von Versionsfehlanpassungen möglicherweise nicht funktioniert.)
bundle exec cap -T
#Statische Analyse mit Rubocop
bundle exec rubocop
#Erstellen Sie eine durch Schienen definierte Datenbank
bundle exec rails db:create
#Datenbankschemaerstellung mit Ridgepole
#Wenn Sie Ridgepole nicht verwenden, bündeln Sie stattdessen Exec Rails DB:schema:Last ausführen
bundle exec ridgepole -c config/database.yml --apply -f db/schema -E test
#Führen Sie RSpec aus
bundle exec rspec
Wenn ich eine Pull-Anfrage mache, heißt es "Einige Prüfungen sind noch nicht abgeschlossen".
Klicken Sie auf Details, um den Fortschritt von CI anzuzeigen.
Nach einer kurzen Wartezeit sehen Sie die Konsolenausgabe.
Es wird nach einer Weile abgeschlossen sein.
Wenn Sie zu PullRequest zurückkehren, wird "Alle Prüfungen bestanden" angezeigt, was darauf hinweist, dass der Test ohne Probleme bestanden wurde.
Da die GitHub-Standard-Ruby-Ausführungsumgebung vorbereitet ist, habe ich sie zunächst basierend darauf ausprobiert. Die Installation von Rails and Gem dauert jedoch mehr als 30 Minuten. Daher dachte ich, dass es für CI in leichten Projekten nicht geeignet ist. Ich habe diese Methode verwendet, weil ich festgestellt habe, dass die Testausführung in etwa 40 Sekunden gestartet werden kann, wenn die Methode darin besteht, das Image von DockerHub abzurufen und auszuführen.
Es scheint eine Möglichkeit zu geben, MySQL in einem anderen Container vorzubereiten und zwischen Containern auszutauschen, aber der Mechanismus war zu schwer zu realisieren. Ich wünschte, ich könnte es in der Rails-Umgebung gut machen.
Recommended Posts