[Challenge CircleCI from 0] Construire un test automatisé (Rails6.0, mysql8.0, Rspec)

Contexte

Je vise à obtenir un emploi dans une entreprise développée en interne par des personnes inexpérimentées. J'ai décidé d'étudier CircleCI pour créer un bon portfolio.

Le niveau actuel de connaissances est le développement d'applications simples à l'aide de Ruby on rails, la gestion des versions à l'aide de git et le déploiement à l'aide d'heroku. J'espère que cela sera d'une certaine aide pour ceux qui envisagent d'essayer CircleCI à l'avenir au même niveau que leur propre mémorandum.

buts finaux

Faites le test automatisé à chaque fois que vous poussez avec CircleCI. Réussissez également le test automatisé

【Article associé】 [Challenge CircleCI from 0] Apprenez les bases de CircleCI [Challenge CircleCI from 0] Construire un test automatisé (Rails6.0 / mysql8.0 / Rspec) [Challenge CircleCI from 0] Comprendre AWS ECR / ECS [Challenge CircleCI from 0] Déploiement automatique avec CircleCI / AWS (ECR / ECS)

environnement

ruby 2.6.6 rails 6.0 db: mysql 8.0 test: rspec

Construire des tests automatisés (Rails6.0, mysql8.0, Rspec)

Nous partirons du principe que la coopération entre github et CircleCI est terminée.

