צעד אחר צעד אנחנו מתקדמים לעבר המטרה שלנו. היום אנחנו צריכים לפתור משימות רבות:
הדבר הראשון שאנו עושים הוא לעדכן את הסניף הראשי שלנו בפרויקט (git pull) וליצור אחד חדש עם שם המשימה שלנו - STEP_5_JRTB-1 (git checkout -b STEP_5_JRTB-1). להזכירכם: שינינו את שמות הסניפים כך שניתן היה למיין את רצף המשימות בפרויקט רק לפי שם. זה יאפשר לך לעבור במהירות משלב אחד לאחר. עכשיו אתה יכול לעבוד בשקט. עלינו להוסיף שלוש תלות:
עכשיו ברור שמסד הנתונים מעולם לא התחיל עם ההגדרות שלנו. השגיאה זהה, אז בואו נבודד אותה מהגיליון:
נראה שכבר אין שגיאות, אז אתה יכול לראות אם תהיה גישה. אבל, למרבה הצער, אין גישה שוב... כלום: אנחנו נבין את זה יותר! כדי לסיים את docker-compose ולמחוק את כל הקונטיינרים, עליך לכתוב: docker-compose -f docker-compose-test.yml למטה כאן ציינו את הקובץ למחיקה. מה לעשות? בוא נחפש בגוגל: אולי מישהו עשה את זה טוב יותר. השאילתה הפשוטה ביותר: "דוגמה של mysql ב-docker-compose" עוזרת לנו למצוא קישור למשאב בינוני. הם נותנים את הדוגמה הזו:
- הוסף מסלול טיסות. כאן נגדיר את הפריסה של מסד הנתונים עבור הפרויקט.
- הוסף סכימת מסד נתונים.
- הוסף שכבת מאגר.
- הוסף פקודה לסטטיסטיקה של בוטים.
- תכתוב מבחנים, אחרי הכל.
הוספת מסלול תעופה
כדי להוסיף את Flyway, אתה צריך בסיס נתונים, אותו נוסיף כשירות נוסף ב- docker-compose. פעם אחרונה שאמרתי של-docker-compose יש סעיף שירותים, שאחראי בדיוק על הוספה וניהול של תשתית מסוימת - כלומר סט של אפליקציות/מאגרי מידע/מסנג'רים וכו'.כבר דיברתי על מה זה Flyway וכיצד להוסיף אותו ליישום SpringBoot . אני ממליץ לך לרענן את זכרונך לפני קריאת מאמר זה. אתה יכול גם לקרוא את הקובץ README.md של הפרויקט עם הדגמה של המאמר על 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>
התלות הראשונה אחראית על הוספת FlyWay לפרויקט, השנייה מוסיפה את היכולת להתחבר למסד הנתונים של MySQL. השלישי הוא SpringBoot Starter, אשר משיק את כל הקסם של שימוש במסד נתונים ב-Spring. ובואו נוסיף גם לומבוק כדי לא לכתוב גטרים וסטרים:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
עכשיו אנחנו צריכים מסד נתונים לפיתוח. ניצור אותו לעת עתה ( עד שאעלה רעיון טוב יותר ) כקובץ docker-compose נפרד וקובץ נפרד עבור application.properties. יש דבר כזה בפיתוח (ובמערכת האקולוגית של האביב בפרט) כמו פרופילים. בהתאם לפרופיל, הגדרות שונות מופעלות לפעולה. אני חושב שבעתיד נשלב docker-compose לקובץ אחד ונוודא שרק מסד נתונים אחד יושק לפיתוח על ההגדרות שאנחנו צריכים. לעת עתה נעשה זאת:
- בואו ניצור קובץ בשורש הפרויקט docker-compose-test.yml, בו יופעל רק מסד הנתונים עם ההגדרות שלו.
- בואו ניצור קובץ application-test.properties עם הגדרות התואמות להגדרות בקובץ 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
לאחר מכן, אני יוצר docker-compose-test.yml בשורש הפרויקט:
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
כדי להפעיל את הקובץ הספציפי הזה לעבוד עם docker-compose, עליך להשתמש בדגל -f בבקשה . זה אומר ששם הקובץ שיושק יסופק, במקום ה-docker-compose.yml הסטנדרטי שיילקח. לכן הבקשה תיראה כך: docker-compose -f docker-compose-test.yml up -d מסתבר שקודם נגיד איזה קובץ לקחת ( -f docker-compose-test.yml ), ואז אנחנו אומרים שעלינו להעלות שירותים ולעשות זאת במצב daemon ( up -d ) - כלומר, כך שהתהליך ירוץ מחוץ לסשן הטרמינל שבו הפקודה הזו הושקה. אנו משיקים ומנסים להתחבר למסד הנתונים כדי לוודא שהוא קיים וניתן להשתמש בו. כדי לעשות זאת, פתחו את MySQL Workbench המוכר ( כאן דיברנו על זה ) וצרו חיבור חדש: עלינו למלא את השדות הבאים:
- שם חיבור - שם חיבור - אופציונלי, DEV_JRTB_DB;
- שם מארח - הנה הכתובת שבה נפרס מסד הנתונים. במקרה שלנו, הכל יישאר כשהיה: 127.0.0.1 , או localhost;
- שם משתמש - כאן יהיה root, כפי שכתבנו ב-docker-compose;
- סיסמה - גם שורש.
אנחנו מקבלים:
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 [שגיאה] [נקודת כניסה]: מסד הנתונים אינו מאותחל ואפשרות הסיסמה לא צוינה dev-jrtb-db | עליך לציין אחד מ-MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD ו-MYSQL_RANDOM_ROOT_PASSWORD
כלומר, הוא צריך לקבוע את הסיסמה עבור משתמש השורש - המשתמש הראשי. אוקיי, עכשיו נעדכן את הקובץ שלנו:
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
הסרנו את המשתנים האלה עבור המשתמש והסיסמה והוספנו רק את הסיסמה עבור משתמש השורש. המשמעות היא שלמשתמש השורש תהיה כעת סיסמת שורש. לפחות זה מה שאנחנו מניחים. עכשיו בואו נריץ את זה ונראה מה קורה: docker-compose -f docker-compose-test.yml up -d ומיד נראה מה היומנים אומרים לנו: docker-compose -f docker-compose-test.yml logs
בואו נראה:
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:
אנו מתאימים אותו לצרכים שלנו ומקבלים:
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'
אנו מפעילים אפשרות זו עם הפקודה שכבר ידועה לנו: docker-compose -f docker-compose-test.yml up -d אנו מנסים שוב לגשת למסד הנתונים דרך MySQLWorkBench: לבסוף, הגישה הופיעה. אבל עכשיו אני תוהה מה השפיע על זה. אני חוטא בחלק הזה:
expose:
# Opens port 3306 on the container
- '3306'
קל לבדוק: בלי זה שום דבר לא אמור לעבוד :D. בואו נבדוק: מחק את החלק הזה, הפעל מחדש את docker-compose: docker-compose -f docker-compose-test.yml down docker-compose -f docker-compose-test.yml up אנחנו מנסים להיכנס למסד הנתונים דרך שולחן העבודה: הכל עובד . ואז האפשרות היחידה היא גרסת מסד הנתונים. זה מציין בבירור 5.7, כלומר, אם אתה משנה אותו לעדכני, זה לא אמור לעבוד. הפעלתי אותו מחדש - וזה ממש לא עובד... ככל הנראה, יש להם כמה בעיות עם תמונת docker בגרסה האחרונה. אוקיי אין בעיה. זה קורה לעתים קרובות עם תוכנה חופשית. נשתמש בגרסה 5.7. בוא נראה אם יש מסד נתונים שאנחנו צריכים - dev_jrtb_db. לשם כך, הפעל את פקודת ה-Query ב-MySQL Workbench SHOW DATABASES : כן, היא קיימת בפלט. נהדר, אנחנו יכולים להמשיך הלאה. לאחר מכן, בואו נוסיף את ההגירה הראשונה שלנו. בהתבסס על המשימות מהמאמר "תכנון פרויקט: למדוד פעמיים, לחתוך פעם אחת", ניצור את הטבלה הראשונה שלנו tg_user. כל ההגירות ימוקמו בתיקיית projectDir/src/main/resources/db/migration , והשם יהיה: V00001__add_tg_user_table.sql . למה יש שם כזה בתיקייה ההיא - תיארתי אותו במאמר על Spring + flyway. כך תיראה ההעברה הראשונה שלנו: 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
);
כלומר, כאן אנחנו פשוט יוצרים טבלה של משתמש שיש לו רק מזהה צ'אט (אלמנט ייחודי שניתן להשתמש בו כדי לעבוד כמזהה בטבלה) והמצב שלו - פעיל או לא פעיל. לכן, אם הבוט נעצר, פרטי המנוי יישארו וניתן להשתמש בהם אם הם רוצים להשתמש בבוט שוב. אין צורך במידע אחר על המשתמש לעת עתה. עכשיו השאלה העיקרית: איך בודקים את זה? אנחנו צריכים להפעיל את האפליקציה שלנו. עד כה, לקובץ docker-compose.yml הראשי אין קשר למסד הנתונים, ועלינו גם ללמוד כיצד לבצע ניפוי באגים באפליקציה יחד עם מסד הנתונים. לכן, בואו נשיק את האפליקציה עם Intellij IDEA. כדי לבדוק זאת נצטרך להפעיל את השיטה הראשית שלנו ב-JavarushTelegramBotApplication. כדי להפריד בין עבודת הפריסה והבדיקה, נשתמש בקובץ אחר עם מאפיינים - application-test.properties . בעזרת תבנית זו אנו מודיעים ל-Spring שהקובץ הזה ישמש עבור פרופיל הבדיקה . כאשר איננו מציינים פרופיל, נעשה שימוש בפרופיל ברירת המחדל (בדוק זאת ביומנים שלך בעת הפעלת SpringBoot: על כך ייכתב בשורות הראשונות). כך זה ייראה:
# 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
וה- application.properties הראשי ייראה מעט שונה:
# 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
ההבדל המשמעותי הוא בשדה spring.datasource.url: בפרופיל הבדיקה יש לנו כתובת URL על localhost . כלומר, האפליקציה צפויה לפעול מחוץ ל-Docker, וזה נכון, כי בעת איתור באגים נריץ את הפרויקט שלנו ב-Intellij IDEA ונצפה שתהיה לנו גישה למסד הנתונים מהמחשב המקומי. אבל כתובת האתר application.properties כבר מכילה כתובת אחרת - jrtb-db . זה יהיה השם של מסד הנתונים שלנו ב-docker-compose, וכך אפליקציית הדוקר שלנו תוכל להגיע למסד הנתונים. למה? לכן, הם ישיקו בתוך אותו docker-compose וידעו זה על זה בדרך זו. זה הכרחי כדי שתהיה לנו תשתית אחת סגורה לפרויקט. אבל איך להשיק את הפרופיל בהפעלה? לשם כך, תוכל להגדיר את ההשקה של השיטה הראשית ב- Intellij IDEA. לשם כך, יש Edit Configurations : עבור למחלקה הראשית של JavarushTelegramBotApplication, לחץ על החץ הירוק ליד ההצהרה של השיטה הראשית ובחר Modify Run Configuration : הזן את המשתנים הדרושים והגדר את הפרופיל. ב-Intellij IDEA, הממשק של חלון התצורה הזה השתנה מעט, אז אני ממליץ לכולם לעדכן את IDEA לגרסה העדכנית ביותר כדי שנראה את אותה תמונה: בשדה משתני הסביבה , עלינו להוסיף את שם הבוט ומשתני האסימון באמצעות התבנית הבאה: variabel_name1=value1; variable_name2=value2 . כלומר, מפתח=ערך מופרדים באמצעות נקודה-פסיק. במקרה שלנו זה יהיה כך: bot.token=1375780501:AAHLzsf4WhcjSdPguDwtggRS1IMu5l8;bot.username=javarush_community_bot (יהיו לך שם ואסימון שונים עבור הבוט) לאחר מכן, בחר בשדה הוסף אפשרויות VM בכפתור כתוב שינוי אפשרויות : : -Dspring.profiles.active =test - זה יגיד ל-SpringBoot להשתמש בפרופיל הבדיקה, מה שאומר שהמאפיינים יילקחו מ- application-test.properties. כתוצאה מכך, זה ייראה כך: כעת אנו משיקים את מסד הנתונים של הבדיקות שלנו: docker-compose -f docker-compose-test.yml up ובדיוק כך, ללא הקידומת -d, כך שניתן יהיה לראות מיד את היומנים ב- הטרמינל, אם יש צורך. והשלב האחרון הוא פשוט להפעיל את השיטה הראשית. אם תעשה הכל באותו אופן כפי שתיארתי, תסיים עם: השורה השנייה של היומנים תהיה תיאור של מה פרופיל הבדיקה הרוויח. אנחנו עוברים על MySQLWorkbench ומפעילים שתי פקודות כדי לבדוק שההגירה יצאה והכל עובד (למרות שזה נראה מיומני ההשקה של האפליקציה, בהחלט שווה לבדוק):
- השתמש ב-dev_jrtb_db;
- הצג טבלאות;
GO TO FULL VERSION