تسلسل CI / CD وأتمتة Docker

كتبت أول مواقعي في أواخر التسعينات. ثم جعلها في حالة عمل بسيطة للغاية. كان هناك خادم Apache على بعض الاستضافة المشتركة ، يمكنك تسجيل الدخول إلى هذا الخادم عبر FTP ، وكتابة شيء من هذا القبيل في سطر المتصفح ftp://ftp.example.com. ثم كان من الضروري إدخال اسم وكلمة مرور وتحميل الملفات إلى الخادم. كانت هناك أوقات أخرى ، كان كل شيء أسهل من الآن. على مدار العقدين الماضيين ، تغير كل شيء كثيرًا. أصبحت المواقع أكثر تعقيدًا ، ويجب تجميعها قبل طرحها في الإنتاج. أصبح خادم واحد عددًا كبيرًا من الخوادم التي تعمل خلف موازنات التحميل ؛ أصبح استخدام أنظمة التحكم في الإصدار أمرًا شائعًا.





بالنسبة لمشروعي الشخصي ، كان لدي تكوين خاص. وأدركت أنني بحاجة إلى القدرة على نشر موقع في الإنتاج ، وأقوم بإجراء واحد فقط: كتابة التعليمات البرمجية إلى فرع masterعلى GitHub. بالإضافة إلى ذلك ، كنت أعلم أنه لضمان تشغيل تطبيق الويب الصغير الخاص بي ، لم أرغب في إدارة مجموعة Kubernetes الضخمة ، أو استخدام تقنية Docker Swarm ، أو الحفاظ على مجموعة خوادم تحتوي على القرون والوكلاء وجميع أنواع الصعوبات الأخرى. من أجل تحقيق هدف تبسيط العمل قدر الإمكان ، كنت بحاجة للتعرف على CI / CD.

إذا كان لديك مشروع صغير (في حالتنا نحن نتحدث عن مشروع Node.js) وترغب في معرفة كيفية أتمتة نشر هذا المشروع ، مع التأكد من أن ما يتم تخزينه في المستودع يطابق تمامًا ما الذي يعمل في الإنتاج ، أعتقد أنك قد تكون مهتمًا بهذه المقالة.

المتطلبات الأساسية


من المتوقع أن يكون لدى قارئ هذه المقالة معرفة أساسية بمنطقة سطر الأوامر وكتابة نصوص Bash. بالإضافة إلى ذلك ، سيحتاج إلى حسابات Travis CI و Docker Hub .

الأهداف


لن أقول أنه يمكن تسمية هذه المقالة دون قيد أو شرط "دليل التدريب". إنها بالأحرى وثيقة أتحدث فيها عن ما تعلمته وأصف عملية اختبار ونشر التعليمات البرمجية في الإنتاج التي تناسبني ، والتي يتم إجراؤها في تمريرة آلية واحدة.

هذه هي الطريقة التي انتهى بها سير عملي.

باستثناء التعليمات البرمجية المرسلة إلى أي فرع من المستودعات ، masterيتم تنفيذ الإجراءات التالية:

  • بناء المشروع على ترافيس سي.
  • يتم إجراء جميع اختبارات الوحدة والتكامل والاختبار الشامل.

فقط للرمز الذي يدخل في أوامر التحفظ masterعلى المعلومات التالية:

  • كل ما قيل أعلاه ، بالإضافة إلى ...
  • أنشئ صورة Docker استنادًا إلى الرمز والإعدادات والبيئة الحالية.
  • وضع صورة على Docker Hub.
  • الاتصال بخادم الإنتاج.
  • تحميل الصورة من Docker Hub إلى الخادم.
  • أوقف الحاوية الحالية وابدأ حاوية جديدة بناءً على الصورة الجديدة.

إذا كنت لا تعرف شيئًا عن Docker ، عن الصور والحاويات - فلا تقلق. سأقول لكم كل شيء عن هذا.

ما هو CI / CD؟


يشير الاختصار CI / CD إلى "التكامل المستمر / النشر المستمر" - "التكامل المستمر / النشر المستمر".

integration التكامل المستمر


