أهلاً بكم. نواصل سلسلة المقالات حول كتابة مشروعك.
فرز الفروع
وللأهمية، لكي لا أضيع في الفروع وترتيبها في المستودع، قررت إعادة تسميتها بإضافة البادئة STEP_{number} . على سبيل المثال، لدينا ثلاثة فروع بالإضافة إلى الفرع الرئيسي:- جي آر تي بي-0
- جي آر تي بي-2
- جي آر تي بي-3
- STEP_1_JRTB-0 - الخطوة الأولى
- STEP_2_JRTB-2 - الخطوة الثانية
- STEP_3_JRTB-3 - الخطوة الثالثة
قليلا عن دوكر
ما هو دوكر؟ باختصار، إنها أداة يمكنك من خلالها نشر (نشر) التطبيقات بسرعة وأمان، وإنشاء بنية تحتية مغلقة ضرورية لها فقط. لا يزال الأمر صعبًا، أفهم ذلك. بشكل عام، يمكن فهم Docker على أنها منصة تطوير حيث يمكنك العمل بسرعة وكفاءة. يمكن فهم Docker على أنه برنامج يعمل على الخادم. هذا البرنامج لديه القدرة على تخزين الحاويات مع التطبيقات. ما هي الحاوية؟ هذه بنية أساسية منفصلة يمكنك إضافة كل ما تحتاجه إليها. على سبيل المثال، بالنسبة لتطبيق Java، نحتاج إلى JRE لتشغيل التطبيق، وستحتوي الحاوية على هذا، وسنحتاج إلى بعض البرامج الأخرى - يمكننا إضافة هذا. أو ربما نحتاج إلى Linux وحاوية Tomcat servlet. ويمكن القيام بذلك أيضًا. يتم إنشاء الحاويات بناءً على صورة: أي أن هذا قالب محدد يحتوي على كل ما هو ضروري لإنشاء حاوية Docker. كيفية إنشاء هذه الصورة؟ في حالتنا، سنحتاج إلى إنشاء ملف Dockerfile في جذر المشروع لوصف ما يجب أن يكون في الحاوية. نظرًا لأننا لا نريد الكشف عن الرمز المميز للروبوت في أي مكان، فسيتعين علينا اللجوء إلى تمريره في كل مرة نريد فيها نشر التطبيق. يمكنك قراءة المزيد عن هذا الموضوع هنا وهنا .نكتب JRTB-13
نحتاج إلى إعداد عملية نشر سريعة وسهلة لتطبيقنا على الخادم. أي لجهاز يعمل على مدار الساعة طوال أيام الأسبوع. لنأخذ Docker كأساس. ولكن لا توجد مهمة في قائمتنا تكون مسؤولة عن إضافة هذه الوظيفة. بطريقة ما فاتني ذلك عند إنشائه. لا مشكلة، سنقوم بإنشائه الآن. نذهب إلى علامة تبويب إنشاء المشكلة على GitHub ونختار طلب الميزة: أضف وصفًا للمهمة ومعايير قبولها وحدد المشروع الذي تنتمي إليه هذه المشكلة ويمكنك إنشاء مشكلة جديدة: الآن لإظهار أن المهمة قد تم مقبولة للعمل، قم بتغيير حالة المهمة من "تنفيذ" إلى "قيد التقدم": ستكون هذه مقالة صعبة. إذا كان لديك أي مشاكل، فاكتب في التعليقات: سأراقبها وأجيب عليها بأفضل ما أستطيع. سيكون هذا دعمًا صغيرًا للعملاء :Dإنشاء ملف دوكر
ما هو ملف الإرساء؟ بالنسبة إلى Docker، هذا عبارة عن برنامج نصي (تعليمات خطوة بخطوة) حول كيفية إنشاء صورة لحاوية Docker. لكي يعمل تطبيقنا، نحتاج إلى الإصدار 11 من JDK. أي أننا بحاجة إلى العثور على صورة عامل الإرساء JDK 11 وإضافتها إلى صورتنا. هذا شيء مشابه لكيفية إضافة تبعية إلى الذاكرة. لدى Docker DockerHub لهذا الغرض . لتنزيل الصور محليًا، يجب عليك التسجيل هناك. بعد التسجيل، دعنا نذهب للبحث عن JDK11. مما وجدته، هذه هي الحاوية: تبنىopenjdk/openjdk11 . يحتوي وصف هذه الحاوية على ما هو مطلوب لملف الإرساء:FROM adoptopenjdk/openjdk11:ubi
RUN mkdir /opt/app
COPY japp.jar /opt/app
CMD ["java", "-jar", "/opt/app/japp.jar"]
لنقم بإصلاح المجلد الذي نأخذ منه ملف الجرة. لدينا في المجلد الهدف بعد أن نقوم بتشغيل مهمة حزمة mvn. قبل القيام بكل هذا، استنادًا إلى الفرع الرئيسي المحدث، قمنا بإنشاء فرع جديد لمهمتنا: STEP_4_JRTB-13 . الآن يمكنك العمل. في جذر المشروع، أنشئ ملفًا بدون ملحق Dockerfile وأضف ما يلي بداخله:
FROM adoptopenjdk/openjdk11:ubi
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
السطر الأول هو ما ستستند إليه الصورة -تبنىopenjdk/openjdk11. السطر الثاني هو إضافة وسيطة إلى الصورة المسماة JAR_FILE، الموجودة في المجلد الهدف. علاوة على ذلك، يتم تحديد المجلد الحالي حسب موقع ملف Dockerfile. السطر الثالث - انسخ جرة مشروعنا إلى صورة عامل الإرساء. يحتوي السطر الأخير بشكل أساسي على مصفوفة تم إنشاؤها من الأمر الموجود في الوحدة الطرفية، والتي تم فصلها بمسافة. أي أنه في النهاية سيتم تنفيذ ما يلي: "java -jar /app.jar" للحفاظ على سرية الرمز المميز للبوت، عند بدء الحاوية، سنحتاج إلى تمرير متغيرين - اسم الروبوت والرمز المميز الخاص به. للقيام بذلك، سنكتب استعلامًا يجب أن يبدأ مشروعنا بالمتغيرات. وكيف نفعل ذلك؟ تحتاج إلى البحث عنه في Google: هذا هو الرابط الأول الذي يحتوي على وصف عادي. ماذا نريد أن نفعل؟ لدينا متغيرين في ملف application.properties الذي نحدده هناك:
- bot.username
- bot.token
- لنقم بتشغيل البرنامج النصي bash.
- يقوم البرنامج النصي bash بتشغيل docker-compose.
- يُطلق Docker-compose حاوية عامل إرساء مع تطبيقنا.
- تقوم حاوية 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
قم بتعريف المتغيرات داخل ملف التشفير. بشكل افتراضي لديهم قيمة محددة. إذا تم تمرير متغيرات البيئة بهذه الأسماء عند إنشاء صورة من ملف الإرساء هذا، فستكون القيم مختلفة. وفي 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. الخدمات: تقول أن جميع الأسطر التالية بعد ذلك (سيتم نقلها) تشير إلى الخدمات التي نقوم بتكوينها. لدينا واحد فقط من هذه التطبيقات حتى الآن - وهو تطبيق جافا يسمى jrtb . وتحته بالفعل ستكون جميع إعداداته. على سبيل المثال، إنشاء: السياق: . يقول أننا سنبحث عن ملف Dockerfile في نفس الدليل مثل docker-compose.yml. لكن قسم البيئة: سيكون مسؤولاً عن ضمان تمرير متغيرات البيئة الضرورية إلى ملف Dockerfile. فقط ما نحتاجه. ولذلك، فإننا نمرر المتغيرات أدناه. سيبحث Docker-compose عنها في متغيرات بيئة تشغيل الخادم. دعونا نضيفهم إلى البرنامج النصي باش.
إنشاء البرامج النصية باش
الخطوة الأخيرة هي إنشاء برنامج نصي 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
السطر الأول ضروري لجميع نصوص bash: لن يعمل بدونه. وبعد ذلك - مجرد مجموعة من الأوامر في المحطة التي يجب تنفيذها. لقد أضفت تعليقات في كل أمر لذا يجب أن يكون الأمر واضحًا. الشيء الوحيد الذي أريد أن أشرحه هو ما يعنيه 1 دولار و 2 دولار. هذان متغيران سيتم تمريرهما عند تشغيل البرنامج النصي bash. باستخدام أمر التصدير، ستتم إضافتها إلى متغيرات الخادم وقراءتها في docker-compose. يعمل هذا مع Ubuntu، وربما لا يعمل مع 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
هنا نتوقف عن إنشاء عامل الإرساء وننظف جارنيك المشروع، الذي كان موجودًا منذ آخر بناء. نحن نفعل ذلك للتأكد من إعادة بناء مشروعنا بدقة. كانت هناك سوابق، ولهذا السبب أقوم بإضافتها) ونتيجة لذلك، انتهى بنا الأمر إلى 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، نقوم بإنشاء التزام جديد بالاسم: JRTB-13: تنفيذ عملية النشر عبر عامل الإرساء ودفعها. أتوقف عن الخوض في تفاصيل الأشياء التي سبق أن وصفتها في المقالات السابقة. ولا أرى فائدة من تكرار نفس الشيء. علاوة على ذلك، فإن أولئك الذين اكتشفوا ذلك وفعلوه بأنفسهم لن يكون لديهم أي أسئلة. هذا أنا أتحدث عن كيفية إنشاء فرع جديد، وكيفية إنشاء التزام، وكيفية دفع الالتزام إلى المستودع.
GO TO FULL VERSION