שלום לכולם. אנו ממשיכים את סדרת המאמרים על כתיבת הפרויקט שלך.
מיין את הענפים
מהחשיבות, כדי לא ללכת לאיבוד בסניפים ובסדר שלהם במאגר, החלטתי לשנות את שמם על ידי הוספת הקידומת STEP_{number} . לדוגמה, יש לנו שלושה סניפים בנוסף לסניף הראשי:- JRTB-0
- JRTB-2
- JRTB-3
- STEP_1_JRTB-0 - שלב ראשון
- STEP_2_JRTB-2 - שלב שני
- STEP_3_JRTB-3 - שלב שלישי
קצת על דוקר
מה זה דוקר? בקיצור, מדובר בכלי שבעזרתו ניתן לפרוס (פרוס) אפליקציות במהירות ובבטחה, וליצור עבורם תשתית סגורה הנחוצה רק עבורם. זה עדיין קשה, אני מבין. באופן כללי, ניתן להבין את Docker כפלטפורמת פיתוח שבה אתה יכול לעבוד במהירות וביעילות. ניתן להבין את Docker כתוכנית הפועלת על שרת. לתוכנית זו יש את היכולת לאחסן מכולות עם יישומים. מה זה מיכל? זוהי תשתית נפרדת אליה אתה יכול להוסיף את כל מה שאתה צריך. לדוגמא, עבור אפליקציית Java אנחנו צריכים JRE כדי להריץ את האפליקציה, לקונטיינר יהיה את זה, נצטרך תוכנה אחרת - אנחנו יכולים להוסיף את זה. או אולי אנחנו צריכים לינוקס ומיכל servlet של Tomcat. ניתן לעשות זאת גם. קונטיינרים נוצרים על סמך תמונה: כלומר, זוהי תבנית ספציפית המכילה את כל הדרוש ליצירת קונטיינר Docker. איך יוצרים את התמונה הזו? במקרה שלנו, נצטרך ליצור Dockerfile בשורש הפרוייקט המתאר מה צריך להיות בקונטיינר. מכיוון שאנו לא רוצים לחשוף את האסימון של הבוט בשום מקום, נצטרך לפנות אותו בכל פעם שנרצה לפרוס את האפליקציה. תוכלו לקרוא עוד על נושא זה כאן וכאן .אנו כותבים JRTB-13
עלינו להגדיר תהליך פריסה מהיר וקל עבור האפליקציה שלנו לשרת. כלומר, למכונה שעובדת 24/7. בואו ניקח את דוקר כבסיס. אבל אין משימה ברשימה שלנו שתהיה אחראית להוספת פונקציונליות זו. איכשהו התגעגעתי אליו כשיצרתי אותו. אין בעיה, אנחנו ניצור את זה עכשיו. עבור ללשונית יצירת הבעיה ב-GitHub ובחר באפשרות בקשת פיצ'ר: הוסף תיאור של המשימה, קריטריונים לקבלתה, הגדר לאיזה פרויקט נושא זה שייך ותוכל ליצור בעיה חדשה: כעת, כדי להראות שהמשימה התקבלה לעבודה, שנה את סטטוס המשימה מ-To do on Progress: זה הולך להיות מאמר קשה. אם יש לכם בעיות כתבו בתגובות: אני אעקוב ואענה כמיטב יכולתי. זו תהיה תמיכת לקוחות קטנה :Dיצירת Dockerfile
מהו dockerfile? עבור Docker, זהו סקריפט (הוראות שלב אחר שלב) כיצד ליצור תמונה עבור קונטיינר Docker. כדי שהאפליקציה שלנו תעבוד, אנחנו צריכים את ה-JDK, גרסה 11. כלומר, עלינו למצוא את תמונת ה-JDK 11 docker ולהוסיף אותה לתמונה שלנו. זה משהו שדומה לאופן שבו אנו מוסיפים תלות לזיכרון. ל- Docker יש DockerHub למטרה זו . כדי להוריד תמונות מקומית, עליך להירשם שם. לאחר ההרשמה, בוא נלך לחפש JDK11. ממה שמצאתי, זה המיכל: adoptopenjdk/openjdk11 . בתיאור של מיכל זה יש את מה שנדרש עבור קובץ docker:FROM adoptopenjdk/openjdk11:ubi
RUN mkdir /opt/app
COPY japp.jar /opt/app
CMD ["java", "-jar", "/opt/app/japp.jar"]
בואו נתקן את התיקיה ממנה אנחנו לוקחים את קובץ ה-jar. יש לנו את זה בתיקיית היעד לאחר שהרצנו את משימת mvn package maven. לפני שנעשה את כל זה, בהתבסס על הסניף הראשי המעודכן, אנו יוצרים אחד חדש למשימה שלנו: STEP_4_JRTB-13 . עכשיו אתה יכול לעבוד. בשורש הפרויקט, צור קובץ ללא סיומת Dockerfile והוסף בתוכו את הדברים הבאים:
FROM adoptopenjdk/openjdk11:ubi
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
השורה הראשונה היא על מה תתבסס התמונה - adoptopenjdk/openjdk11. השורה השנייה היא להוסיף ארגומנט לתמונה בשם JAR_FILE, שנמצאת בתיקיית היעד. יתר על כן, התיקיה הנוכחית נקבעת על פי המיקום של ה- Dockerfile. שורה שלישית - העתק את הצנצנת של הפרויקט שלנו לתמונת הדוקר. השורה האחרונה מכילה בעצם מערך שנוצר מהפקודה בטרמינל, שהופרד על ידי רווח. כלומר, בסופו של דבר יתבצעו הפעולות הבאות: "java -jar /app.jar" כדי לשמור על אסימון הבוט בסוד, בעת הפעלת הקונטיינר נצטרך להעביר שני משתנים - שם הבוט והטוקן שלו. לשם כך, נכתוב שאילתה שאמורה להפעיל את הפרויקט שלנו עם משתנים. ואיך עושים את זה? אתה צריך לחפש בגוגל: הנה הקישור הראשון עם תיאור רגיל. מה אנחנו רוצים לעשות? יש לנו שני משתנים בקובץ application.properties שאנו מגדירים שם:
- bot.username
- bot.token
- בוא נריץ את תסריט ה-bash.
- סקריפט ה-bash מפעיל docker-compose.
- Docker-compose משיק קונטיינר docker עם האפליקציה שלנו.
- הקונטיינר של Docker מריץ את האפליקציה שלנו.
FROM adoptopenjdk/openjdk11:ubi
ARG JAR_FILE=target/*.jar
ENV BOT_NAME=test.javarush_community_bot
ENV BOT_TOKEN=1375780501:AAE4A6Rz0BSnIGzeu896OjQnjzsMEG6_uso
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-Dbot.username=${BOT_NAME}", "-Dbot.token=${BOT_TOKEN}", "-jar", "/app.jar"]
ניתן לראות שהוספנו שתי שורות ועדכנו את ENTRYPOINT. שורות:
ENV BOT_NAME=test.javarush_community_bot
ENV BOT_TOKEN=1375780501:AAE4A6Rz0BSnIGzeu896OjQnjzsMEG6_uso
להכריז על משתנים בתוך קובץ המקודד. כברירת מחדל יש להם ערך שצוין. אם, בעת יצירת תמונה מ-docerfile זה, משתני סביבה עם שמות כאלה מועברים, הערכים יהיו שונים. וב-ENTRYPOINT הוספנו עוד כמה אלמנטים שיקראו את משתני הסביבה האלה:
"-Dbot.username=${BOT_NAME}", "-Dbot.token=${BOT_TOKEN}"
כאן אתה יכול לראות שבתוך השורה, באמצעות המבנה ${}, הערכים של BOT_NAME ו-BOT_TOKEN יעברו. לאחר מכן, עלינו ללמד כיצד לקבל ולהעביר את המשתנים הללו ל-docker-compose.
צור docker-compose.yml
כדאי שתקראו בנפרד על פורמט YAML, אחרת הכתבה כבר צומחת בצעדי ענק. עבורנו, זה רק עוד תיאור של משתנים מסוג .properties. רק בנכסים זה כתוב דרך נקודה, אבל ב-YAML זה נעשה קצת יותר יפה. למשל, ככה. שני משתנים ב-.properties: javarush.telegram.bot.name=ivan javarush.telegram.bot.token=pupkin אבל ב-.yaml (זהה ל-.yml) זה יהיה כך:javarush:
telegram:
bot:
name: ivan
token: pupkin
האפשרות השנייה יפה ומובנת יותר. הרווחים צריכים להיות בדיוק כפי שצוין למעלה. בואו נתרגם איכשהו את application.properties ואת application.yml שלנו. ראשית עליך ליצור אותו. בשורש הפרויקט, צור קובץ docker-compose.yml וכתוב שם את הדברים הבאים:
version: '3.1'
services:
jrtb:
build:
context: .
environment:
- BOT_NAME=${BOT_NAME}
- BOT_TOKEN=${BOT_TOKEN}
restart: always
השורה הראשונה היא גרסת docker-compose. services: אומר שכל השורות הבאות לאחר מכן (יוזזו) מתייחסות לשירותים שאנו מגדירים. יש לנו רק אחד כזה עד כה - יישום Java בשם jrtb . וכבר מתחתיו יהיו כל ההגדרות שלו. לדוגמה, build: context: . אומר שנחפש את ה- Dockerfile באותה ספרייה כמו docker-compose.yml. אבל מדור הסביבה: יהיה אחראי להבטיח שנעביר את משתני הסביבה הדרושים ל- Dockerfile. בדיוק מה שאנחנו צריכים. לכן, אנו מעבירים משתנים להלן. Docker-compose יחפש אותם במשתני סביבת ההפעלה של השרת. בואו נוסיף אותם לתסריט ה-bash.
יצירת תסריטי bash
השלב האחרון הוא יצירת סקריפט bash. צור קובץ בשם start.sh בשורש הפרוייקט וכתוב שם את הדברים הבאים:#!/bin/bash
# Pull new changes
git pull
# Prepare Jar
mvn clean
mvn package
# Ensure, that docker-compose stopped
docker-compose stop
# Add environment variables
export BOT_NAME=$1
export BOT_TOKEN=$2
# Start new deployment
docker-compose up --build -d
השורה הראשונה נחוצה עבור כל תסריטי הבש: זה לא יעבוד בלעדיה. ואז - רק קבוצה של פקודות בטרמינל שצריך לבצע. הוספתי הערות בכל פקודה כדי שזה יהיה ברור. הדבר היחיד שאני רוצה להסביר הוא מה המשמעות של $1 ו-$2. אלו שני משתנים שיעברו עם השקת סקריפט ה-bash. באמצעות פקודת הייצוא, הם יתווספו למשתני שרת ויקראו ב-docker-compose. זה עובד עבור אובונטו, כנראה לא עבור Windows, אבל אני לא בטוח. כעת עליך להוסיף את הסקריפט stop.sh, שיעצור את העבודה. הוא יכיל מספר שורות:
#!/bin/bash
# Ensure, that docker-compose stopped
docker-compose stop
# Ensure, that the old application won't be deployed again.
mvn clean
כאן אנחנו עוצרים את docker-compose ומנקים את הפרויקט jarnik, ששוכב שם מאז הבנייה האחרונה. אנו עושים זאת כדי להבטיח שהפרויקט שלנו נבנה מחדש בצורה מדויקת. היו תקדימים, בגלל זה אני מוסיף) כתוצאה מכך, אנחנו מקבלים 4 קבצים חדשים:
- Dockerfile - קובץ ליצירת תמונה של האפליקציה שלנו;
- docker-compose.yml - קובץ עם הגדרות כיצד נשיק את הקונטיינרים שלנו;
- start.sh - סקריפט bash לפריסת האפליקציה שלנו;
- stop.sh הוא סקריפט bash כדי לעצור את היישום שלנו.
# הערות שחרור ## 0.3.0-SNAPSHOT * JRTB-13: תהליך פריסה נוסף לפרויקט ## 0.2.0-SNAPSHOT * JRTB-3: דפוס פקודה מיושם לטיפול בפקודות Telegram Bot ## 0.1.0-SNAPSHOT * JRTB -2: בוט טלגרם בדל נוסף * JRTB-0: פרויקט שלד SpringBoot נוסף
וב-README נוסיף פסקה חדשה המתארת כיצד לפרוס את האפליקציה שלנו:
## פריסה תהליך פריסה קל ככל האפשר: תוכנה נדרשת: - מסוף להרצת סקריפטים של bash - docker - docker-compose לפריסת אפליקציה, עבור לסניף הדרוש והפעל את סקריפט bash: $ bash start.sh ${bot_username} ${bot_token } זה הכל.
כמובן שהכל כתוב באנגלית. כרגיל, בסניף החדש שלנו STEP_4_JRTB-13 אנו יוצרים commit חדש בשם: JRTB-13: יישם תהליך פריסה באמצעות docker ודחף אותו. אני מפסיק להתעכב בפירוט על דברים שכבר תיארתי במאמרים קודמים. אני לא רואה טעם לחזור על אותו דבר. חוץ מזה, למי שהבין ועשה זאת בעצמו לא יהיו שאלות. זה אני מדבר על איך ליצור סניף חדש, איך ליצור commit, איך לדחוף commit למאגר.
GO TO FULL VERSION