التكامل المستمر هو عملية يقوم خلالها المطورون بالالتزام بالمخزن الرئيسي لشفرة مصدر المشروع (عادة إلى الفرع master). في الوقت نفسه ، يتم ضمان جودة الكود عن طريق إجراء اختبار آلي.

deployment النشر المستمر


النشر المستمر هو النشر التلقائي المتكرر للرمز في الإنتاج. يتم أحيانًا الكشف عن الجزء الثاني من الاختصار CI / CD على أنه "تسليم مستمر" ("تسليم مستمر"). هذا ، بشكل عام ، هو نفسه "النشر المستمر" ، ولكن "التسليم المستمر" يعني الحاجة إلى التأكيد اليدوي للتغييرات قبل بدء عملية نشر المشروع.

بداية العمل


التطبيق الذي أتقنت عليه كل شيء يسمى TakeNote . هذا هو مشروع الويب الذي أعمل عليه ، وهو مصمم لتدوين الملاحظات. أولاً ، حاولت إنشاء مشروع JAMStack ، أو مجرد تطبيق أمامي بدون خادم ، للاستفادة من إمكانيات الاستضافة والنشر القياسية التي تقدمها Netlify . مع تزايد تعقيد التطبيق ، كنت بحاجة إلى إنشاء جزء الخادم الخاص به ، مما يعني أنه سيتعين علي تشكيل استراتيجيتي الخاصة للتكامل الآلي والنشر التلقائي للمشروع.

في حالتي ، التطبيق هو خادم Express يعمل في بيئة Node.js ، ويخدم تطبيق React من صفحة واحدة ويدعم API خادم آمن. هذه العمارة يتبع استراتيجية وجدت في هذا دليل التوثيق الكامل مكدس.

لقد استشرت صديقًا خبيرًا في الأتمتة وسألته عما يتعين علي القيام به لجعله يعمل بالطريقة التي أحتاجها. لقد أعطاني فكرة عما يجب أن يكون عليه سير العمل الآلي ، كما هو موضح في قسم الأهداف في هذه المقالة. حقيقة أنني وضعت نفسي مثل هذه الأهداف يعني أنني بحاجة إلى معرفة كيفية استخدام Docker.

عامل ميناء


Docker هي أداة ، بفضل تقنية الحاوية ، تجعل من السهل توزيع التطبيقات ، وكذلك نشرها وتشغيلها في نفس البيئة ، حتى إذا كانت منصة Docker نفسها تعمل في بيئات مختلفة. بالنسبة للمبتدئين ، كنت بحاجة إلى وجود أدوات سطر أوامر Docker (CLI) تحت تصرفي. لا يمكن وصف إرشادات تثبيت Docker بشكل واضح ومفهوم للغاية ، ولكن يمكنك أن تتعلم منه أنه من أجل اتخاذ الخطوة الأولى من التثبيت ، تحتاج إلى تنزيل Docker Desktop (لنظام التشغيل Mac أو Windows).

Docker Hub يماثل تقريبًا GitHub لمستودعات git أو سجل npmلحزم JavaScript. هذا مستودع على الإنترنت لصور Docker. يتصل به Docker Desktop.

لذلك ، من أجل البدء مع Docker ، تحتاج إلى القيام بأمرين:


بعد ذلك ، يمكنك التحقق من أن Docker CLI يعمل عن طريق تشغيل الأمر التالي للتحقق من إصدار Docker:

docker -v

بعد ذلك ، قم بتسجيل الدخول إلى Docker Hub بإدخال اسم المستخدم وكلمة المرور عند طلب ذلك:

docker login

من أجل استخدام Docker ، يجب عليك فهم مفاهيم الصور والحاويات.

▍ صور


الصورة هي شيء يشبه خطة تحتوي على تعليمات لبناء حاوية. هذه لقطة غير قابلة للتغيير لنظام الملفات وإعدادات التطبيق. يمكن للمطورين بسهولة مشاركة الصور.

#     
docker images

سيعرض هذا الأمر جدولاً بالعنوان التالي:

REPOSITORY     TAG     IMAGE ID     CREATED     SIZE
---

بعد ذلك ، سننظر في بعض الأمثلة على الأوامر بنفس التنسيق - أولاً يأتي أمر مع تعليق ، ثم مثال لما يمكن أن يخرج.

