كيفية إنشاء أنبوب CI/CD لصور Docker في CircleCI

إذا كنت تبحث عن وسيلة لاختبار ونشر صور Docker عبر CircleCI، يمكن أن يأخذك إنشاء أنبوب CI/CD بعيدًا لتحسين تسليم البرنامج الخاص بك.

في هذا البرنامج التعليمي، ستتعلم كيف يمكنك بشكل محتمل تطوير أنبوب CI/CD لصورة Docker الخاصة بك باستخدام CircleCI.

اقرأ ونشر صور Docker الخاصة بك، فقط إذا نجحت في الاختبار!

المتطلبات المسبقة

سيكون هذا البرنامج التعليمي عرضًا عمليًا. إذا كنت ترغب في متابعة، تأكد من أن لديك ما يلي:

إنشاء صورة Docker لتطبيق قائم على لغة Python

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

1. افتح محطة الطرفية الخاصة بك وقم بتشغيل الأمر التالي لـ تثبيت Flask و Pytest. Flask هو إطار يستخدم لبناء تطبيقات الويب بلغة Python بينما يُستخدم Pytest لكتابة اختبارات الشفرة بلغة Python.

pip install flask pytest

2. بعد ذلك، قم بإنشاء دليل مشروع بالاسم الذي تفضله، ولكن يُسمى دليل المشروع flask-circleci في هذا العرض التوضيحي. يعتبر هذا الدليل هو المكان الذي ستخزن فيه الموارد الخاصة بك لهذا البرنامج التعليمي.

mkdir flask-circleci

3. قم بإنشاء ملف يُسمى flask-circleci/main.py واملأ الشيفرة التالية.

الشيفرة أدناه تعرض نص “مرحبًا بك في تطبيق Flask الخاص بي” على صفحة البداية في متصفح.

from flask import Flask

app = Flask(__name__) # قم بإنشاء مثيل من فئة Flask التي قمت بتوريدها للتو

@app.route('/')
def main():
    # عرض سلسلة نصية في صفحة البداية
    return "Welcome to my Flask App"

4. الآن، قم بإنشاء ملف آخر يُسمى flask-circleci/test_main.py وانسخ/الصق الشيفرة التالية.

الشيفرة أدناه تُنشئ عميل اختبار لتطبيقك.

تتطلب Pytest أن يبدأ اسم ملف الاختبار الخاص بك بـ test_ كما هو موضح أدناه.

from main import app

def test_main():
		# ينشئ عميل اختبار لهذا التطبيق.
    response = app.test_client().get('/') 

		# التحقق من أن رمز الحالة للصفحة ('/') هو 200
    assert response.status_code == 200 
		# التحقق من عبارة الإرجاع إلى الصفحة
    assert response.data == b'Welcome to my Flask App' 

5. قم بتشغيل الأوامر التالية للانتقال إلى دليل مشروعك (flask-circleci)، وتشغيل الاختبار لمشروعك.

cd flask-circleci
pytest

إذا نجح الاختبار، ستحصل على تقدم بنسبة 100٪، كما هو موضح أدناه.

Running Test for the Project

6. بعد ذلك، قم بإنشاء ملف نصي (requirements.txt) لوثائق الاعتمادات الخاصة بك في الدليل الجذر واملأ النص أدناه. هذا الملف أساسي عند بناء صورة Docker الخاصة بك بحيث يعمل بشكل صحيح.

Flask==2.0.3
pytest==6.2.5

7. أخيرًا، قم بإنشاء ملف جديد (flask-circleci/Dockerfile)، واكتب التعليمات أدناه في Dockerfile لبناء صورة Docker الخاصة بك.

التعليمات في Dockerfile تقوم بما يلي:

  • إنشاء ملف في صورتك.
  • نسخ جميع الملفات في المجلد الحالي (flask-circleci).
  • تشغيل كودك
# تعيين الصورة الأساسية التي سيتم بناء صورتك عليها
FROM python:3.8 
# إنشاء دليل يسمى flask-circleci في الجذر.
# سيحتوي هذا الدليل على الكود الذي يتواجد حاليًا في
RUN mkdir /flask-circleci

