Pas à pas, nous avançons vers notre objectif. Aujourd'hui, nous devons résoudre de nombreuses tâches :
La première chose que nous faisons est de mettre à jour notre branche principale dans le projet (git pull) et d'en créer une nouvelle avec le nom de notre tâche - STEP_5_JRTB-1 (git checkout -b STEP_5_JRTB-1). Je vous le rappelle : nous avons renommé les branches afin qu'il soit possible de trier l'enchaînement des tâches dans le projet uniquement par nom. Cela vous permettra de passer rapidement d’une étape à l’autre. Vous pouvez désormais travailler en toute tranquillité. Nous devons ajouter trois dépendances :
Il est désormais clair que la base de données n'a jamais démarré avec nos paramètres. L’erreur est la même, alors isolons-la de la feuille :
Il ne semble y avoir plus d'erreurs, vous pouvez donc voir s'il y aura accès. Mais malheureusement, il n'y a plus d'accès... Rien : nous y reviendrons plus loin ! Pour terminer docker-compose et supprimer tous les conteneurs, vous devez écrire : docker-compose -f docker-compose-test.yml down Ici, nous avons spécifié le fichier à supprimer. Ce qu'il faut faire? Cherchons-le sur Google : peut-être que quelqu'un l'a fait mieux. La requête la plus simple : « exemple de mysql dans docker-compose » nous aide à trouver un lien vers une ressource médium. Ils donnent cet exemple :
- Ajouter une voie de migration. Ici, nous allons configurer le déploiement de la base de données pour le projet.
- Ajoutez un schéma de base de données.
- Ajoutez une couche de référentiel.
- Ajoutez une commande pour les statistiques du bot.
- Écrivez des tests, après tout.
Ajout d'une voie de migration
Pour ajouter Flyway, vous devez disposer d'une base de données, que nous ajouterons comme autre service dans docker-compose. La dernière fois , j'ai dit que docker-compose avait une section de services, qui est précisément responsable de l'ajout et de la gestion d'une certaine infrastructure - c'est-à-dire un ensemble d'applications/bases de données/messagers, etc.J'ai déjà parlé de ce qu'est Flyway et de comment l'ajouter à une application SpringBoot . Je vous conseille de vous rafraîchir la mémoire avant de lire cet article. Vous pouvez également lire le fichier README.md du projet avec une démonstration de l'article sur Flyway + SpringBoot. |
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
La première dépendance est chargée d'ajouter FlyWay au projet, la seconde ajoute la possibilité de se connecter à la base de données MySQL. Le troisième est SpringBoot starter, qui lance toute la magie de l'utilisation d'une base de données au Spring. Et ajoutons également un lombok pour ne pas écrire de getters et de setters :
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
Nous avons maintenant besoin d'une base de données pour le développement. Nous allons le créer pour l'instant ( jusqu'à ce que je trouve une meilleure idée ) en tant que fichier docker-compose distinct et en tant que fichier distinct pour application.properties. Il existe dans le développement (et dans l'écosystème Spring en particulier) des profils. Selon le profil, différents paramètres sont lancés pour le fonctionnement. Je pense qu'à l'avenir, nous combinerons docker-compose en un seul fichier et veillerons à ce qu'une seule base de données soit lancée pour le développement sur les paramètres dont nous avons besoin. Pour l'instant, nous allons faire ceci :
- Créons un fichier à la racine du projet docker-compose-test.yml, dans lequel seule la base de données avec ses propres paramètres sera lancée.
- Créons un fichier application-test.properties avec des paramètres qui correspondent aux paramètres du fichier docker-compose-test.yml.
jrtb-db:
image: mysql
restart: always
container_name: dev-jrtb-db
ports:
- "3306:3306"
environment:
MYSQL_DATABASE: "dev_jrtb_db"
MYSQL_USER: root
MYSQL_PASSWORD: root
Après cela, je crée docker-compose-test.yml à la racine du projet :
version: '3.1'
services:
jrtb-db:
image: mysql
restart: always
container_name: dev-jrtb-db
ports:
- "3306:3306"
environment:
MYSQL_DATABASE: "dev_jrtb_db"
MYSQL_USER: root
MYSQL_PASSWORD: root
Pour exécuter ce fichier particulier afin qu'il fonctionne avec docker-compose, vous devez utiliser l' indicateur -f dans la requête . Cela signifie que le nom du fichier lancé sera fourni, plutôt que le standard docker-compose.yml utilisé. Par conséquent, la requête ressemblera à ceci : docker-compose -f docker-compose-test.yml up -d Il s'avère que nous disons d'abord quel fichier prendre ( -f docker-compose-test.yml ), puis nous disons que nous devons augmenter les services et le faire en mode démon ( up -d ) - c'est-à-dire pour que le processus s'exécute en dehors de la session de terminal dans laquelle cette commande a été lancée. Nous lançons et essayons de nous connecter à la base de données pour nous assurer qu'elle est opérationnelle et peut être utilisée. Pour ce faire, ouvrez le MySQL Workbench familier ( nous en avons parlé ici ) et créez une nouvelle connexion : Nous devons remplir les champs suivants :
- Nom de la connexion - nom de la connexion - éventuellement, DEV_JRTB_DB ;
- Nom d'hôte - voici l'adresse où la base de données est déployée. Dans notre cas, tout restera tel qu'il était : 127.0.0.1 , ou localhost ;
- nom d'utilisateur - ici sera root, comme nous l'avons écrit dans docker-compose ;
- mot de passe - également root.
On a:
dev-jrtb-db | 2021-02-28 10:14:28+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:28+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:28+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:28+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:29+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:29+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:30+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:30+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:30+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:30+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:32+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:32+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:32+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:32+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:34+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:34+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:34+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:34+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:37+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:37+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:37+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:37+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:44+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:44+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:44+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:44+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:58+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:58+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:58+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:58+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD
2021-02-28 11:03:37+00:00 [ERREUR] [Point d'entrée] : la base de données n'est pas initialisée et l'option de mot de passe n'est pas spécifiée dev-jrtb-db | Vous devez spécifier l'un des MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD et MYSQL_RANDOM_ROOT_PASSWORD.
Autrement dit, il doit déterminer le mot de passe de l'utilisateur root - l'utilisateur principal. Bon, maintenant nous allons mettre à jour notre fichier :
version: '3.1'
services:
jrtb-db:
image: mysql
restart: always
container_name: dev-jrtb-db
ports:
- "3306:3306"
environment:
MYSQL_DATABASE: "dev_jrtb_db"
MYSQL_ROOT_PASSWORD: root
Nous avons supprimé ces variables pour l'utilisateur et le mot de passe et ajouté uniquement le mot de passe de l'utilisateur root. Cela signifie que l'utilisateur root aura désormais un mot de passe root. C'est du moins ce que nous supposons. Maintenant, exécutons-le et voyons ce qui se passe : docker-compose -f docker-compose-test.yml up -d Et voyons immédiatement ce que les journaux nous disent : docker-compose -f docker-compose-test.yml logs
Regardons:
Attaching to dev-jrtb-db dev-jrtb-db | 2021-02-28 11:20:40+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 11:20:41+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 11:20:41+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 11:20:41+00:00 [Note] [Entrypoint]: Initializing database files dev-jrtb-db | 2021-02-28T11:20:41.083803Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.23) initializing of server in progress as process 43 dev-jrtb-db | 2021-02-28T11:20:41.088457Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. dev-jrtb-db | 2021-02-28T11:20:41.447990Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. dev-jrtb-db | 2021-02-28T11:20:42.672093Z 6 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option. dev-jrtb-db | 2021-02-28 11:20:45+00:00 [Note] [Entrypoint]: Database files initialized dev-jrtb-db | 2021-02-28 11:20:45+00:00 [Note] [Entrypoint]: Starting temporary server dev-jrtb-db | 2021-02-28T11:20:45.893664Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.23) starting as process 88 dev-jrtb-db | 2021-02-28T11:20:45.921695Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. dev-jrtb-db | 2021-02-28T11:20:46.088339Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. dev-jrtb-db | 2021-02-28T11:20:46.207499Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: /var/run/mysqld/mysqlx.sock dev-jrtb-db | 2021-02-28T11:20:46.369170Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed. dev-jrtb-db | 2021-02-28T11:20:46.369357Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel. dev-jrtb-db | 2021-02-28T11:20:46.371501Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory. dev-jrtb-db | 2021-02-28T11:20:46.402227Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.23' socket: '/var/run/mysqld/mysqld.sock' port: 0 MySQL Community Server - GPL. dev-jrtb-db | 2021-02-28 11:20:46+00:00 [Note] [Entrypoint]: Temporary server started. dev-jrtb-db | Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it. dev-jrtb-db | Warning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Skipping it. dev-jrtb-db | Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it. dev-jrtb-db | Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it. dev-jrtb-db | 2021-02-28 11:20:49+00:00 [Note] [Entrypoint]: Creating database dev_jrtb_db dev-jrtb-db | dev-jrtb-db | 2021-02-28 11:20:49+00:00 [Note] [Entrypoint]: Stopping temporary server dev-jrtb-db | 2021-02-28T11:20:49.187996Z 11 [System] [MY-013172] [Server] Received SHUTDOWN from user root. Shutting down mysqld (Version: 8.0.23). dev-jrtb-db | 2021-02-28T11:20:50.925075Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.23) MySQL Community Server - GPL. dev-jrtb-db | 2021-02-28 11:20:51+00:00 [Note] [Entrypoint]: Temporary server stopped dev-jrtb-db | dev-jrtb-db | 2021-02-28 11:20:51+00:00 [Note] [Entrypoint]: MySQL init process done. Ready for start up. dev-jrtb-db | dev-jrtb-db | 2021-02-28T11:20:51.420058Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.23) starting as process 1 dev-jrtb-db | 2021-02-28T11:20:51.427384Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. dev-jrtb-db | 2021-02-28T11:20:51.577244Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. dev-jrtb-db | 2021-02-28T11:20:51.677659Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock dev-jrtb-db | 2021-02-28T11:20:51.787156Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed. dev-jrtb-db | 2021-02-28T11:20:51.787325Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel. dev-jrtb-db | 2021-02-28T11:20:51.789742Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory. dev-jrtb-db | 2021-02-28T11:20:51.812100Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.23' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL.
version: '3.3'
services:
db:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: 'db'
# So you don't have to use root, but you can if you like
MYSQL_USER: 'user'
# You can use whatever password you like
MYSQL_PASSWORD: 'password'
# Password for root access
MYSQL_ROOT_PASSWORD: 'password'
ports:
# <Port exposed> : < MySQL Port running inside container>
- '3306:3306'
expose:
# Opens port 3306 on the container
- '3306'
# Where our data will be persisted
volumes:
- my-db:/var/lib/mysql
# Names our volume
volumes:
my-db:
Nous l'adaptons à nos besoins et obtenons :
version: '3.1'
services:
jrtb-db:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: 'dev_jrtb_db'
# So you don't have to use root, but you can if you like
MYSQL_USER: 'dev_jrtb_db_user'
# You can use whatever password you like
MYSQL_PASSWORD: 'dev_jrtb_db_password'
# Password for root access
MYSQL_ROOT_PASSWORD: 'root'
ports:
# <Port exposed> : < MySQL Port running inside container>
- '3306:3306'
expose:
# Opens port 3306 on the container
- '3306'
On lance cette option avec la commande que nous connaissons déjà : docker-compose -f docker-compose-test.yml up -d On essaie à nouveau d'accéder à la base de données via MySQLWorkBench : Enfin, l'accès est apparu. Mais maintenant, je me demande ce qui a influencé cela. Je pèche sur cette partie :
expose:
# Opens port 3306 on the container
- '3306'
C'est simple à vérifier : sans cela, rien ne devrait fonctionner :D. Vérifions : supprimons cette partie, redémarrez docker-compose : docker-compose -f docker-compose-test.yml down docker-compose -f docker-compose-test.yml up Nous essayons de nous connecter à la base de données via workbench : tout est bien. Ensuite, la seule option est la version de la base de données. Il indique clairement 5.7, c'est-à-dire que si vous le modifiez vers la dernière version, cela ne devrait pas fonctionner. Je l'ai redémarré - et ça ne marche vraiment pas... Apparemment, ils ont quelques problèmes avec l'image docker sur la dernière version. D'accord pas de problème. Cela arrive souvent avec les logiciels libres. Nous utiliserons la version 5.7. Voyons si nous avons besoin d'une base de données - dev_jrtb_db. Pour ce faire, exécutez la commande Query dans MySQL Workbench SHOW DATABASES : Oui, elle est présente dans la sortie. Super, nous pouvons passer à autre chose. Ensuite, ajoutons notre première migration. Sur la base des tâches de l'article « Planification de projet : mesurer deux fois, couper une fois », nous allons créer notre premier tableau tg_user. Toutes les migrations seront situées dans le dossier projectDir/src/main/resources/db/migration et le nom sera : V00001__add_tg_user_table.sql . Pourquoi il y a un tel nom dans ce dossier - je l'ai décrit dans l'article sur Spring + flyway. Voici à quoi ressemblera notre première migration : V00001__add_tg_user_table.sql :
-- ensure that the table with this name is removed before creating a new one.
DROP TABLE IF EXISTS tg_user;
-- Create tg_user table
CREATE TABLE tg_user (
chat_id VARCHAR(100),
active BOOLEAN
);
Autrement dit, nous créons ici simplement un tableau d'un utilisateur qui n'a qu'un identifiant de chat (un élément unique qui peut être utilisé pour fonctionner comme un identifiant dans le tableau) et son état - actif ou inactif. Ainsi, si le bot est arrêté, les informations d’abonnement resteront et pourront être utilisées s’ils souhaitent réutiliser le bot. Aucune autre information sur l'utilisateur n'est nécessaire pour l'instant. Maintenant la question principale : comment vérifier cela ? Nous devons lancer notre application. Jusqu'à présent, le fichier principal docker-compose.yml n'a aucun lien avec la base de données, et nous devons également apprendre à déboguer l'application avec la base de données. Par conséquent, lançons l'application avec Intellij IDEA. Pour tester cela, nous devrons exécuter notre méthode principale dans JavarushTelegramBotApplication. Pour séparer le travail de déploiement et de test, nous utiliserons un autre fichier avec des propriétés - application-test.properties . Avec ce modèle, nous informons Spring que ce fichier sera utilisé pour le profil de test . Lorsque nous ne spécifions pas de profil, le profil par défaut est utilisé (vérifiez cela dans vos logs lors de l'exécution de SpringBoot : cela sera écrit à ce sujet dans les premières lignes). Voici à quoi cela ressemblera :
# MySQL configurations:
spring.datasource.url=jdbc:mysql://localhost:3306/dev_jrtb_db
spring.datasource.username=dev_jrtb_db_user
spring.datasource.password=dev_jrtb_db_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# TelegramBot configurations:
bot.username=tes
bot.token=1375780501:AAE4A6Rz0BSnIGzeu896OjQnjzsMEG6_uso
Et le fichier application.properties principal sera légèrement différent :
# MySQL configurations:
spring.datasource.url=jdbc:mysql://jrtb-db:3306/jrtb_db
spring.datasource.username=jrtb_db_user
spring.datasource.password=jrtb_db_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# TelegramBot configurations:
bot.username=test.javarush_community_bot
bot.token=1375780501:AAE4A6Rz0BSnIGzeu896OjQnjzsMEG6_uso
La différence significative se situe dans le champ spring.datasource.url : dans le profil de test nous avons une URL sur localhost . Autrement dit, l'application est censée s'exécuter en dehors de Docker, ce qui est vrai, car lors du débogage, nous exécuterons notre projet dans Intellij IDEA et nous nous attendons à ce que nous ayons accès à la base de données à partir de la machine locale. Mais l'URL application.properties en contient déjà une autre - jrtb-db . Ce sera le nom de notre base de données dans docker-compose, et ainsi notre application docker pourra accéder à la base de données. Pourquoi? Par conséquent, ils se lanceront dans le même docker-compose et se connaîtront de cette manière. Cela est nécessaire pour que nous ayons une infrastructure fermée pour le projet. Mais comment lancer le profil au démarrage ? Pour cela, vous pouvez configurer le lancement de la méthode main dans Intellij IDEA. Pour cela, il y a Edit Configurations : allez dans la classe principale de JavarushTelegramBotApplication, cliquez sur la flèche verte à côté de la déclaration de la méthode principale et sélectionnez Modify Run Configuration : Saisissez les variables nécessaires et configurez le profil. Dans Intellij IDEA, l'interface de cette fenêtre de configuration a légèrement changé, je conseille donc à tout le monde de mettre à jour IDEA vers la dernière version afin que nous voyions la même image : Dans le champ Variables d'environnement , nous devons ajouter le nom du bot et les variables de jeton en utilisant le modèle suivant : variable_name1=value1 ; variable_name2=value2 . Autrement dit, clé=valeur sont séparés par des points-virgules. Dans notre cas, ce sera comme ceci : bot.token=1375780501:AAHLzsf4WhcjSdPguDwtggRS1IMu5l8;bot.username=javarush_community_bot (vous aurez un nom et un token différents pour le bot) Ensuite, sélectionnez le champ Ajouter des options de VM dans le bouton Modifier les options : Écrire : -Dspring.profiles.active =test - cela indiquera à SpringBoot d'utiliser le profil de test, ce qui signifie que les propriétés seront extraites de application-test.properties. En conséquence, cela ressemblera à ceci : Nous lançons maintenant notre base de données de test : docker-compose -f docker-compose-test.yml up Et exactement de cette façon, sans le préfixe -d, afin que les logs soient immédiatement visibles dans le terminal, le cas échéant. Et la dernière étape consiste simplement à exécuter la méthode principale. Si vous faites tout de la même manière que je l'ai décrit, vous obtiendrez : La deuxième ligne des journaux sera une description de ce que le profil de test a gagné. Nous passons par MySQLWorkbench et exécutons deux commandes pour vérifier que la migration a été déployée et que tout fonctionne (bien que cela soit visible dans les journaux de lancement de l'application, cela vaut vraiment la peine de vérifier) :
- utilisez dev_jrtb_db ;
- afficher les tableaux ;
GO TO FULL VERSION