كيفية بناء خادم CI / CD خط أنابيب على AWS

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

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

لقد مر بعض الوقت منذ أن بحثت بالتفصيل في أدوات التكامل والتسليم المتاحة لدى AWS ، وبينما نستخدم CodeDeploy لمشروع آخر يعمل على EC2 ، لم أستخدمها مطلقًا لنشر مشروع بدون خادم. بعد التعرف على الأدوات التي يمكنني رؤيتها ، يوجد الآن تكامل أصلي لنشر CloudFormation و Lambda - من المفترض مع SAM AWS - نحن نستخدم إطار عمل بدون خادم وعلى الرغم من أنه يولد قوالب CloudFormation ، إلا أنه لا يعمل خارج الصندوق في AWS.

الاستعداد

خدمات AWS التي سأستخدمها هي EC2 و Docker و ECR و S3 و IAM و CodeBuild و CodePipeline و CloudWatch و CloudTrail. ستحتاج إلى فهم المستوى الأساسي على الأقل لما تفعله كل من هذه الخدمات لمتابعة.

أنا في المقام الأول أكتب التعليمات البرمجية الخلفية في .NET ، والتي يستند هذا البرنامج التعليمي. لا تحتوي أي من صور CodeBuild التي تم إنشاؤها مسبقًا على أوقات تشغيل .NET و NodeJS عليها (NodeJS مطلوب لإطار عمل الخادم). إذا كانت وظائف Lambda مكتوبة في NodeJS ، فإن عملية إعداد خط أنابيب النشر تصبح أبسط كثيرًا ، حيث إنه وقت التشغيل الوحيد الذي تحتاج إلى تثبيته على صورة Docker (يمكنك تخطي الكثير من هذا البرنامج التعليمي). أود أن أذكر أيضًا ، كانت هذه أول مرة أتعرف فيها على الحاويات ، لذلك كنت متحمسًا لتعلم شيء جديد.

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

1. إنشاء مثيل EC2 وتثبيت Docker

ابدأ بإدارة نسخة AWS Linux 2 EC2 قياسية - يجب أن تكون ذاتية التوضيح. تسجيل الدخول وتثبيت Docker باستخدام هذه الأوامر:

sudo يم التحديث - ص
sudo الأمازون-لينكس-إضافات تثبيت عامل ميناء
سودو خدمة عامل ميناء بدء

سنحتاج أيضًا إلى إضافة مستخدم ec2 إلى مجموعة عامل الميناء حتى تتمكن من تنفيذ أوامر Docker دون استخدام sudo:

sudo usermod -a -G docker ec2-user

بعد تنفيذ الأمر ، قم بتسجيل الخروج وتسجيل الدخول مرة أخرى إلى مثيل EC2 الخاص بك بحيث يمكن للمستخدم ec2 تحمل الأذونات الجديدة. ثم تحقق من أن مستخدم ec2 يمكنه تشغيل أوامر Docker دون sudo:

معلومات عامل ميناء
إخراج الأمر معلومات عامل ميناء

2. بناء صورة عامل الميناء ودفع إلى ECR

بافتراض نجاح الخطوة أعلاه ، فإن المرحلة التالية هي بناء صورة Docker ودفعها إلى ECR. يوفر AWS الصور الأساسية لـ CodeBuild على github ، مما يجعل بناء صورتنا أسهل.

لقد نشرت أيضًا صورتي على github إذا كنت لا ترغب في الاطلاع على الخطوات أدناه لإنشاء صورتك الخاصة: https://github.com/effectivedigital/serverless-deployment-image

ابدأ باستنساخ الصور والتنقل في دليل .NET Core 2.1:

بوابة استنساخ https://github.com/aws/aws-codebuild-docker-images.git
مؤتمر نزع السلاح أوس - codebuild - عامل ميناء الصور
مؤتمر نزع السلاح أوبونتو / نقطة صافي / كور 2.1 /

افتح Dockerfile في محرر النصوص المفضل لديك:

نانو دوكرفيل

أضف الأوامر لتثبيت NodeJS والإطار بدون خادم في نهاية الأوامر الأخرى الموجودة بالفعل في Dockerfile. لقد تمكنت من الحصول على غالبية هذه الأوامر من صورة NodeJS Docker من نفس مستودع AWS:

# تثبيت التبعيات العقدة
ENV NODE_VERSION = "10.14.1"
# gpg keys المدرجة في https://github.com/nodejs/node#release-team
مجموعة RUN -ex \
 && للمفتاح في \
 94AE36675C464D64BAFA68DD7434390BDBE9B9C5 \
 B9AE9905FFD7803F25714661B63B535A4C206CA9 \
 77984A986EBC2AA786BC0F66B01FBB92821C587A \
 56730D5401028683275BD23C23EFEFE93C4CFFFE \
 71 DCFD284A79C3B38668286BC97EC7A07EDE3FC1 \
 FD3A5288F042B6850C66B31F09FE44734EB7990E \
 8FCCA13FEF1D0C2E91008E09770F7A9A5AE15600 \
 C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \
 DD8F2338BAE7501E3DD5AC78C273792F7D83545D \
 4ED778F539E3634C779C87C6D7062848A1AB005C \
 A48C2BEE680E841632CD4E44F07496B3EB3C1762 \
 . فعل \
 gpg - keyserver hkp: //p80.pool.sks-keyservers.net: 80 - recv-keys "$ key" || \
 gpg - keyserver hkp: //ipv4.pool.sks-keyservers.net - recv-keys "$ key" || \
 gpg - keyserver hkp: //pgp.mit.edu: 80 - recv-keys "$ key"؛ \
 فعله
مجموعة RUN -ex \
 && wget "https://nodejs.org/download/release/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.gz" -O node-v $ NODE_VER $
 && wget "https://nodejs.org/download/release/v$NODE_VERSION/SHASUMS256.txt.asc" -O SHASUMS256.txt.asc \
 && gpg - الدفعي - فك تشفير - الإخراج SHASUMS256.txt SHASUMS256.txt.asc \
 && grep "node-v $ NODE_VERSION-linux-x64.tar.gz \ $" SHASUMS256.txt | sha256sum -c - \
 && tar -xzf "node-v $ NODE_VERSION-linux-x64.tar.gz" -C / usr / local - strip-components = 1 \
 && rm "node-v $ NODE_VERSION-linux-x64.tar.gz" SHASUMS256.txt.asc SHASUMS256.txt \
 && ln -s / usr / local / bin / node / usr / local / bin / nodejs \
 && rm -fr / var / lib / apt / lists / * / tmp / * / var / tmp / *
تشغيل RP npm غير صحيح-بيرم صحيح
CMD ["العقدة"]
# تثبيت Serverless الإطار
مجموعة RUN -ex \
 && npm install -g serverless

الآن يمكن بناء الصورة ووضع علامات عليها:

عامل بناء البناء -t أوس / codebuild / دوت نت.

بعد اكتمال البناء ، يمكن تشغيل الصورة للتأكد من أن كل شيء يعمل وأنه لم يتم تثبيت الخادم بشكل صحيح:

عامل تشغيل تشغيل -itryentpoint sh aws / codebuild / dot-net -c bash
sls -v
تشغيل sls -v داخل الحاوية التي تم إنشاؤها حديثًا

بعد ذلك ، سنقوم بإنشاء مستودع في ECR باستخدام AWS CLI. بعد تشغيل الأمر ، سيكون المخزون الجديد مرئيًا في وحدة تحكم AWS:

aws ecr create-repository - repository-name codebuild-dotnet-node
استجابة من AWS CLI بعد إنشاء مستودع في ECRمستودع المنشأ حديثا في ECR

سنقوم الآن بوضع علامة على صورة aws / codebuild / dot-net التي أنشأناها مسبقًا مع قيمة مستودع Uri من الخطوة السابقة:

علامة عامل ميناء aws / codebuild / dot-net  .dkr.ecr.ap-south-2.amazonaws.com / codebuild-dotnet-node

قم بتشغيل الأمر get-login للحصول على سلسلة أمر مصادقة تسجيل الدخول إلى عامل ميناء سجل الحاوية:

aws ecr get-login - no-include-email
أمر تسجيل الدخول للمصادقة في ECR

قم بتشغيل أمر تسجيل الدخول إلى عامل ميناء الذي تم إرجاعه عن طريق تشغيل الأمر get-login في الخطوة الأخيرة.

تسجيل دخول عامل ميناء -u AWS -p eyJwYXlsb2FkIjoiNGZnd0dSaXM1L2svWWRLMmhJT1c0WWpOZEcxamJFeFJOK2VvT0Y5 [...] https: //  .dkr.ecr.ap

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

عامل ميناء دفع  .dkr.ecr.ap-south-2.amazonaws.com / codebuild-dotnet-node
عامل الميناء على EC2 هو خلق صورتناصورة عامل الميناء في ECR

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

{
  "الإصدار": "2008-10-17" ،
  "بيان": [
    {
      "Sid": "EnableAccountAccess" ،
      "التأثير": "السماح" ،
      "المالك": "*"،
      "عمل": [
        "ائحة المجلس الأوروبي: BatchCheckLayerAvailability"
        "ائحة المجلس الأوروبي: BatchGetImage"
        "ائحة المجلس الأوروبي: DescribeImages"
        "ائحة المجلس الأوروبي: DescribeRepositories"
        "ائحة المجلس الأوروبي: GetAuthorizationToken"
        "ائحة المجلس الأوروبي: GetDownloadUrlForLayer"
        "ائحة المجلس الأوروبي: GetRepositoryPolicy"
        "ائحة المجلس الأوروبي: ListImages"
      ]
    }
  ]
}