ontالحاويات


الحاوية هي حزمة قابلة للتنفيذ تحتوي على كل ما تحتاجه لتشغيل تطبيق. يعمل التطبيق مع هذا النهج دائمًا بنفس الطريقة ، بغض النظر عن البنية التحتية: في بيئة معزولة وفي نفس البيئة. النقطة هي أنه في البيئات المختلفة ، يتم إطلاق مثيلات من نفس الصورة.

#   
docker ps -a
CONTAINER ID     IMAGE     COMMAND     CREATED     STATUS     PORTS     NAMES
---

ags العلامات


العلامة هي إشارة إلى نسخة محددة من الصورة.

Summary ملخص أمر عامل الميناء


فيما يلي نظرة عامة على بعض أوامر Docker شائعة الاستخدام.
الفريق
سياق الكلام
فعل
بناء عامل الميناء
شكل
تجميع صورة من Dockerfile
علامة عامل الميناء
شكل
علامات الصورة
صور عامل الميناء
شكل
صور الإدراج
تشغيل عامل الميناء
حاوية
إطلاق حاوية قائمة على الصور
دفع عامل الميناء
شكل
إرسال صورة إلى التسجيل
سحب عامل الميناء
شكل
تنزيل الصورة من التسجيل
عامل إرساء ps
حاوية
قائمة الحاويات
نظام رصيف تقليم
صورة / حاوية
إزالة الحاويات والصور غير المستخدمة

▍ ملف Dockerfile


أعرف كيفية تشغيل تطبيق الإنتاج محليًا. لدي تكوين Webpack مصمم لإنشاء تطبيق رد فعل جاهز. بعد ذلك ، لدي أمر يبدأ تشغيل خادم يستند إلى Node.js على المنفذ 5000. تبدو هكذا:

npm i         #  
npm run build #  React-
npm run start #  Node-

وتجدر الإشارة إلى أنني لا أمتلك نموذجًا لتطبيق على هذه المادة. ولكن هنا ، للتجارب ، أي تطبيق عقدة بسيط مناسب.

لاستخدام الحاوية ، تحتاج إلى إعطاء تعليمات Docker. يتم ذلك من خلال ملف يسمى Dockerfileموجود في الدليل الجذر للمشروع. يبدو هذا الملف غامضًا في البداية.

لكن ما يحتويه يصف فقط ، بأوامر خاصة ، شيئًا مشابهًا لإنشاء بيئة عمل. فيما يلي بعض هذه الأوامر:

  • من - يبدأ هذا الأمر الملف. يشير إلى الصورة الأساسية التي تم بناء الحاوية على أساسها.
  • COPY - نسخ الملفات من مصدر محلي إلى حاوية.
  • WORKDIR - إعداد دليل العمل للأوامر التالية.
  • RUN - تشغيل الأوامر.
  • EXPOSE - إعدادات المنفذ.
  • ENTRYPOINT - تحديد الأمر المراد تنفيذه.

Dockerfile قد يبدو شيء مثل هذا:

#   
FROM node:12-alpine

#        app/
COPY . app/

#  app/    
WORKDIR app/

#   ( npm ci  npm i,     )
RUN npm ci --only-production

#   React-  
RUN npm run build

#   
EXPOSE 5000

#  Node-
ENTRYPOINT npm run start

بناءً على الصورة الأساسية المحددة ، قد تحتاج إلى تثبيت تبعيات إضافية. والحقيقة هي أن بعض الصور الأساسية (مثل Node Alpine Linux) مصممة لجعلها مضغوطة قدر الإمكان. نتيجة لذلك ، قد لا يكون لديهم بعض البرامج التي تعتمد عليها.

▍ بناء ، وضع علامة وإطلاق الحاوية


التجميع المحلي وإطلاق الحاوية ، بعد أن تكون لدينا Dockerfile، تكون المهام بسيطة للغاية. قبل إرسال صورة إلى Docker Hub ، تحتاج إلى اختبارها محليًا.

▍ الجمعية


