[Circle CI] Ich war süchtig nach dem automatischen Test von Circle CI (Rails + MySQL) [Memo]

Einführung

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.

Umgebung

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

Einstellungsdatei

Der App-Name lautet webapp.

database.yml und db.env

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 ...?)

Zusammenfassung

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

[Circle CI] Ich war süchtig nach dem automatischen Test von Circle CI (Rails + MySQL) [Memo]
Ich war süchtig nach dem Spring-Batch-Test
Ich war süchtig nach der Aufzeichnung des zugehörigen Modells
Ich war süchtig nach Laradock + VSCode + xdebug
Ich war süchtig nach der Rollmethode
Ich war süchtig nach der API-Version min23 von registerTorchCallback
Ein Memo, das nüchtern von der Anfrage nach mehrteiligen / Formulardaten abhängig war
[Rails] Ich war süchtig nach den Nginx-Einstellungen, als ich Action Cable verwendete.
Ich war süchtig nach einem einfachen Test von Jedis (Java-> Redis-Bibliothek)
Aufgenommen, weil ich süchtig nach der Standardeingabe der Scannerklasse war
Eine Geschichte, der ich mit der automatischen Starteinstellung von Tomcat 8 unter CentOS 8 zweimal verfallen war
Ich war süchtig nach NoSuchMethodError in Cloud-Endpunkten
Der Teil, dem ich in "Einführung in Ajax in Java-Webanwendungen" von NetBeans verfallen war
Beachten Sie, dass ich von den Einstellungen des Android-Projekts von IntelliJ IDEA abhängig war
Wovon ich bei der Einführung der JNI-Bibliothek süchtig war
Ich war süchtig danach, default_url_options mit der Einführung von Rails zu setzen
Ich war süchtig danach, die Update-Anweisung in MyBatis zu wiederholen
Was ich mit der Redmine REST API süchtig gemacht habe
Die Geschichte, nach der ich beim Einrichten von STS süchtig war
Ich war süchtig danach, sbt zu starten
Ich habe das automatische Tool zum Erstellen von Komponententests überprüft (Version Ende 2019).
[Rails / Heroku / MySQL] So setzen Sie die Datenbank der Rails-App auf Heroku zurück
Wovon ich süchtig war, als ich die Google-Authentifizierung mit Rails implementierte
Über die Sache, dass ich süchtig danach war, wie man Hashmap benutzt
Ich konnte die Docker + Laravel + MySQL App für Heroku bereitstellen!
Memorandum: Wovon ich süchtig war, als ich auf die Accounting Freee API traf
Eine Geschichte, der ich beim Testen der API mit MockMVC verfallen war
Ich war süchtig danach, MySQL 8.0 mit einem 5.7-Gefühl zu berühren. My.cnf-Konfigurationsproblem
Probleme, denen ich beim Erstellen der Digdag-Umgebung mit Docker verfallen war
Ich war süchtig nach Scrollview, weil ich nicht auf die UIView mit variabler Größe tippen konnte
Ich war süchtig nach Unit-Tests mit dem Pufferoperator in RxJava
[Rails] Die Ursache dafür, dass nicht gepostet werden konnte, war in form_with
Immerhin wollte ich den Inhalt von MySQL mit Docker in der Vorschau anzeigen ...
Ich war süchtig nach RXTX mit Sierra
Schaltfläche [Schienen], um zum Anfang der Seite zurückzukehren
[Rails] Ich habe versucht, die Version von Rails von 5.0 auf 5.2 zu erhöhen
Ich habe versucht, die Sitzung in Rails zu organisieren
Ich möchte den Inhalt der Absicht var_dump
Code zum Verbinden von Rails 3 mit PostgreSQL 10
Ich war süchtig danach, onActivityResult () mit DialogFragment zu machen
Ich war süchtig danach, vom Docker-Container aus keine Verbindung zu AWS-S3 herstellen zu können
Ich war ein wenig süchtig nach dem S3-Prüfsummenvergleich, machen Sie sich also eine Notiz.
Ich wurde von der Dunkelheit Romajis verschluckt, als ich versuchte, meinen Namen in Romaji umzuwandeln
So installieren Sie Docker in der lokalen Umgebung einer vorhandenen Rails-App [Rails 6 / MySQL 8]
Beachten Sie, dass ich süchtig nach Stapelverarbeitung mit Spring Boot war
Für diejenigen, die MySQL für die Datenbank in der Umgebungskonstruktion von Rails6 ~ verwenden möchten.
[Rails] Ich möchte das Linkziel von link_to auf einer separaten Registerkarte anzeigen
05. Ich habe versucht, die Quelle von Spring Boot zu löschen
Ich habe versucht, die Kapazität von Spring Boot zu reduzieren
Ich möchte die Antwort der Janken-App wissen
[Rails] Ich weiß nicht, wie ich das Modell verwenden soll ...
Ich möchte den Namen des Posters des Kommentars anzeigen