3. إنشاء خط أنابيب الخاص بك

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

لن ألصق المصدر بالكامل من ملف serverless.yml ، يمكنك استنساخه من github بدلاً من ذلك: https://github.com/effectivedigital/serverless-deployment-pipeline

ألقِ نظرة على القالب بدون خادم لفهم ما الذي ستفعله بالضبط ، ولكن باختصار ستذهب إلى الإعداد:

  • دلاء 3x S3
  • 1x سياسة الجرافة
  • 3x أدوار IAM
  • 1X مشروع CodeBuild
  • 1x خط أنابيب CodePipeline
  • 1X حدث CloudWatch
  • 1X CloudTrail تريل

مرة واحدة المستنسخة ، تحديث DockerImageArn لصورتك في ECR. إذا كنت ستقوم بإنشاء حزم نشر مع اسم ملف غير Deployment.zip ، فقم بتحديث DeploymentFilename أيضًا:

DockerImageArn:  .dkr.ecr.ap-south-2.amazonaws.com / codebuild-dotnet-node: الأحدث
DeploymentFilename: Deployment.zip

هذا كل شيء ، خط الأنابيب جاهز الآن للنشر. قم بتشغيل الأمر serverless publish وانتظر حتى يتم إعداد كل شيء لك:

SLS نشر -V
كومة CloudFormation الخاصة بنا التي تم إنشاؤها بواسطة إطار عمل بدون خادمخط أنابيب CodePipeline تم إنشاؤه بواسطة إطار عمل serverlessمشروع CodeBuild تم إنشاؤه بواسطة إطار عمل serverless

4. إضافة buildSpec.yml إلى التطبيق الخاص بك

عندما يكتشف CodePipeline تغييرًا في ملف النشر في S3 ، سيُخبر CodeBuild بالتشغيل ومحاولة إنشاء التطبيق ونشره. ومع ذلك ، يحتاج CodeBuild أيضًا إلى معرفة الأوامر التي يجب تشغيلها لإنشاء ونشر التطبيق الخاص بك ، يحتوي buildSpec.yml على الإرشادات التي يتبعها CodeBuild.

لقد قمتُ بإنشاء تطبيق hello world بسيط للغاية يتضمن مثال ملف buildSpec.yml الذي يمكنك تضمينه: https://github.com/effectivedigital/serverless-deployment-app

بدلاً من ذلك ، يمكنك إنشاء ملف buildSpec.yml في تطبيقاتك الحالية وملء الإرشادات أدناه:

الإصدار: 0.2
المراحل:
  pre_build:
    أوامر:
      - الشمود a + x *
  بناء:
    أوامر:
      - ./build.sh
  post_build:
    أوامر:
      - نشر SLS -v -s $ المرحلة

5. اختبار خط أنابيب الخاص بك

كل شيء في مكانه الآن لتشغيل خط الأنابيب الخاص بك لأول مرة. قم بإنشاء حزمة تسمى Deployment.zip والتي يجب أن تتضمن جميع الملفات الخاصة بالتطبيق بدون خادم وملف buildSpec.yml.

بعد لحظات قليلة ، يجب على CloudTrail تسجيل حدث PutObject ، قم بتشغيل قاعدة حدث CloudWatch والتي ستقوم بتشغيل CodePipeline لبدء التشغيل.

تم تحميل Deployment.zip على S3بدأت CodePipeline والبناء قيد التقدم

إذا نقرنا على تفاصيل خطوة AWS CodeBuild ، فيمكننا النظر في التقدم المحرز في البناء والنشر:

سيحصل CodeBuild على الإخراج من صورة Docker التي تؤدي الإنشاء والنشرلقد كان نشرنا ناجحًا!

التطبيق الجديد الذي تم نشره بواسطة Pipeline لدينا مرئي أيضًا في CloudFormation:

يمكننا اختبار نقطة نهاية واجهة برمجة التطبيقات التي تم إنشاؤها في تطبيقنا البسيط (يوجد عنوان URL في إخراج CodeBuild أو واجهة بوابة API) ونرى أن التطبيق يعمل بنجاح:

باستخدام ساعي البريد لاستدعاء API لدينا

ملخص

يسمح لك CodePipeline بإنشاء خط أنابيب CI / CD قابل للتحجيم ومرن ومنخفض التكلفة ويساعد في حل بعض المشكلات المرتبطة بخطوط الأنابيب التقليدية التي تم إنشاؤها على الخوادم.

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

انضم إلى مجتمعنا Slack وقراءة موضوعات Faun الأسبوعية الخاصة بنا ⬇

إذا كانت هذه المشاركة مفيدة ، فالرجاء النقر على زر التصفيق أدناه عدة مرات لإظهار دعمك للمؤلف! ⬇