تحتاج أولاً إلى جمع الصورة عن طريق تحديد اسم ، وعلامة اختيار (إذا لم يتم تحديد العلامة ، فسيقوم النظام تلقائيًا بتعيين علامة للصورة latest).

#  
docker build -t <image>:<tag> .

بعد تنفيذ هذا الأمر ، يمكنك ملاحظة كيفية إنشاء Docker للصورة.

Sending build context to Docker daemon   2.88MB
Step 1/9 : FROM node:12-alpine
 ---> ...  ...
Successfully built 123456789123
Successfully tagged <image>:<tag>

قد يستغرق التجميع بضع دقائق - كل هذا يتوقف على عدد التبعيات لديك. بعد اكتمال التجميع ، يمكنك تنفيذ الأمر docker imagesوإلقاء نظرة على وصف صورتك الجديدة.

REPOSITORY          TAG               IMAGE ID            CREATED              SIZE
<image>             latest            123456789123        About a minute ago   x.xxGB

▍بدء


يتم إنشاء الصورة. وهذا يعني أنه من الممكن على أساسها إطلاق حاوية. نظرًا لأنني أريد أن أكون قادرًا على الوصول إلى التطبيق الذي يعمل في الحاوية على العنوان الذي localhost:5000قمت 5000:5000بتثبيته على الجانب الأيسر من الزوج في الأمر التالي 5000. على الجانب الأيمن هو منفذ الحاوية.

#      5000    5000
docker run -p 5000:5000 <image>:<tag>

الآن بعد إنشاء الحاوية وتشغيلها ، يمكنك استخدام الأمر docker psللنظر في المعلومات حول هذه الحاوية (أو يمكنك استخدام الأمر docker ps -aالذي يعرض معلومات حول جميع الحاويات ، وليس فقط الحاويات العاملة).

CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                      PORTS                    NAMES
987654321234        <image>             "/bin/sh -c 'npm run…"   6 seconds ago        Up 6 seconds                0.0.0.0:5000->5000/tcp   stoic_darwin

إذا انتقلت إلى العنوان الآن localhost:5000، يمكنك مشاهدة صفحة تطبيق العمل ، والتي تبدو تمامًا مثل صفحة التطبيق التي تعمل في بيئة الإنتاج.

▍ تعيين العلامة ونشرها


لاستخدام إحدى الصور التي تم إنشاؤها على خادم الإنتاج ، يجب أن نتمكن من تنزيل هذه الصورة من Docker Hub. هذا يعني أنه يجب عليك أولاً إنشاء مستودع للمشروع على Docker Hub. بعد ذلك ، سيكون لدينا تحت تصرفنا مكانًا يمكنك فيه إصلاح الصورة. يجب إعادة تسمية الصورة بحيث يبدأ اسمها باسم المستخدم الخاص بنا على Docker Hub. بعد ذلك يجب أن يكون اسم المستودع. في نهاية الاسم يمكن أن يكون أي علامة. فيما يلي مثال لتسمية الصور باستخدام هذا المخطط.

يمكنك الآن جمع الصورة باسم جديد وتشغيل الأمر docker pushلإرسالها إلى مستودع Docker Hub.

docker build -t <username>/<repository>:<tag> .
docker tag <username>/<repository>:<tag> <username>/<repository>:latest
docker push <username>/<repository>:<tag>

#     , , :
docker build -t user/app:v1.0.0 .
docker tag user/app:v1.0.0 user/app:latest
docker push user/app:v1.0.0

إذا سار كل شيء على ما يرام ، فستكون الصورة متاحة على Docker Hub ويمكن تنزيلها بسهولة إلى الخادم أو نقلها إلى مطورين آخرين.

الخطوات التالية


حتى الآن ، تأكدنا من أن التطبيق ، في شكل حاوية Docker ، يعمل محليًا. قمنا بتحميل الحاوية إلى Docker Hub. كل هذا يعني أننا حققنا بالفعل تقدمًا جيدًا جدًا نحو الهدف. الآن نحن بحاجة إلى حل سؤالين آخرين:

  • تكوين أداة CI لاختبار التعليمات البرمجية ونشرها.
  • إعداد خادم الإنتاج بحيث يمكنه تحميل وتشغيل الكود الخاص بنا.