# جعل /flask-circleci هو الدليل العامل
WORKDIR /flask-circleci

# نسخ ملف متطلباتك إلى الدليل الذي أنشأته للتو
COPY requirements.txt /flask-circleci 

RUN pip install -r requirements.txt

# نسخ الدليل الحالي في جهازك المحلي إلى /flask-circleci في صورتك
ADD . /flask-circleci

EXPOSE 5000

CMD python main.py

إنشاء خط أنابيب CircleCI CI/CD

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

لإنشاء خط الأنابيب CI/CD، اتبع الخطوات التالية:

1. افتح متصفح الويب المفضل لديك وقم بتسجيل الدخول إلى حسابك على Docker Hub.

2. في صفحة البداية لـ Docker Hub، انقر على الخيار إنشاء مستودع لإنشاء مستودع على Docker Hub.

Creating a Repository

3. قم بتعيين اسم فريد لمستودعك. يستخدم هذا البرنامج التعليمي مستودعًا يسمى circleci-tutorial، كما هو موضح أدناه.

Naming and Creating the Docker Hub Repository

4. أنشئ ملفًا جديدًا (flask-circleci/config.yml) في جذر مشروعك، وانسخ/الصق الشيفرة أدناه إلى ملف config.yml.

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

عادةً، في مشروع حي، ترغب في وضع اسم المستخدم وكلمة المرور الخاصة بك داخل CircleCI أو ربما في ملف .env.

