كيفية بناء خط أنابيب CI / CD حديث

استخدام الخدمات المجانية والمُستضافة

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

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

  1. اكتب القليل من برنامج بايثون (وليس مرحبا العالم)
  2. أضف بعض الاختبارات الآلية للبرنامج
  3. ادفع الكود إلى جيثب
  4. إعداد Travis CI لتشغيل اختباراتك الآلية بشكل مستمر
  5. إعداد Better Code Hub للتحقق باستمرار من جودة الرمز
  6. حول برنامج Python إلى تطبيق ويب
  7. قم بإنشاء صورة Docker لتطبيق الويب
  8. ادفع صورة Docker إلى Docker Hub
  9. نشر صورة عامل الميناء إلى Heroku

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

الكشف الكامل: أنا واحد من المطورين في فريق Better Code Hub.

تحديث آب / أغسطس 2017: نشر Eran Barlev من codefresh.io مقطع فيديو قصير على LinkedIn يوضح كيف يمكن لـ Codefresh استبدال بعض الكتل البرمجية الإنشائية الموضحة في هذا البرنامج التعليمي. نظرًا لعدم وجود منتجين برمجيين متماثلين ، يمكن أن تختلف خطوط أنابيب التطوير أيضًا. تأكد من مراجعة مقطع فيديو Eran للاطلاع على تطبيق بديل لخط أنابيب CI / CD حديث.

الخطوة 1: اكتب مولد الطنانة قليلا

نحتاج إلى برنامج صغير سينتقل عبر جميع مراحل خط الأنابيب ، من الكمبيوتر المحمول إلى السحابة. في حالتنا هذه القطعة من البرنامج عبارة عن برنامج صغير لمولد الطنين CI / CD مكتوب في بيثون.

أنشئ دليلًا جديدًا (دعنا نقول أننا نسميه "cicd-buzz"). داخل هذا الدليل ، أنشئ دليلًا آخر باسم "الطنانة" وفي هذا الدليل احفظ المقتطف أدناه إلى ملف يسمى "generator.py".

قم أيضًا بإنشاء ملف فارغ جديد يسمى "__init__.py" في نفس الدليل. يجب أن يبدو هيكل مشروعك الآن كما يلي:

cicd الطنانة /
  شرب حتى الثمالة/
    __init__.py
    generator.py

يجب أن تكون قادرًا على تشغيل برنامج Python النصي هذا من سطر الأوامر داخل دليل "buzz":

[cicd-buzz / buzz] $ python generator.py
نهاية إلى نهاية Devops يعزز بشكل كبير اختبار مستمر

جربه عدة مرات ، إنه ممتع:

[cicd-buzz / buzz] $ python generator.py
التحسين المستمر الكامل يحسن بشكل كبير Devops
[cicd-buzz / buzz] $ python generator.py
Devops الحديثة يحسن بشكل ملحوظ اختبار مستمر

الخطوة 2: إضافة الاختبارات الآلية

خطوط أنابيب التوصيل المستمر أمر منطقي فقط عندما يكون لديك قدر كبير من الاختبارات الآلية التي تمنعك من شحن البرامج المكسورة بشكل مستمر. للحصول على مجموعة مناسبة من اختبارات الوحدات الخاصة بمولد buzz ، أنشئ دليلًا جديدًا باسم "الاختبارات" في جذر دليل مشروعك واحفظ المقتطف أدناه في ملف جديد في دليل "الاختبارات". اتصل بهذا الملف 'test_generator.py':

لإجراء الاختبارات ، سنستخدم إطار "pytest". لتثبيت pytest ، سنستخدم بيئة Python الافتراضية (virtualenv). لا تقلق ، هذا أسهل في التنفيذ مما قيل. أولاً ، تأكد من تثبيت virtualenv حتى تتمكن من تنفيذ الأمر التالي داخل دليل المشروع الخاص بك:

[cicd-buzz] $ virtualenv venv

هذا يجب إنشاء venv دليل جديد. لبدء استخدام نوع البيئة هذا:

[cicd-buzz] $ المصدر venv / bin / activate
(venv) [cicd-buzz] $

بعد ذلك ، قم بإنشاء ملف جديد يسمى "requirements.txt" يسرد تبعية pytest:

pytest == 3.0.6

لتنزيل التبعيات المدرجة في ملف المتطلبات ، ستحتاج إلى تنفيذ الأمر "pip":

(venv) [cicd-buzz] $ pip install -r requirements.txt

بعد الانتهاء من جميع الخطوات المذكورة أعلاه ، يجب أن يبدو جذر دليل المشروع الخاص بك كما يلي:

cicd الطنانة /
  شرب حتى الثمالة/
  requirements.txt
  اختبارات /
  venv /