في حالتنا ، يتم استخدام Travis CI كحل CI / CD . كخادم - DitigalOcean .

وتجدر الإشارة إلى أنه يمكنك هنا استخدام مجموعة أخرى من الخدمات. على سبيل المثال ، بدلاً من Travis CI ، يمكنك استخدام CircleCI أو Github Actions. وبدلاً من DigitalOcean - AWS أو Linode.

قررنا العمل مع Travis CI ، وفي هذه الخدمة لدي بالفعل تكوين شيء. لذلك ، سأتحدث الآن بإيجاز عن كيفية إعداده للعمل.

ترافيس سي


Travis CI هي أداة لاختبار التعليمات البرمجية ونشرها. لا أريد أن أخوض في تعقيدات إعداد Travis CI ، لأن كل مشروع فريد من نوعه ، وهذا لن يجلب الكثير من الفوائد. ولكن سأخبرك عن الأساسيات التي ستسمح لك بالبدء إذا قررت استخدام Travis CI. مهما كان اختيارك - Travis CI أو CircleCI أو Jenkins أو أي شيء آخر ، سيتم استخدام طرق تكوين مماثلة في كل مكان.

لبدء العمل مع Travis CI ، انتقل إلى موقع المشروع على الإنترنتوإنشاء حساب. ثم قم بدمج Travis CI مع حساب GitHub الخاص بك. أثناء إعداد النظام ، ستحتاج إلى تحديد المستودع الذي تريد أتمتة باستخدامه وتمكين الوصول إليه. (أستخدم GitHub ، لكني متأكد من أن Travis CI يمكنه التكامل مع BitBucket و GitLab والخدمات المماثلة الأخرى).

في كل مرة يتم أخذ Travis CI للعمل ، يتم تشغيل خادم يقوم بتنفيذ الأوامر المحددة في ملف التكوين ، بما في ذلك نشر فروع المستودع المقابلة.

life دورة حياة المهمة


.travis.ymlيدعم ملف تكوين Travis CI ، الذي يتم استدعاؤه وتخزينه في الدليل الجذر للمشروع ، مفهوم أحداث دورة الحياة الوظيفية. يتم سرد هذه الأحداث بالترتيب الذي حدثت فيه:

  • apt addons
  • cache components
  • before_install
  • install
  • before_script
  • script
  • before_cache
  • after_success after_failure
  • before_deploy
  • deploy
  • after_deploy
  • after_script

▍ الاختبار


في ملف التكوين ، سأقوم بتكوين خادم Travis CI المحلي. كلغة ، اخترت العقدة 12 وأخبرت النظام بتثبيت التبعيات اللازمة لاستخدام Docker. سيتم تنفيذ

كل ما هو مدرج .travis.ymlفيه عندما يتم تنفيذ جميع طلبات السحب إلى جميع فروع المستودع ، ما لم يتم تحديد خلاف ذلك. هذه ميزة مفيدة ، لأنها تعني أنه يمكننا اختبار جميع التعليمات البرمجية الواردة إلى المستودع. يتيح لك هذا معرفة ما إذا كان الرمز جاهزًا للكتابة إلى الفرع masterوما إذا كان سيعطل عملية بناء المشروع. في هذا التكوين العام ، أقوم بتثبيت كل شيء محليًا ، وأبدأ خادم مطور Webpack في الخلفية (هذه إحدى ميزات سير العمل الخاص بي) وأجري الاختبارات.

إذا كنت ترغب في عرض الرموز في المستودع الخاص بك مع معلومات حول تغطية التعليمات البرمجية عن طريق الاختبارات ، يمكنك العثور هنا على تعليمات موجزة حول استخدام Jest و Travis CI و Coveralls لجمع وعرض هذه المعلومات.

حتى هنا محتويات الملف .travis.yml:

#  
language: node_js

#   Node.js
node_js:
  - '12'

services:
  #    Docker
  - docker

install:
  #    
  - npm ci

before_script:
  #      
  - npm run dev &

script:
  #  
  - npm run test

هنا تنتهي الإجراءات التي يتم تنفيذها لجميع فروع المستودع وطلبات السحب.

