تخطيط يذهب مشروع الحيوانات الأليفة على المبادئ الطوعية

مرحبا يا هبر! اسمي Artem Zheltak ، أنا قائد فريق ، وأستاذ أيضًا في دورة "Golang Developer" في OTUS. تحسبا لبدء سلسلة جديدة من الدورة ، أريد أن أشارك مقالتي معك.


أعتقد أن Golang رائعة ، لكن لا يزال هناك العديد من مشاريع php وغيرها التي تعمل على VPS و VDS في العالم. يمكنك وضع عامل ميناء هناك ، لكن هذا (وفقًا للمؤلف) يمثل إعادة تعقيد المهمة. يمكنك تجميع ملف وتحميله عبر بروتوكول نقل الملفات - فهو غير آمن وليس فنغ شوي ، SFTP أكثر أمانًا ، لكن لا يتم إعادة فنغ شوي مرة أخرى. ثم دعونا أتمتة هذه العملية من خلال CircleCI . سنكتب ملف التكوين لخطوة CI خطوة بخطوة ، في النهاية سنقوم بجمع النتيجة وتشغيل النشر.




متطلبات التنفيذ


  1. الحد الأدنى من الابتكارات الخادم
  2. يجب أن يكون النشر تلقائيًا
  3. نقطة الإدخال للنشر هي وضع علامة لتجميع dev وتأكيد يدوي إضافي لـ prod
  4. يجب أن تمر الجمعية الاختبار التلقائي
  5. نسخة آلية اللف اليدوي

لماذا CircleCI؟


من البداية ، استخدم المشروع مستودع bitbucket خاص. (الآن توجد مستودعات خاصة بالفعل في جيثب). وبدون مغادرة النظام الإيكولوجي ، قرر Atlasian أخذ CircleCI (يشار إليه فيما يلي باسم CI). اعجبني ذلك:

  • الحد الأدنى الإعداد
  • سه ميزة التصحيح
  • نسخة مجانية ولكن مع قيود
    • 2500 نقطة في الأسبوع (حوالي 250 دقيقة من الانتهاء) # يتم جمعها ونشرها بسرعة ، لدينا ما يكفي
    • تنفيذ واحد الخيوط # ليس لدينا العديد من مشروع الحيوانات الأليفة
    • فقط لينكس و windows # نحتاج لينكس

الجزء الأول ، سير العمل


قم بإنشاء مجلد .circle وقم بإنشاء ملف config.yml فيه ووصف سير العمل المتوقع هناك (ترتيب تنفيذ المهمة)

workflows: version: 2 tagged-build: jobs: - test - dev_deploy: requires: - test - approve_master_deploy: type: approval requires: - test - dev_deploy - prod_deploy: requires: - dev_deploy - approve_master_deploy 

هذه هي النتيجة:

صورة

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

 - dev_deploy: requires: - test filters: branches: ignore: /.*/ tags: only: /.*/ 

الخطوة الثانية ، الأسهل


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

 jobs: test: docker: - image: circleci/golang:1.12 working_directory: ~/go-example/ steps: - checkout #   linter'   - run: go test -cover -v ./... 

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

أضف ملف supervisor_ph.conf إلى مجلد .circleci ، ضمن CI PH_NAME ، سيتم تغييره إلى اسم المشروع. وفي نفس الملف سوف نكتب إخراج السجلات.

 [program:PH_NAME] stopasgroup=true user=deploy-user autostart=true autorestart=true stdout_logfile=/var/log/supervisor/PH_NAME.log stderr_logfile=/var/log/supervisor/PH_NAME.log redirect_stderr=true 

كل ما يميز مشروعنا عن الآخرين:



نشر الوقت


بالنسبة إلى dev و prod ، يتم تغيير الخوادم فقط وتتم إضافة لاحقة إلى اسم التطبيق. يتم تخزين التكوين في متغيرات البيئة. ( 12 عاملا من التطبيقات ) سوف نأخذ هذا الجزء في البيئة ، وسوف نكرر الباقي.

 prod_deploy: environment: TARGET_IP: 0.0.0.0 TARGET_DIR: /var/www/deploy-user/go-example REMOTE_USER: deploy-user SERVICE_NAME: go_example_prod docker: - image: circleci/golang:1.12 working_directory: ~/go-example/ steps: - checkout - add_ssh_keys #   ci ,    - run: go build -ldflags "-X main.version=$CIRCLE_TAG" -o ./main ./src/main - run: ssh -o "StrictHostKeyChecking=no" $REMOTE_USER@$TARGET_IP "mkdir $TARGET_DIR/v$CIRCLE_TAG" #    ,        - run: scp main $REMOTE_USER@$TARGET_IP:$TARGET_DIR/v$CIRCLE_TAG/ #       - run: sed "s/PH_NAME/$SERVICE_NAME/g" .circleci/supervisor_ph.conf > .circleci/$SERVICE_NAME.conf - run: echo command=$TARGET_DIR/v$CIRCLE_TAG/main >> .circleci/$SERVICE_NAME.conf - run: scp .circleci/$SERVICE_NAME.conf $REMOTE_USER@$TARGET_IP:$TARGET_DIR/v$CIRCLE_TAG/ - run: ssh $REMOTE_USER@$TARGET_IP "ln -sf $TARGET_DIR/v$CIRCLE_TAG/$SERVICE_NAME.conf /etc/supervisord.d" - run: ssh $REMOTE_USER@$TARGET_IP "supervisorctl -c /etc/supervisord.conf reread && supervisorctl -c /etc/supervisord.conf update" - run: curl "$TELEGRAM_SERVICE?msg=$SERVICE_NAME%20v$CIRCLE_TAG%20deployed&channel=go_deploy" 

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

يضاف المتغير `$ TELEGRAM_SERVICE` من خلال القسم BUILD SETTINGS → متغيرات البيئة.

 - run: command: curl "$TELEGRAM_SERVICE?msg=$SERVICE_NAME%20v$CIRCLE_TAG%20failed&channel=go_deploy" when: on_fail 

خط النهاية


نحن ندفع في github أو في bitbucket. بعد أن نذهب إلى CircleCI في العنصر إضافة مشروع



ثم حدد بدء البناء. ستكون الخطوة الأخيرة هي إضافة مفتاح ssh للترخيص على الخادم ضمن المستخدم المحدد.



يمكن تنفيذ كل شيء ، ووضع علامة والبدء في الاستمتاع بالحياة. النسخة النهائية ./.circleci/config.yml - هنا

Source: https://habr.com/ru/post/ar485240/


All Articles