داخل البيئة الافتراضية ، يمكنك الآن تشغيل اختبارات الوحدة في ملف "test_generator.py":

(venv) [cicd-buzz] $ python -m pytest -v tests / test_generator.py

يجب أن يبدو الإخراج مثل:

========== تبدأ جلسة الاختبار ==========
النظام الأساسي darwin - Python 2.7.10 ، pytest-3.0.6 ، py-1.4.32 ، pluggy-0.4.0 - / المستخدمون / روب / المشاريع / مساحة العمل / cicd-buzz / venv / bin / python
cachedir: .cache
rootdir: / المستخدمين / روب / المشاريع / مساحة العمل / cicd- buzz ، inifile:
جمعت 3 البنود
الاختبارات / test_generator.py :: test_sample_single_word PASSED
الاختبارات / test_generator.py :: test_sample_multiple_words PASSED
الاختبارات / test_generator.py :: test_generate_buzz_of_at_least_five_words PASSED
========== 3 مرت في 0.02 ثانية ==========

الخطوة 3: ضع الكود على جيثب

قم بتسجيل الدخول إلى GitHub (احصل على حساب أولاً إذا لم يكن لديك حساب بالفعل) وقم بإنشاء مستودع عام جديد يسمى "cicd-buzz".

داخل دليل المشروع ، أنشئ ملفًا جديدًا باسم "gitignore" يحتوي على سطر واحد فقط:

venv

هذا سيمنع git من إضافة virtualenv إلى الريبو الخاص بنا. حان الوقت الآن لتهيئة Git محليًا ودفع الشفرة إلى GitHub:

[cicd-buzz] $ git init
[cicd-buzz] $ git add *
[cicd-buzz] $ git الالتزام -m "الالتزام الأولي"
[cicd-buzz] git@github.com إضافة أصل عن بُعد $ git:  /cicd-buzz.git
[cicd-buzz] $ git push -u original master

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

الخطوة 4: قم بتوصيل Travis CI لتشغيل الاختبارات على كل التزام

Travis CI هي خدمة مستضافة لأعمال التكامل المستمر. إنه مجاني لمستودعات GitHub العامة والحصول على حساب Travis CI هو مجرد زيارة https://travis-ci.org وتسجيل الدخول باستخدام بيانات اعتماد GitHub الخاصة بك.

يعد تمكين Travis CI لبدء إنشاء عند كل طلب دفع وسحب لمستودعك سهلاً بقدر سهولة قلب المفتاح أمام مستودع GitHub cicd-buzz (انقر فوق الزر "مزامنة الحساب" في حالة عدم رؤية مستودعك بعد):

الخطوة الأخيرة في تنشيط Travis CI هي إضافة ملف ".travis.yml" في جذر دليل مشروعك. بالنسبة إلى منشئ نبضات Google ، يجب أن يحتوي هذا الملف على:

اللغة: الثعبان
النصي:
  - الثعبان - م pytest- الخامس

أضف الملف إلى Git ، ثم ارتكب وادفع التغييرات:

[cicd-buzz] $ git add .travis.yml
[cicd-buzz] $ git الالتزام -m "إضافة تكوين CI Travis"
[cicd-buzz] دفع git دولار

انتقل إلى لوحة بيانات Travis CI. بعد فترة قصيرة من الوقت ، يجب أن يلاحظ Travis التغييرات في الكود وبدء عملية الإنشاء / الاختبار. يُظهر سجل الإخراج تنفيذ اختبارات الوحدة:

الخطوة 5: إضافة رمز أفضل محور إلى خط أنابيب الخاص بك

الآن بعد أن أصبح لدينا خط أنابيب مزيت جيدًا يفحص باستمرار وظائف الكود الخاص بنا من خلال اختبارات تلقائية ، فإن الإغراء قوي للتركيز على الوظيفة ونسيان الجودة. Better Code Hub عبارة عن نظام أساسي مستضاف يقوم بفحص جودة التعليمات البرمجية الخاصة بك وفقًا للإرشادات العشرة للحصول على كود إثبات يمكن صيانته في المستقبل. Better Code Hub هي وكالة مراقبة تراقب باستمرار أعمال التطوير لدينا (حرفيًا كل دفعة إلى GitHub) وتُعلمك عندما تكون الجودة في خطر.

تُعد Better Code Hub ، مثل Travis CI ، خدمة تتكامل بسلاسة مع GitHub. لإرفاقه بـ repo لدينا ، انتقل إلى https://bettercodehub.com واختر زر تسجيل الدخول المجاني.