▍ النشر


استنادًا إلى افتراض أن جميع الاختبارات المؤتمتة قد اكتملت بنجاح ، يمكننا ، اختياريًا ، نشر الكود على خادم الإنتاج. نظرًا لأننا لا نرغب في إجراء ذلك إلا masterلتعليمات برمجية من أحد الفروع ، فإننا نعطي النظام الإرشادات المناسبة في إعدادات النشر. قبل محاولة استخدام الشفرة في مشروعك ، والتي سننظر فيها لاحقًا ، أود أن أحذرك من أنه يجب أن يكون لديك نص برمجي حقيقي يتم استدعاؤه للنشر.

deploy:
  #  Docker-     Docker Hub
  provider: script
  script: bash deploy.sh
  on:
    branch: master

يحل البرنامج النصي للنشر مشكلتين:

  • قم بإنشاء الصورة ووضع علامة عليها وإرسالها إلى Docker Hub باستخدام أداة CI (في حالتنا ، فهي Travis CI).
  • تحميل الصورة على الخادم ، وإيقاف الحاوية القديمة وبدء الحاوية الجديدة (في حالتنا ، يعمل الخادم على منصة DigitalOcean).

تحتاج أولاً إلى تكوين العملية التلقائية لتجميع الصورة ووضع علامات عليها وإرسالها إلى Docker Hub. كل هذا مشابه جدًا لما فعلناه يدويًا بالفعل ، باستثناء أننا هنا نحتاج إلى استراتيجية لتعيين علامات فريدة للصور وأتمتة تسجيل الدخول. واجهت بعض الصعوبات في بعض تفاصيل النص البرمجي للنشر ، مثل استراتيجية وضع العلامات وتسجيل الدخول وتشفير مفاتيح SSH وإنشاء اتصال SSH. ولكن لحسن الحظ ، يتعامل صديقي مع باش جيدًا ، بالإضافة إلى أشياء أخرى كثيرة. ساعدني في كتابة هذا السيناريو.

لذا ، فإن الجزء الأول من البرنامج النصي هو إرسال الصورة إلى Docker Hub. هذا بسيط للغاية. يتضمن نظام وضع العلامات الذي استخدمته دمج تجزئة git وعلامة git ، إن وجدت. يسمح هذا بإنشاء علامة فريدة ويبسط تحديد التجميع الذي يستند إليه. DOCKER_USERNAMEو DOCKER_PASSWORDمتغيرات بيئة المستخدم التي يمكن تعيينها باستخدام واجهة ترافيس CI. تقوم Travis CI بمعالجة البيانات الحساسة تلقائيًا حتى لا تقع في الأيدي الخطأ.

هذا هو الجزء الأول من البرنامج النصي deploy.sh.

#!/bin/sh
set -e #     

IMAGE="<username>/<repository>"                             #  Docker
GIT_VERSION=$(git describe --always --abbrev --tags --long) # Git-  

#    
docker build -t ${IMAGE}:${GIT_VERSION} .
docker tag ${IMAGE}:${GIT_VERSION} ${IMAGE}:latest

#   Docker Hub   
echo "${DOCKER_PASSWORD}" | docker login -u "${DOCKER_USERNAME}" --password-stdin
docker push ${IMAGE}:${GIT_VERSION}

يعتمد الجزء الثاني من البرنامج النصي بشكل كامل على المضيف الذي تستخدمه وكيفية تنظيم الاتصال به. في حالتي ، بما أنني أستخدم Digital Ocean ، يتم استخدام أوامر doctl للاتصال بالخادم . عند العمل مع Aws ، سيتم استخدام الأداة المساعدة aws، وما إلى ذلك.

لم يكن إعداد الخادم صعبًا بشكل خاص. لذا ، قمت بإعداد قطرة على أساس الصورة الأساسية. وتجدر الإشارة إلى أن النظام الذي حددته يتطلب تثبيت Docker يدويًا لمرة واحدة وإطلاق Docker يدويًا لمرة واحدة. لقد استخدمت Ubuntu 18.04 لتثبيت Docker ، لذلك إذا كنت تستخدم Ubuntu للقيام بنفس الشيء ، يمكنك فقط اتباع هذا الدليل البسيط.

