[Circle CI] J'étais accro au test automatique de Circle CI (rails + mysql) [Memo]

introduction

Notez que j'étais accro à essayer de faire des tests automatisés d'applications Rails en utilisant CircleCI. Surtout la connexion avec le conteneur mysql ne fonctionnait pas. Conserver le contenu des différents fichiers de paramétrage et des contre-mesures contre les erreurs sous forme de mémorandum.

environnement

CircleCI  2.1
Bundler  2.1.4
Rails 6.0.3.4
ruby 2.6.5
MySQL 5.7

L'environnement de développement est construit avec Docker-compose. La relation entre le nom du service et le nom du conteneur est la suivante.

Nom du service Nom du conteneur
web webapp_web_1
db webapp_db_1
app webapp_app_1

fichier de configuration

Le nom de l'application est webapp.

database.yml et db.env

Fichier de configuration de la base de données. Ce paramètre ne fonctionnait pas bien du côté de CircleCI, donc cette fois j'ai décidé de créer un fichier de configuration de base de données pour CircleCI en me référant à l'article suivant. Par conséquent, les paramètres ici n'ont rien à voir avec CircleCI. [Mémo de configuration CircleCI 2.0](https://qiita.com/toyoken/items/16f3b6df06bbe393e644#mysql%E3%81%A8%E3%81%AE%E7%96%8E%E9%80%9A%E8% A8% AD% E5% AE% 9A% E3% 81% AE% E5% 89% 8D% E3% 81% AB "Mémo de réglage CircleCI 2.0")

config/database.yml


default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: <%= ENV.fetch('MYSQL_USER') { 'root' } %>
  password: <%= ENV.fetch('MYSQL_PASSWORD') { 'rootpass' } %>
  port: 3306
  host: db
  
development:
  <<: *default
  database: webapp_development
    
test:
  <<: *default
  database: webapp_test

environments/db.env


MYSQL_ROOT_USER=root
MYSQL_ROOT_PASSWORD=rootpass
MYSQL_USER=kagamiya
MYSQL_PASSWORD=kagamiya

Vous n'aurez peut-être pas besoin de définir le port. host: db est le nom du service pour Docker-compose. Je ne pense pas que vous ayez besoin de {'root'} de ENV.fetch.

database.yml.ci Fichier de configuration de base de données pour CI. Utilisez ceci pour des tests automatisés avec CircleCI.

yaml:config/database.yml.ci


test:
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: 'root'
  port: 3306
  host: '127.0.0.1'
  database: webapp_test

config.yml Le fichier de configuration essentiel de CircleCI. Cliquez ici pour référence. Automatiser les tests avec CircleCI

.circleci/config.yml


version: 2.1 #Spécification de version

executors:  
  default:  
    working_directory: ~/webapp  
    docker:  
      - image: circleci/ruby:2.6.5-node
        environment:  
          BUNDLER_VERSION: 2.1.4
          RAILS_ENV: test
          DB_HOST: 127.0.0.1
          DB_USERNAME: 'root'
          DB_PASSWORD: ''
      - image: circleci/mysql:5.7 
        environment:
          MYSQL_ROOT_HOST: '%'
          MYSQL_ALLOW_EMPTY_PASSWORD: 'true'

commands:  
  setup:  
    steps:  
      - checkout  
      - run:  
          name: Update bundler #Mettre à jour vers la version 2 du bundler
          command: gem update bundler  

      - run:  
          name: Which bundler? #Confirmation de version
          command: bundle -v  

      - restore_cache: #Lire le cache
          keys:  
            - gem-cache-v1-{{ checksum "Gemfile.lock" }}  
            - gem-cache-v1-  

      - run:  
          name: Bundle Install  
          command: bundle check --path vendor/bundle || bundle install --deployment  

      - save_cache: #Sauvegardez le cache
          key: gem-cache-v1-{{ checksum "Gemfile.lock" }}  
          paths:  
            - vendor/bundle  
      
      #Les éléments suivants sont requis lors de l'utilisation de Webpacker avec Rails 6
      - restore_cache:  
          keys:  
            - yarn-cache-v1-{{ checksum "yarn.lock" }}  
            - yarn-cache-v1-  

      - run:  
          name: Yarn Install  
          command: yarn install --cache-folder ~/.cache/yarn  

      - save_cache:  
          key: yarn-cache-v1-{{ checksum "yarn.lock" }}  
          paths:  
            - ~/.cache/yarn  