بعد تسجيل الدخول باستخدام بيانات اعتماد GitHub ، تسرد الصفحة التالية جميع مستودعات GitHub الخاصة بك. ابحث عن المستودع الذي يُطلق عليه "cicd-buzz" واضغط على زر التشغيل. بعد ذلك سوف تسألك Better Code Hub عما إذا كان من الجيد إجراء التحليل باستخدام التكوين الافتراضي. انقر فوق "اذهب" وانتظر بضع ثوان ، يجب أن يكون تقرير التحليل الآن على شاشتك.

أعلى تقرير التحليل في Better Code Hub

إذا كنت تريد أن تعمل Better Code Hub على كل طلب دفع وسحب على الريبو الخاص بك (تمامًا مثل Travis CI) ، فقم بتبديل رمز طلب السحب المعروض في الجزء السفلي الأيسر من بطاقة الريبو:

تم تمكين تحليل Push / PR التلقائي الآن

الخطوة 6: تحويل مولد نبضات Google إلى تطبيق ويب بسيط

عمل رائع! لديك بالفعل خط أنابيب تكامل مستمر يبحث عن الوظيفة والجودة في هذه المرحلة. الخطوة التالية هي نشر برنامجك باستمرار كلما نجحت جميع الاختبارات.

نظرًا لأننا سننشر البرنامج على Heroku كتطبيق ويب ، نحتاج أولاً إلى كتابة حزمة Python Flask صغيرة حول مولد buzz لجعل برنامج الاستجابة لطلبات HTTP وإخراج HTML. أضف الكود أدناه في ملف يسمى "app.py" في جذر دليل مشروعك:

أضف أيضًا سطرًا آخر إلى ملف "requirements.txt" لإطار Flask:

pytest == 3.0.6
قارورة == 0.12

وتثبيت التبعية الجديدة:

(venv) [cicd-buzz] $ pip install -r requirements.txt

يمكنك الآن تشغيل تطبيق الويب على الكمبيوتر المحمول الخاص بك:

[cicd-buzz] $ python app.py
* يعمل على http://0.0.0.0:5000/ (اضغط CTRL + C لإنهاء)

افتح الموقع http: // localhost: 5000 في متصفح واعجب بالإنجاز. ضرب تحديث عدة مرات ، فقط للمتعة.

أخيرًا ، لا تنسَ إضافة التزامك ودفع تغييراتك:

[cicd-buzz] git add app.py
[cicd-buzz] $ git add requirements.txt
[cicd-buzz] $ git الالتزام -m "الخطوة 6"
[cicd-buzz] دفع git دولار

واستمتع بمشاهدة Travis CI و Better Code Hub وهو يقوم بالتقاط هذه الدفعة!

الخطوة 7: حاويات تطبيق الويب الخاص بك باستخدام عامل ميناء

سنستخدم Docker لإنشاء وحدة واحدة مستقلة وقابلة للنشر من تطبيق الويب الخاص بنا. بالنسبة لتطبيق Python Flask البسيط ، قد يبدو هذا كثيرًا من النفقات العامة ولكن نشر إصدارات مختلفة من قاعدة الشفرة الخاصة بك كوحدة صغيرة قائمة بذاتها تتمتع بالكثير من الفوائد عندما ينمو نظامك بمرور الوقت.

على افتراض تشغيل Docker وتشغيله ، أضف ما يلي إلى ملف جديد يسمى "Dockerfile" في جذر دليل مشروعك:

ما سبق يطلب من عامل الميناء اختيار الصورة الأساسية لجبال الألب ، وتثبيت Python و pip ، وكذلك تثبيت تطبيق الويب الخاص بنا. يطلب السطر الأخير من عامل الميناء تشغيل تطبيق الويب كلما تم تشغيل الحاوية.

يجب أن تكون قادرًا على إنشاء صورة لتهيئة Docker هذه وتشغيلها (حسب تهيئة نظام التشغيل لديك ، قد تحتاج إلى وضع sudo أمام الأوامر أدناه):

[cicd-buzz] عامل بناء $ -t-cicd-buzz.
[cicd-buzz] $ docker run -p 5000: 5000 - rm -it cicd-buzz

معجب بالنتيجة في متصفح:

مولد الطنين CI / CD يعمل في حاوية Docker المحلية

مرة أخرى ، لا تنس إضافة التزامك ودفع تغييراتك:

[cicd-buzz] $ git add Dockerfile
[cicd-buzz] $ git الالتزام -m "الخطوة 7"
[cicd-buzz] دفع git دولار

الخطوة 8: النشر إلى Docker Hub

يؤدي نشر حاوياتك في سجل صور Docker مركزي ، مثل Docker Hub إلى تسهيل مشاركة حاوياتك في بيئات مختلفة أو الرجوع إلى إصدار سابق. لإكمال هذه الخطوة ، ستحتاج إلى التسجيل على https://docker.com وإضافة ما يلي إلى ملف يسمى "publish_dockerhub.sh" في دليل جديد يسمى ".travis" في دليل مشروعك:

سيتم استدعاء البرنامج النصي أعلاه بواسطة Travis CI في نهاية كل بناء خط أنابيب وسيخلق صورة Docker جديدة قابلة للنشر لبناء خط الأنابيب هذا. يتطلب البرنامج النصي 3 متغيرات بيئة يمكنك ضبطها ضمن عرض "الإعدادات" لراديو cicd-buzz في Travis CI:

متغيرات البيئة Travis CI ل Docker

لجعل Travis CI ينشر لك صورة Docker على Docker Hub لكل رمز يتم دفعه إلى مستودع GitHub ، قم بتعديل ملف ".travis.yml" الخاص بك بحيث يبدو:

بعد الالتزام بهذه التغييرات ودفعها (وانتظار Travis CI لإكمال خط الأنابيب بالكامل) ، يجب أن تكون قادرًا على بدء تشغيل صورة Docker الخاصة بك مباشرة من Docker Hub:

[cicd-buzz] $ docker run -p5000: 5000 - rm -it  / cicd-buzz: الأحدث

الخطوة 9: نشر إلى Heroku

Heroku عبارة عن منصة سحابية لاستضافة تطبيقات الويب الصغيرة والقابلة للتطوير. تقدم خطة مجانية ، لذلك انتقل إلى https://signup.heroku.com واشترك إذا لم تكن قد قمت بذلك بالفعل.

قم بتثبيت شريط أدوات سطر الأوامر Heroku ومن جذر دليل مشروعك ، قم بتنفيذ الأوامر التالية:

[cicd-buzz] $ heroku login
[cicd-buzz] إنشاء $ heroku
إنشاء التطبيق ... تم ، ⬢ fathomless-inlet-53225
https://fathomless-inlet-53225.herokuapp.com/ | https://git.heroku.com/fathomless-inlet-53225.git
[cicd-buzz] $ heroku plugins: install @ heroku-cli / plugin-container-registry
[cicd-buzz] $ حاوية heroku: تسجيل الدخول
[cicd-buzz] حاوية heroku $: شبكة دفع
[cicd-buzz] حاوية heroku $: حرر الويب

بعد هذه الأوامر ، يجب أن تكون قادرًا على الوصول إلى التطبيق على عنوان url الذي أبلغ عنه أمر إنشاء heroku (أو بدلاً من ذلك ، قم بتشغيل $ heroku open).

مولد الطنين CI / CD يعمل في Heroku

لاحظ أن حاوية heroku: push web command ، تدفع الحاوية نفسها إلى منصة Heroku كما دفعت إلى سجل Docker Hub.

لأتمتة عملية نشر كل بنية من فروع الفرع الرئيسي لمشروعنا ، أضف ما يلي إلى ملف يسمى "publish_heroku.sh" في الدليل ".travis":

أضف أيضًا السطر التالي إلى ملف ".travis.yml":

after_success:
  - sh .travis / publish_dockerhub.sh
  - اختبار "$ TRAVIS_BRANCH" = "master" && sh .travis / publish_heroku.sh

وأخيرًا أضف متغيرين آخرين إلى بيئة الريبو في Travis CI. يمكنك العثور على مفتاح Heroku API ضمن "إعدادات الحساب" في Heroku. اسم تطبيق Heroku هو الاسم الذي أبلغ عنه أمر إنشاء heroku.

الالتزام ودفع هذه التغييرات إلى جيثب. يجب الآن دفع صورة Docker جديدة إلى كل من Docker Hub و Heroku بعد نجاح البناء.

الخطوة 10: CI / CD FTW!

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

  1. ابدأ بإنشاء مشكلة جديدة لهذه الميزة: https://github.com/robvanderleek/cicd-buzz/issues/1
  2. أنشئ فرعًا في Git لهذه التذكرة: https://github.com/robvanderleek/cicd-buzz/tree/issue-1
  3. * السحر الترميز يحدث هنا *
  4. راقب ردود الفعل من Travis CI و Better Code Hub: https://github.com/robvanderleek/cicd-buzz/commits/issue-1
  5. تحقق من مثيل التطبيق قيد التشغيل عن طريق تشغيل أحدث صورة Docker محليًا: docker run --rm -p5000: 5000-robvanderleek / cicd-buzz: issue-1 ، كما يمكنك مشاركة هذه الحاوية مع الآخرين.
  6. إذا كنت راضيًا عن الميزة الجديدة ، فافتح "طلب السحب" ورمزك جاهز للشحن بواسطة خط أنابيب CI / CD للإنتاج: https://github.com/robvanderleek/cicd-buzz/pull/2
فرع ميزة مولد CI / CD الطنان يعمل في حاوية Docker محلية

سعيد الترميز والشحن!