أنا لا أتحدث هنا عن أوامر محددة للخدمة ، حيث يمكن أن يختلف هذا الجانب بشكل كبير في حالات مختلفة. سأقدم فقط خطة عمل عامة يتم تنفيذها بعد الاتصال عبر SSH بالخادم الذي سيتم نشر المشروع عليه:

  • تحتاج إلى العثور على الحاوية التي تعمل حاليًا وإيقافها.
  • بعد ذلك ، في الخلفية ، تحتاج إلى إطلاق حاوية جديدة.
  • ستحتاج إلى تعيين منفذ الخادم المحلي على قيمة 80- سيسمح لك هذا بإدخال الموقع على عنوان النموذج example.com، دون تحديد المنفذ ، وعدم استخدام العنوان مثل example.com:5000.
  • وأخيرًا ، تحتاج إلى إزالة جميع الحاويات والصور القديمة.

هنا استمرار البرنامج النصي.

#  ID  
CONTAINER_ID=$(docker ps | grep takenote | cut -d" " -f1)

#   ,  ,  
docker stop ${CONTAINER_ID}
docker run --restart unless-stopped -d -p 80:5000 ${IMAGE}:${GIT_VERSION}
docker system prune -a -f

بعض الأشياء في الاعتبار


ربما عند الاتصال بالخادم عبر SSH من Travis CI ، سترى تحذيرًا لن يسمح باستمرار التثبيت ، حيث ينتظر النظام حتى يستجيب المستخدم.

The authenticity of host '<hostname> (<IP address>)' can't be established.
RSA key fingerprint is <key fingerprint>.
Are you sure you want to continue connecting (yes/no)?

تعلمت أنه يمكن ترميز مفتاح السلسلة في base64 من أجل حفظه في شكل سيكون مناسبًا وموثوقًا للعمل معه. في مرحلة التثبيت ، يمكنك فك شفرة المفتاح العام وكتابته في ملف known_hostsللتخلص من الخطأ أعلاه.

echo <public key> | base64 #  < ,   base64>

من الناحية العملية ، قد يبدو هذا الأمر كما يلي:

echo "123.45.67.89 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAklOUpkDHrfHY17SbrmTIpNLTGK9Tjom/BWDSU
GPl+nafzlHDTYW7hdI4yZ5ew18JH4JW9jbhUFrviQzM7xlELEVf4h9lFX5QVkbPppSwg0cda3
Pbv7kOdJ/MTyBlWXFCR+HAo3FXRitBqxiX1nKhXpHAZsMciLq8V6RjsNAQwdsdMFvSlVK/7XA
t3FaoJoAsncM1Q9x5+3V0Ww68/eIFmb1zuUFljQJKprrX88XypNDvjYNby6vw/Pb0rwert/En
mZ+AW4OZPnTPI89ZPmVMLuayrD2cE86Z/il8b+gw3r3+1nKatmIkjn2so1d01QraTlMqVSsbx
NrRFi9wrf+M7Q== you@example.com" | base64

وإليك ما يقدمه - سلسلة مشفرة base64:

MTIzLjQ1LjY3Ljg5IHNzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQUJJd0FBQVFFQWtsT1Vwa0RIcmZIWTE3U2JybVRJcE5MVEdLOVRqb20vQldEU1UKR1BsK25hZnpsSERUWVc3aGRJNHlaNWV3MThKSDRKVzlqYmhVRnJ2aVF6TTd4bEVMRVZmNGg5bEZYNVFWa2JQcHBTd2cwY2RhMwpQYnY3a09kSi9NVHlCbFdYRkNSK0hBbzNGWFJpdEJxeGlYMW5LaFhwSEFac01jaUxxOFY2UmpzTkFRd2RzZE1GdlNsVksvN1hBCnQzRmFvSm9Bc25jTTFROXg1KzNWMFd3NjgvZUlGbWIxenVVRmxqUUpLcHJyWDg4WHlwTkR2allOYnk2dncvUGIwcndlcnQvRW4KbVorQVc0T1pQblRQSTg5WlBtVk1MdWF5ckQyY0U4NlovaWw4YitndzNyMysxbkthdG1Ja2puMnNvMWQwMVFyYVRsTXFWU3NieApOclJGaTl3cmYrTTdRPT0geW91QGV4YW1wbGUuY29tCg==