version: 2  # إصدار CircleCI
jobs:
  build:
    docker:
      - image: python:3.8
    steps:
      - checkout

      - run:
        # يقوم بإنشاء بيئة افتراضية لمشروعك، 
				# يقوم بتثبيت التبعيات فيها وتشغيل الاختبارات
          name: Run unit tests
          command: |
            python3 -m venv venv
            . venv/bin/activate
            pip install -r requirements.txt
            pytest
			# يقوم بإنشاء بيئة Docker عن بُعد مكونة لتنفيذ أوامر Docker.
      - setup_remote_docker 
       
      - run:
        # يقوم بتثبيت عميل Docker الذي سيتم استخدامه لتشغيل أوامر Docker
          name: Install Docker client
          command: |
            set -x
            VER="17.03.0-ce"
            curl -L -o /tmp/docker-$VER.tgz https://get.docker.com/builds/Linux/x86_64/docker-$VER.tgz
            tar -xz -C /tmp -f /tmp/docker-$VER.tgz
            mv /tmp/docker/* /usr/bin
      - run:
         # يقوم ببناء صورة Docker للدفع إلى Docker Hub
				 # نمط الوسم (-t) كما هو موضح أدناه، حيث يقوم CircleCI 
				 # بالحصول على Dockerfile من الدليل الحالي.
         # <docker_hub_username/docker-hub-password:version>.
          name: Build Docker image
          command: docker build -t khabdrick/circleci-tutorial:v1 .

      - run:
        # يقوم بدفع صورة Docker التي قمت بإنشائها إلى Docker Hub.
        # استبدل khabdrick/circleci-tutorial:v1 بـ 
				# <docker_hub_username/docker-hub-password:version> الذي استخدمته لبناء الصورة أعلاه
          name: Push to Docker Hub
          command: |
            docker login -u username -p password
            docker push khabdrick/circleci-tutorial:v1

5. أخيرًا، قم بتشغيل الأوامر التالية في جذر مشروعك لـ commit و push الشيفرة (flask-circleci/config.yml) إلى مستودع GitHub الخاص بك.

git add . # يضيف التغييرات إلى منطقة التجهيز
git commit -m "update" # يقوم بتنفيذ تغييراتك
git push # يقوم بالدفع إلى GitHub

تفعيل خط أنابيب CircleCI CI/CD

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

1. قم بتسجيل الدخول إلى حساب CircleCI الخاص بك باستخدام حساب GitHub الخاص بك على متصفح الويب.

2. بعد ذلك، انقر على علامة التبويب المشاريع في اللوحة الجانبية اليسرى، وانقر على زر إعداد المشروع على الجانب الأيمن من مشروعك لتفعيل خط الأنابيب الخاص بـ CircleCI على المشروع.

نظرًا لأنك قد قمت بتسجيل الدخول إلى CircleCI باستخدام حساب GitHub الخاص بك، يتم مزامنة مشاريعك مع CircleCI، كما هو موضح في الصورة أدناه.

Setting up a Project

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

انقر على البناء لرؤية جميع الخطوات التي تم تشغيلها في خط الأنابيب.

Viewing Project Status

أدناه، يمكنك رؤية قائمة الخطوات التي اتخذتها CircleCI لتشغيل الأنبوب.

Viewing Steps that Ran the Pipeline

4. في النهاية، انتقل مرة أخرى إلى مستودع Docker Hub الخاص بك، وسترى الصورة التي قمت بدفعها إلى Docker Hub من خلال خط الأنابيب الخاص بـ CircleCI.

Viewing Pushed circleci docker images in Docker Hub Repository

دفع التغييرات إلى GitHub لتشغيل خط الأنابيب الخاص بـ CircleCI

حتى الآن، لديك بالفعل خط أنابيب CircleCI العامل. ولكن ربما قمت بتغييرات على مشروعك. إذا كان الأمر كذلك، كيف تعرف أن الخط الأنابيب لا يزال يعمل؟ يمكنك تشغيل CircleCI عن طريق دفع التغييرات إلى مستودع GitHub الخاص بك ورؤية ما إذا كان الاختبار سينجح.

1. على جهازك المحلي، قم بتعويض الكود الذي لديك في test_main.py بالكود أدناه. الكود أدناه يضمن بشكل متعمد فشل الاختبار لأن رمز الحالة تغير من 200 إلى 400.

from main import app

def test_main():
		# Creates a test client for this application.
    response = app.test_client().get('/') 

		# assert the status code of the page('/') is 400 when it isn't, 
		# causing the test to fail.
    assert response.status_code == 400 
		# assert the return statement ton the page
    assert response.data == b'Flask App' 

2. بعد ذلك، قم بتعويض steps في config.yml الذي يقوم ببناء صورة Docker ودفعها إلى Docker Hub بالكود أدناه.

في الكود أدناه، أنت فقط تقوم بتغيير الإصدار للتأكد من أنه سيتم دفع التغييرات الجديدة فقط إلى مستودع GitHub الخاص بك.

      - run:
          name: Build Docker image
          command: docker build -t khabdrick/circleci-tutorial:v2 .

      - run:
          name: Push to DockerHub
          command: |
            docker login -u username -p password
            docker push khabdrick/circleci-tutorial:v2

3. قم بتشغيل الأوامر التالية على جذر مشروعك لعملية commit و push للكود إلى مستودع GitHub الخاص بك.

git add . # adds changes to staging area
git commit -m "v2" # commits your changes
git push # Push to GitHub

4. الآن، انتقل إلى لوحة تحكم CircleCI الخاصة بك، وسترى أن البناء فشل، كما هو موضح أدناه.

انقر على “بناء” لرؤية الخطوات المتخذة لدفع التغييرات وتأكيد سبب فشل البناء.

Viewing Project Status (Failed)
Showing Failed Tests

5. في النهاية، انتقل إلى مستودع Docker Hub الخاص بك وتأكد من عدم دفع التغييرات.

كما يمكنك رؤية في الصورة أدناه، لم يتم تحميل v2 لأن الاختبار فشل.

Viewing Repository in Docker Hub

الاستنتاج

طوال هذا البرنامج التعليمي، تعلمت كيفية كتابة الاختبارات وجعل تطبيق Python الخاص بك متوافقًا مع Docker. لقد أنشأت أنبوب عمل CI/CD مع CircleCI الذي يقوم بتشغيل الاختبارات لتطبيقك ويقوم بدفع صورة Docker الخاصة بك إلى Docker Hub.

في هذه النقطة، لديك بالفعل معرفة أساسية حول تطوير أنبوب عمل CI/CD مع CircleCI. الآن، كيف تنوي استخدام هذه المعرفة الجديدة؟ ربما بإنشاء أنبوب عمل CI/CD ينشر صورة Docker الخاصة بك على Heroku ؟

Source:
https://adamtheautomator.com/circleci-docker-images/