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.
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 |
Le nom de l'application est webapp.
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 ...?)
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