نشر على PythonAnywhere من جيثب



يمكن للجميع القيام بذلك:


مشروع محلي -> جيثب


باستخدام الوصول (المدفوع) ssh ، يمكنك القيام بذلك:


المشروع المحلي -> PythonAnywhere


يوضح المقال كيف (مجانًا) للقيام بذلك:


المشروع المحلي -> github -> PythonAnywhere


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




لماذا؟


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


ولكن الخدمة لديها أيضا عيوب. ماذا لو كنت تريد فتح الكود الذي تعمل عليه؟ هل تؤيد وتجري تغييرات في مكانين في وقت واحد؟ مرة واحدة على إنتاج PythonAnywhere ومرة ​​أخرى على GitHub للمطورين الآخرين. ماذا لو كنت تقبل طلب السحب أو تريد دمج CI؟ تكرار جميع الإجراءات باستمرار غير مريح للغاية.


GitHub هي خدمة رائعة للعمل معًا وعرض الكود المصدري ، واجهة المستخدم الخاصة بهم أفضل من PythonAnywhere ، وما تحريره مباشرة على PythonAnywhere ليس ممتعًا للغاية. ماذا لو استطعنا الجمع بين أفضل ما في العالمين؟


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


سمعت بالفعل نفخة: "جيد ، جيد ، مقتنع ، لكن كيف يمكن تحقيق ذلك؟" ليست كلمة أكثر!




كيف؟


نحن نستخدم صفحات ويب Github لإعلامك بتحديث التطبيق ، وسحبه وإعادة تحميله.


على سبيل المثال ، سأفكر في تطبيق SwagLyrics ، الذي أحمل خلفيته على PythonAnywhere. أنا أستخدم Flask ، لذلك ستكون العملية مختلفة عن إطار آخر.


أولاً ، قم بمزامنة المشروع بحيث يكون GitHub هو الأصل. إذا لم تقم بإنشاء مستودع PythonAnywhere بعد ، فيمكنك تهيئته أو ترميزه مباشرةً من GitHub.


شيء مثل:


git init git remote add origin https://github.com/yourusername/yourreponame.git 

انتقل الآن إلى GitHub -> الإعدادات -> Webhooks -> إضافة Webhook


هناك سترى:



في حقل "عنوان URL الخاص بالتحميل " ، أضف your_domain / route_to_update


على سبيل المثال ، يشير webhook الخاص بمستودع التخزين الخاص بي إلى nbsp؛ https://aadibajpai.pythonanywhere.com/update_server


قم بتغيير "نوع المحتوى" من التطبيق / x-www-form-urlencoded إلى application / json (سأخبرك عن سبب الحاجة إلى ذلك لاحقًا).


لن نلمس الحقل السري بعد.


تأكد من تحديد خيار "حدث الدفع" وانقر فوق "إضافة webhook".


افتح التطبيق الخاص بك على Flask ، سنقوم بتكوين طريق لتلقي المعلومات من GitHub عند حدوث حدث دفع. يجب أن يكون المسار هو المسار الذي حددته في حقل "عنوان URL الخاص بالتحميل". نحن لا نحدد صراحة الفرع الرئيسي ، كما للبساطة ، فإنه يعني ضمنا أنه هو الوحيد في المستودع.


سيكون أبسط الإعداد مثل هذا:


 from flask import Flask, request import git 

 app = Flask(__name__) 

 @app.route('/update_server', methods=['POST']) def webhook(): if request.method == 'POST': repo = git.Repo('path/to/git_repo') origin = repo.remotes.origin 

  origin.pull() 

  return 'Updated PythonAnywhere successfully', 200 else: return 'Wrong event type', 400 

هذا هو المثال الأكثر تافهة ، إصدار أقل اكتمالا سيكون أقل.


الآن ، كلما حدث حدث دفع ، سيقوم التطبيق بتحديث نفسه عن طريق إجراء السحب.


إذا سارت الأمور بسلاسة ، إليك ما ستراه بعد الالتزام التالي:



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


إعادة تحميل تطبيق الويب التلقائي


سوف نستخدم السنانير بوابة. هذه ليست سوى أوامر shell تنفيذها بعد الأحداث. لا يوجد ربط للحدث بعد السحب ، ولكن ...


نحن نستخدم حقيقة أن git pull ليس أكثر من git fetchgit merge ، ولكن هناك رابط للحدث بعد الدمج . يتم تنفيذه إذا اكتمل السحب بنجاح.


في مستودع PythonAnywhere الخاص بك ، انتقل إلى .git / hooks /


سيكون هناك بالفعل العديد من السنانير الحالية ، إضافة الخاصة بك لهم عن طريق إنشاء ملف ما بعد دمج


اكتب الكود التالي فيه:


 #!/bin/sh touch /path/to/username_pythonanywhere_com_wsgi.py 

استخدم المسار إلى wsgi ، والذي ، عند تغييره (اللمس) ، يعيد تشغيل التطبيق.


لجعل الملف قابل للتنفيذ ، افتح وحدة التحكم وتشغيله


 chmod +x post-merge 

تأكد من أن إعادة التشغيل يعمل بجعل التزام جديد.


الآن دعنا ننتقل إلى تأمين webhook.




حماية Webhook


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


أولاً ، أضف رمزًا سريًا على PythonAnywhere كمتغير للبيئة ، وكذلك في الحقل "السري" في إعدادات GitHub webhook. هنا يتم وصف العملية بمزيد من التفاصيل.


تقدم GitHub طرقها في روبي ، لكننا نستخدم Python ، لذلك سوف نستخدم وظيفة المقارنة هذه:


 import hmac import hashlib def is_valid_signature(x_hub_signature, data, private_key): # x_hub_signature and data are from the webhook payload # private key is your webhook secret hash_algorithm, github_signature = x_hub_signature.split('=', 1) algorithm = hashlib.__dict__.get(hash_algorithm) encoded_key = bytes(private_key, 'latin-1') mac = hmac.new(encoded_key, msg=data, digestmod=algorithm) return hmac.compare_digest(mac.hexdigest(), github_signature) 

الآن قم بتعديل وحدة التحكم update_server للتحقق مما إذا كان التوقيع صالحًا عن طريق إضافة هذه الأسطر قبل جزء تحديث التعليمات البرمجية:


 x_hub_signature = request.headers.get('X-Hub-Signature') if not is_valid_signature(x_hub_signature, request.data, w_secret): 

يجب أن يتطابق w_secret مع القيمة التي حددتها سابقًا كمتغير بيئة.


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


آمل أن المعلومات كانت مفيدة. أعلم أن هناك الكثير من الأشياء ، لكنني أردت منك أن تفهم ما كان يحدث.




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


فيما يلي الروابط التي ساعدتني ويمكن أن تساعدك:
  1. https://stackoverflow.com/a/54268132/9044659 (الإعداد الأساسي)
  2. https://developer.github.com/webhooks/ (وثائق GitHub webhook)
  3. https://github.com/CCExtractor/sample-platform/blob/master/mod_deploy/controllers.py (تطبيق مفصل للغاية مع مجموعة من الاختبارات إذا كنت تريد قضاء بعض الوقت في هذا)
  4. https://github.com/SwagLyrics/swaglyrics-issue-maker/blob/35d23d0ba416e742e381da931d592ce6f58fc13f/issue_maker.py#L268 (تطبيق التحكم الخاص بي لـ PythonAnywhere)
  5. https://github.com/SwagLyrics/SwagLyrics-For-Spotify (مستودع حيث استخدم هذا في الممارسة)

شكرا للقراءة!

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


All Articles