Beachten Sie, dass ich süchtig danach war, automatisierte Tests von Rails-Apps mit CircleCI durchzuführen. Insbesondere die Verbindung mit dem MySQL-Container hat nicht funktioniert. Den Inhalt verschiedener Einstellungsdateien und Gegenmaßnahmen gegen Fehler als Memorandum aufbewahren.
CircleCI 2.1
Bundler 2.1.4
Rails 6.0.3.4
ruby 2.6.5
MySQL 5.7
Die Entwicklungsumgebung wurde mit Docker-compose erstellt. Die Beziehung zwischen dem Dienstnamen und dem Containernamen ist wie folgt.
Dienstname | Containername |
---|---|
web | webapp_web_1 |
db | webapp_db_1 |
app | webapp_app_1 |
Der App-Name lautet webapp.
Datenbankkonfigurationsdatei. Diese Einstellung funktionierte auf der CircleCI-Seite nicht gut, daher habe ich dieses Mal beschlossen, eine Datenbankeinstellungsdatei für CircleCI zu erstellen, indem ich auf den folgenden Artikel verwiesen habe. Daher haben die Einstellungen hier nichts mit CircleCI zu tun. [CircleCI 2.0-Einstellungsnotiz](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 "CircleCI 2.0-Einstellungsnotiz")
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
Möglicherweise müssen Sie den Port nicht einstellen. host: db ist der Dienstname für Docker-compose. Ich glaube nicht, dass Sie {'root'} von ENV.fetch benötigen.
database.yml.ci Datenbankkonfigurationsdatei für CI. Verwenden Sie dies für automatisierte Tests mit 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 Die wesentliche CircleCI-Konfigurationsdatei. Klicken Sie hier als Referenz. Testen mit CircleCI automatisieren
.circleci/config.yml
version: 2.1 #Versionsspezifikation
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 #Update auf Version 2 von Bundler
command: gem update bundler
- run:
name: Which bundler? #Versionsbestätigung
command: bundle -v
- restore_cache: #Cache lesen
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: #Speichern Sie den Cache
key: gem-cache-v1-{{ checksum "Gemfile.lock" }}
paths:
- vendor/bundle
#Folgendes ist erforderlich, wenn Sie Webpacker mit Rails 6 verwenden
- 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 #Verwenden Sie die Datenbankeinstellungen für 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: #Führen Sie regelmäßige Tests und Systemtests durch
name: Rails Test
command: |
bin/rails test
bin/rails test:system
workflows:
build_and_test:
jobs:
- test
(Bei Verwendung der MySQL 8-Serie scheint es notwendig zu sein, eine Beschreibung hinzuzufügen, daher habe ich mich für 5.7 entschieden. Außerdem konnte der Garnbefehl nicht für Rubinbilder ohne Knoten verwendet werden. )
Ich war besonders süchtig nach den Einstellungen rund um die Datenbank. Weil ich die MySQL-Spezifikation (oder sogar jetzt) nicht wirklich verstanden habe ... Nach dem Referenzartikel zunächst
python
DB_USER: 'kagamiya'
DB_PASSWORD: 'kagamiya'
MYSQL_USER: 'kagamiya'
MYSQL_PASSWORD: 'kagamiya'
Ich habe gesagt. Der Benutzer kagamiya ist jedoch überhaupt nicht im MySQL-Image von CircleCI registriert. (Natürlich befindet es sich im Datenbankcontainer der Entwicklungsumgebung) Daher wird unweigerlich root verwendet, daher habe ich Folgendes getan.
python
DB_USER: 'root'
DB_PASSWORD: 'rootpass'
MYSQL_USER: 'root'
MYSQL_PASSWORD: 'rootpass'
Aber es hat nicht funktioniert. Dies liegt daran, dass es (wahrscheinlich) kein Standardkennwort für den Root-Benutzer gibt. Deshalb funktioniert das Leeren des Passworts nicht.
python
DB_USER: 'root'
DB_PASSWORD: ''
MYSQL_USER: 'root'
MYSQL_PASSWORD: ''
Es scheint also, dass der Benutzer eine Verbindung als root und das Passwort als MYSQL_ALLOW_EMPTY_PASSWORD herstellen muss: 'true' (leer zulassen?).
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'
Ich habe hier wieder einen Fehler gemacht.
Access denied for user 'root'@'127.0.0.1'
Ich hatte hier Schwierigkeiten zu verstehen, aber es scheint, dass es keinen Benutzer mit dem Namen 'root' @ '12 7.0.0.1 'gibt. Wenn ich mir die MySQL-Benutzerliste ansehe, sehe ich 'root' @ '%' und 'root' @ 'localhost', aber nicht 'root' @ '12 7.0.0.1 '. Die Verwendung von localhost oder 127.0.0.1 für den MySQL-Hostnamen (DB_HOST) scheint ein weiteres Problem zu sein. Da die Verbindung jetzt die höchste Priorität hat, geben wir% als Root-Host an. (% Bedeutet "alle Hosts", aber ich bin nicht sicher)
python
MYSQL_ROOT_HOST: '%'
MYSQL_ALLOW_EMPTY_PASSWORD: 'true'
Was auch immer der Grund war, ich konnte mich endlich verbinden.
Als Nächstes verwendet das CircleCI-Image seine eigenen Datenbankeinstellungen. Überschreiben Sie daher database.yml mit database.yml.ci. Fügen Sie die Verarbeitung hinzu, bevor Sie die Datenbank einrichten.
python
- run:
name: Use specific database.yml #Verwenden Sie die Datenbankeinstellungen für CircleCI
command: mv config/database.yml.ci config/database.yml
In meiner Umgebung war ich wütend, dass die angegebene Datenbank (webapp_test) nicht vorhanden war, und habe daher eine Datenbank erstellt.
python
- run:
name: Database setup
command: |
bin/rails db:create
bin/rails db:schema:load --trace
(Dies kann bei der nächsten und nachfolgenden Ausführung zu einem Fehler führen ...?)
Ich verstehe die MySQL-Spezifikationen und den Inhalt der Konfiguration nicht vollständig. Viele Leute haben Konfigurationsbeispiele hochgeladen, aber es scheint, dass es nur wenige gibt, die dies im Detail erklären. Wenn daher ein Fehler in einem Teil auftritt, den Sie nicht verstehen, besteht eine hohe Wahrscheinlichkeit, dass Sie erneut davon abhängig werden ...
Recommended Posts