Fondamentalement, exécutez les tests rubocop et rspec en conjonction avec github dans circleCI official ou [[circleCI] Rails app Si vous vous référez à ru etc., vous pouvez facilement définir le test automatique. Cependant, afin d'effectuer un déploiement automatique et des paramètres plus complexes à l'avenir, il est nécessaire de décomposer et de comprendre la description du fichier. Regardons le tout d'abord.

Dossier entier

yaml:.circleci/config.yml


version: 2.1
 emplois: # ---------------------------------------------- ★ emploi
  build:
    docker:                    #----------------------------------------------★Executor
      - image: circleci/ruby:2.6.6-node-browsers
        environment:
          RAILS_ENV: 'test'
          MYSQL_HOST: 127.0.0.1
          MYSQL_USERNAME: 'root'
          MYSQL_PASSWORD: ''
          MYSQL_PORT: 3306
      - image: circleci/mysql:8.0
        command: mysqld --default-authentication-plugin=mysql_native_password
        environment:
          MYSQL_ALLOW_EMPTY_PASSWORD: 'true'
          MYSQL_ROOT_HOST: '%'
    working_directory: ~/repo
 étapes: # --------------------------------------------- ★ étapes
      - checkout
      - restore_cache:
          keys:
            - v1-dependencies-{{ checksum "Gemfile.lock" }}
            - v1-dependencies-
      - run:
          name: install dependencies
          command: |
            bundle install --jobs=4 --retry=3 --path vendor/bundle
      - save_cache:
          paths:
          - ./vendor/bundle
          key: v1-dependencies-{{ checksum "Gemfile.lock" }}
      - run: mv config/database.yml.ci config/database.yml
      - run: bundle exec rake db:create
      - run: bundle exec rake db:schema:load
      - run:
          name: RSpec

          command: |
            mkdir /tmp/test-results
            TEST_FILES="$(circleci tests glob "spec/models/users_spec.rb" | \
              circleci tests split --split-by=timings)"
            bundle exec rspec \
              --format progress \
              --out /tmp/test-results/rspec.xml \
              --format progress \
              $TEST_FILES
      - store_test_results:
          path: /tmp/test-results
      - store_artifacts:
          path: /tmp/test-results
          destination: test-results

Outre la description détaillée,Article précédent"Étapes","Emplois"et"Exécuteur"mentionnésdans(Exécuteur)Organisons-nous.

-Les étapes sont celles où les «étapes» sont écrites à la ligne 18. Cette fois, il n'y a qu'un seul endroit où l'étape est déclarée, il n'y a donc qu'une seule étape. "Etapes" Ci-dessous se trouve une liste de commandes qui appartiennent toutes à une seule étape. -Les travaux sont déclarés sur la deuxième ligne à partir du haut où «travaux» est écrit. Puisqu'il n'y a qu'une seule description ici, il n'y a qu'un seul travail cette fois. Tout ce qui se trouve sous «emplois» est le contenu du travail. Au fait, le nom du travail est "build"

En d'autres termes, en résumé, "Ce fichier a un travail appelé" build ", ce travail est exécuté dans l'environnement docker et le contenu de l'exécution est l'étape(Un)以下だよ」という意味になります。大まかな構造をみたので、次はUnUn細かく見ていきましょう。

① version~Partie exécuteur

yaml:.circleci/config.yml


version: 2.1
jobs:                          
  build:
    docker:                   
      - image: circleci/ruby:2.6.6-node-browsers
        environment:
          RAILS_ENV: 'test'
          MYSQL_HOST: 127.0.0.1
          MYSQL_USERNAME: 'root'
          MYSQL_PASSWORD: ''
          MYSQL_PORT: 3306
      - image: circleci/mysql:8.0
        command: mysqld --default-authentication-plugin=mysql_native_password
        environment:
          MYSQL_ALLOW_EMPTY_PASSWORD: 'true'
          MYSQL_ROOT_HOST: '%'
    working_directory: ~/repo

-version est la version de CircleCI. 2 ou 2 si vous souhaitez régler à partir de maintenant.Je pense que 1 est bien. -jobs est une déclaration que nous allons écrire le contenu du job. La construction sur la ligne suivante sera le nom du travail. Au fait, s'il n'y a qu'un seul travail, le nom du travail doit être construit, alors soyez prudent. -docker est "Executor(Exécuteur)Déclare de créer un environnement docker et d'exécuter des travaux. -La première image est une image rubis. "Circleci" devant rubis/"" Fait référence à l'image préparée par CircleCI, appelée image de commodité. -environnement Vous trouverez ci-dessous les paramètres de l'image rubis. "DES RAILS_ENV: 'test'Indique qu'il s'agit d'un environnement de test et "MYSQL"HOST: 127.0.0."1" signifie se connecter à MYSQL dans le même local. "MON SQL_NOM D'UTILISATEUR "・" MYSQL ""PASSWORD" est le paramètre de MYSQL. Cela doit également être inclus dans le fichier de configuration de test. Je parlerai de ce fichier plus tard. "MON SQL_PORT:"3306" est le numéro de port de MYSQL. -Ensuite, il y a une autre image, qui crée une image de MYSQL. La configuration est la même et l'environnement de l'image est défini sous environnement. Au fait, "commande"~Modifie le plug-in d'authentification pour mysql. mysql8.Veuillez noter qu'il est indispensable lors de l'utilisation de o ou version ultérieure. "MON SQL_ALLOW_EMPTY_PASSWORD: 'true'Vous permet de vous connecter à MYSQL sans mot de passe. "MON SQL_ROOT_HOST: '%'Indique qu'il est accessible depuis n'importe quel hôte.

Regardons la seconde moitié.

###② steps~Endroit

yaml:.circleci/config.yml


    steps:                    
      - checkout
      - restore_cache:
          keys:
            - v1-dependencies-{{ checksum "Gemfile.lock" }}
            - v1-dependencies-
      - run:
          name: install dependencies
          command: |
            bundle install --jobs=4 --retry=3 --path vendor/bundle
      - save_cache:
          paths:
          - ./vendor/bundle
          key: v1-dependencies-{{ checksum "Gemfile.lock" }}
      - run: mv config/database.yml.ci config/database.yml
      - run: bundle exec rake db:create
      - run: bundle exec rake db:schema:load
      - run:
          name: RSpec

          command: |
            mkdir /tmp/test-results
            TEST_FILES="$(circleci tests glob "spec/models/users_spec.rb" | \
              circleci tests split --split-by=timings)"
            bundle exec rspec \
              --format progress \
              --out /tmp/test-results/rspec.xml \
              --format progress \
              $TEST_FILES
      - store_test_results:
          path: /tmp/test-results
      - store_artifacts:
          path: /tmp/test-results
          destination: test-results

-Déclare écrire une liste de commandes d'étapes en «étapes».

###③database.yml.ci (fichier sur l'hôte) Comme je le vois souvent, vérifions également le fichier de configuration de la base de données sur CircleCI.

config


test: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: <%= ENV.fetch("MYSQL_USERNAME") %>
  password: <%= ENV.fetch("MYSQL_PASSWORD") %>
  host: <%= ENV.fetch("MYSQL_HOST") %>
  port: <%= ENV.fetch("MYSQL_PORT") %>
  database: ci_test

C'est la base de données habituelle.C'est le même que le fichier yml, donc je pense qu'il est presque inutile d'expliquer. Au fait, nous utilisons des variables d'environnement.

C'est la fin de l'explication du fichier de paramètres. Après cela, le test est exécuté à chaque fois que vous git push. Voici l'écran d'exécution du test. Assurez-vous que tout est réussi. (* Pour la deuxième base de données à partir du haut, il n'y a pas de problème tant que false n'est pas affiché. Le conteneur de base de données démarrera normalement et sera marqué comme terminé)

Capture d'écran 2020-10-23 10.27.33.png

Je pense que la marque de fin de test automatique sera affichée sur la demande de tirage de github comme indiqué ci-dessous. Capture d'écran 2020-10-23 10.31.32.png

#Résumé / impression La formule CircleCI étant compétente, la formule résout la plupart des questions. Il semble facile d'introduire des tests automatisés. Cependant, cela semble un peu difficile pour le déploiement automatique, je voudrais donc contester tout en passant en revue les connaissances d'AWS et de Docker.

#référence [Livre] "Introduction à la pratique CircleCI ──CI/La vitesse de développement et la qualité apportées par CD Masato Urai(Écrit par),Tomoya Otake(Écrit par),Kim pays occidental(Écrit par) 』

【qiita】 『Je viens de démarrer CircleCI, donc je l'ai résumé d'une manière facile à comprendre.』 『[Circle CI] Présentation de l'application Rails (à propos du fichier de configuration)

Recommended Posts

[Challenge CircleCI from 0] Construire un test automatisé (Rails6.0, mysql8.0, Rspec)
[Challenge CircleCI from 0] Apprenez les bases de CircleCI
[Challenge CircleCI from 0] Construire un test automatisé (Rails6.0, mysql8.0, Rspec)
[Rails] Test avec RSpec
[Rails] De la préparation du test au test unitaire du modèle [RSpec]
[Rails] Code de test à l'aide de Rspec
[Rails] À propos du test de réponse Rspec
[rails] Faisons un test unitaire avec Rspec!
[Circle CI] J'étais accro au test automatique de Circle CI (rails + mysql) [Memo]
[Challenge CircleCI from 0] Apprenez les bases de CircleCI
[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
[Ruby On Rails] Erreur de test utilisant le client RSpec MySQL n'est pas connecté