هنا الفريق المذكور أعلاه

install:
  - echo <  ,   base64> | base64 -d >> $HOME/.ssh/known_hosts

يمكن استخدام نفس الأسلوب مع مفتاح خاص عند إنشاء اتصال ، حيث قد تحتاج إلى مفتاح خاص للوصول إلى الخادم. عند العمل باستخدام مفتاح ، ما عليك سوى التأكد من تخزينه الآمن في متغير بيئة Travis CI ، بحيث لا يتم عرضه في أي مكان.

شيء آخر يجب الانتباه إليه هو أنك قد تحتاج إلى تشغيل البرنامج النصي للنشر بالكامل ، المقدم كسطر واحد ، على سبيل المثال ، باستخدام doctl. قد يتطلب هذا بعض الجهد الإضافي.

doctl compute ssh <droplet> --ssh-command "    && "

TLS / SSL وموازنة الحمل


بعد أن فعلت كل ما تمت مناقشته أعلاه ، كانت المشكلة الأخيرة التي نشأت قبلي هي أن الخادم لم يكن لديه SSL. منذ أن استخدام خادم نود.جي إس، من أجل الحصول على إنجن إكس وتشفير دعونا عكس الوكلاء إلى العمل ، ولست بحاجة للعب كثيرا.

لم أشعر حقًا برغبة في إجراء جميع إعدادات طبقة المقابس الآمنة يدويًا ، لذلك أنشأت تواً موازن تحميل وسجلت معلومات عنه في DNS. في حالة DigitalOcean ، على سبيل المثال ، يعد إنشاء شهادة ذاتية التجديد ذاتيًا على موازن التحميل إجراء بسيطًا ومجانيًا وسريعًا. يحتوي هذا النهج على ميزة إضافية ، والتي ، إذا لزم الأمر ، تجعل من السهل جدًا تكوين SSL على مجموعة متنوعة من الخوادم التي تقوم بتشغيل موازن التحميل. يسمح هذا للخوادم نفسها بعدم "التفكير" في طبقة المقابس الآمنة على الإطلاق ، ولكن استخدام المنفذ كالمعتاد 80. لذلك ، يعد إعداد SSL على موازن التحميل أبسط بكثير وأكثر ملاءمة من طرق تكوين SSL البديلة.

يمكنك الآن إغلاق جميع المنافذ التي تقبل الاتصالات الواردة على الخادم - باستثناء المنفذ 80المستخدم للتواصل مع موازن التحميل ، والمنفذ 22لـ SSH. ونتيجة لذلك ، ستفشل محاولة الوصول مباشرة إلى الخادم على أي منافذ ، باستثناء هذين المنفذين.

ملخص


بعد أن فعلت كل ما تم وصفه في هذه المادة ، لم أعد أخاف من منصة Docker أو مفهوم سلاسل CI / CD الآلية. تمكنت من إعداد سلسلة تكامل مستمر يتم خلالها اختبار الكود قبل دخوله حيز الإنتاج ونشر الكود تلقائيًا على الخادم. كل هذا بالنسبة لي لا يزال جديدًا نسبيًا ، وأنا متأكد من أن هناك طرقًا لتحسين سير العمل الآلي وجعله أكثر كفاءة. لذلك ، إذا كانت لديك أي أفكار حول هذا الموضوع ، فأخبرني بذلك . آمل أن يكون هذا المقال قد ساعدك في شؤونك. أريد أن أصدق أنه بعد قراءتها ، تعلمت قدر ما تعلمته ، بينما اكتشفت كل ما قلته عن ذلك.

PS هناك هو صورة في منطقتنا السوقDocker ، الذي يتم تثبيته بنقرة واحدة. يمكنك التحقق من تشغيل الحاويات على VPS . يتم منح جميع العملاء الجدد 3 أيام مجانًا للاختبار.

القراء الأعزاء! هل تستخدم تقنيات CI / CD في مشاريعك؟


All Articles