jobs:  
  test:  
    executor: default  
    environment:  
      RAILS_ENV: test  
    steps:  
      - checkout  
      - setup  
      - run:  
          name: Wait for DB  
          command: dockerize -wait tcp://127.0.0.1:3306 -timeout 90s  
      
      - run:
          name: Use specific database.yml #Utiliser les paramètres de base de données pour CircleCI
          command: mv config/database.yml.ci config/database.yml

      - run:  
          name: Database setup  
          command: |
            bin/rails db:create
            bin/rails db:schema:load --trace  

      - run: #Exécutez des tests réguliers et des tests système
          name: Rails Test  
          command: |  
            bin/rails test  
            bin/rails test:system  

workflows:  
  build_and_test:  
    jobs:  
      - test  

(Lors de l'utilisation de la série MySQL 8, il semble qu'il soit nécessaire d'ajouter une description, j'ai donc décidé d'utiliser 5.7. De plus, la commande yarn ne pouvait pas être utilisée pour les images ruby sans nœud. )

J'étais particulièrement accro aux paramètres de la base de données. Parce que je n'ai pas vraiment compris la spécification MySQL (ou même maintenant) ... Dans un premier temps, suite à l'article de référence,

python


DB_USER: 'kagamiya'
DB_PASSWORD: 'kagamiya'

MYSQL_USER: 'kagamiya'
MYSQL_PASSWORD: 'kagamiya'

Je disais. Cependant, en premier lieu, un utilisateur nommé kagamiya n'est pas enregistré dans l'image MySQL de CircleCI. (Bien sûr, il se trouve dans le conteneur db de l'environnement de développement) Par conséquent, root est inévitablement utilisé, alors j'ai fait ce qui suit.

python


DB_USER: 'root'
DB_PASSWORD: 'rootpass'

MYSQL_USER: 'root'
MYSQL_PASSWORD: 'rootpass'

Mais ça n'a pas marché. C'est parce qu'il n'y a pas de mot de passe par défaut pour l'utilisateur root (probablement). C'est pourquoi vider le mot de passe ne fonctionne pas.

python


DB_USER: 'root'
DB_PASSWORD: ''

MYSQL_USER: 'root'
MYSQL_PASSWORD: ''

Il semble donc que l'utilisateur doit se connecter en tant que root et le mot de passe en tant que MYSQL_ALLOW_EMPTY_PASSWORD: 'true' (autoriser vide?).

python


      - image: circleci/ruby:2.6.5-node
        environment:  
          BUNDLER_VERSION: 2.1.4
          RAILS_ENV: test
          DB_HOST: 127.0.0.1
          DB_USERNAME: 'root'
          DB_PASSWORD: ''
      - image: circleci/mysql:5.7 
        environment:
          MYSQL_ALLOW_EMPTY_PASSWORD: 'true'

J'ai jeté à nouveau une erreur ici.

Access denied for user 'root'@'127.0.0.1'

J'ai eu du mal à comprendre ici, mais il semble qu'il n'y ait pas d'utilisateur nommé 'root' @ '12 7.0.0.1 '. En regardant la liste des utilisateurs mysql, je vois "root" @ "%" et "root" @ "localhost", mais pas "root" @ "12 7.0.0.1". Que ce soit pour utiliser localhost ou 127.0.0.1 pour le nom d'hôte mysql (DB_HOST) semble être un autre problème. Cependant, puisque la connexion est la priorité la plus élevée maintenant, nous allons spécifier% comme hôte racine. (% Signifie "tous les hôtes", mais je ne suis pas sûr)

python


MYSQL_ROOT_HOST: '%'
MYSQL_ALLOW_EMPTY_PASSWORD: 'true'

Quelle que soit la raison, j'ai enfin pu me connecter.

Ensuite, l'image CircleCI utilise ses propres paramètres de base de données, alors écrasez database.yml par database.yml.ci. Ajoutez un traitement avant de configurer la base de données.

python


      - run:
          name: Use specific database.yml #Utiliser les paramètres de base de données pour CircleCI
          command: mv config/database.yml.ci config/database.yml

Dans mon environnement, j'étais en colère que la base de données spécifiée (webapp_test) n'existait pas, j'ai donc créé une base de données.

python


      - run:  
          name: Database setup  
          command: |
            bin/rails db:create
            bin/rails db:schema:load --trace  

(Cela peut provoquer une erreur dans les exécutions suivantes et suivantes ...?)

Sommaire

Je ne comprends pas entièrement les spécifications MySQL et le contenu de config. De nombreuses personnes ont téléchargé des échantillons de configuration, mais il semble qu'il y en ait peu qui expliquent en détail. Par conséquent, si une erreur se produit dans une partie que vous ne comprenez pas, il y a de fortes chances que vous en soyez à nouveau accro ...

Recommended Posts

[Circle CI] J'étais accro au test automatique de Circle CI (rails + mysql) [Memo]
J'étais accro au test Spring-Batch
J'étais accro au record du modèle associé
J'étais accro au réglage de laradock + VSCode + xdebug
J'étais accro à la méthode du rouleau
J'étais accro au paramètre API version min23 de registerTorchCallback
Un mémo sobrement accro à la demande de multipart / form-data
[Rails] J'étais accro aux paramètres nginx lors de l'utilisation d'Action Cable.
J'étais accro à un simple test de Jedis (bibliothèque Java-> Redis)
Enregistré parce que j'étais accro à l'entrée standard de la classe Scanner
Une histoire à laquelle j'étais accro à deux reprises avec le paramètre de démarrage automatique de Tomcat 8 sur CentOS 8
J'étais accro à NoSuchMethodError dans Cloud Endpoints
La partie à laquelle j'étais accro dans "Introduction à Ajax dans les applications Web Java" de NetBeans
Notez que j'étais accro aux paramètres du projet Android d'IntelliJ IDEA
Ce à quoi j'étais accro lors de l'introduction de la bibliothèque JNI
J'étais accro à la configuration de default_url_options avec l'introduction de la conception de Rails
J'étais accro à la mise à jour de la déclaration dans MyBatis
Ce à quoi j'étais accro avec l'API REST Redmine
L'histoire à laquelle j'étais accro lors de la création de STS
J'étais accro au démarrage de sbt
J'ai vérifié l'outil de création automatique de tests unitaires (version fin 2019)
[Rails / Heroku / MySQL] Comment réinitialiser la base de données de l'application Rails sur Heroku
Ce à quoi j'étais accro lors de la mise en œuvre de l'authentification Google avec des rails
À propos de la question pour laquelle j'étais accro à l'utilisation de hashmap
J'ai pu déployer l'application Docker + laravel + MySQL sur Heroku!
Mémorandum: Ce à quoi j'étais accro quand j'ai frappé l'API de comptabilité freee
Une histoire à laquelle j'étais accro lors du test de l'API à l'aide de MockMVC
J'étais accro à l'idée de toucher MySQL 8.0 avec un sentiment de 5.7. Problème de configuration My.cnf
Problèmes auxquels j'étais accro lors de la création de l'environnement digdag avec docker
J'étais accro au scrollview car je ne pouvais pas appuyer sur la taille variable UIView
J'étais accro aux tests unitaires avec l'opérateur de tampon dans RxJava
[Rails] La cause de l'impossibilité de publier des messages était form_with
Après tout, je voulais prévisualiser le contenu de mysql avec Docker ...
J'étais accro à l'utilisation de RXTX avec Sierra
Bouton [Rails] pour revenir en haut de la page
[Rails] J'ai essayé de faire passer la version de Rails de 5.0 à 5.2
J'ai essayé d'organiser la session en Rails
Je veux var_dump le contenu de l'intention
Code utilisé pour connecter Rails 3 à PostgreSQL 10
J'étais accro à faire onActivityResult () avec DialogFragment
J'étais accro à ne pas pouvoir me connecter à AWS-S3 à partir du conteneur Docker
J'étais un peu accro à la comparaison S3 Checksum, alors prenez note.
J'ai été englouti par l'obscurité de Romaji essayant de convertir mon nom en Romaji
Comment installer Docker dans l'environnement local d'une application Rails existante [Rails 6 / MySQL 8]
Notez que j'étais accro au traitement par lots avec Spring Boot
Pour ceux qui souhaitent utiliser MySQL pour la base de données dans la construction de l'environnement de Rails6 ~.
[Rails] Je souhaite afficher la destination du lien de link_to dans un onglet séparé
05. J'ai essayé de supprimer la source de Spring Boot
J'ai essayé de réduire la capacité de Spring Boot
Je veux connaître la réponse de l'application Janken
[Rails] Je ne sais pas comment utiliser le modèle ...
Je souhaite afficher le nom de l'affiche du commentaire