يتيح لك هذا الإجراء تحميل حزم توزيع Python الخاصة بك في الدليل dist/
إلى PyPI. يقترح هذا النص نظرة عامة على الاستخدام البسيط. لمزيد من التفاصيل التفصيلية، راجع دليل PyPA.
إذا كانت لديك أي تعليقات بخصوص إصدارات إجراء محددة، فيرجى ترك التعليقات في مناقشات الإعلان المقابلة لكل إصدار.
master
غروب الشمس تم إلغاء إصدار الفرع master
. يرجى تغيير إصدار GitHub Action الذي تستخدمه من الإصدار master
إلى release/v1
أو استخدام علامة محددة، أو الاشتراك في استخدام Git Commit SHA وDependabot الكامل.
ملحوظة
لا يمكن استخدام النشر الموثوق به من داخل سير عمل قابل لإعادة الاستخدام في الوقت الحالي. من المستحسن بدلاً من ذلك إنشاء سير عمل غير قابل لإعادة الاستخدام يحتوي على وظيفة تستدعي سير العمل القابل لإعادة الاستخدام، ثم القيام بخطوة النشر الموثوق به من مهمة منفصلة ضمن سير العمل غير القابل لإعادة الاستخدام. وبدلاً من ذلك، لا يزال بإمكانك استخدام اسم مستخدم/رمز مميز داخل سير العمل القابل لإعادة الاستخدام.
ملحوظة
يُشار أحيانًا إلى النشر الموثوق من خلال التكنولوجيا الأساسية الخاصة به - OpenID Connect، أو OIDC للاختصار. إذا رأيت إشارات إلى "نشر OIDC" في سياق PyPI، فهذا هو ما يشيرون إليه.
ينتقل هذا المثال مباشرة إلى أفضل الممارسات الحالية. إذا كنت تريد استخدام الرموز المميزة لواجهة برمجة التطبيقات مباشرةً أو استخدام اسم مستخدم وكلمة مرور أقل أمانًا، فراجع كيفية تحديد اسم المستخدم وكلمة المرور.
يدعم هذا الإجراء تنفيذ النشر الموثوق به لـ PyPI، والذي يسمح بالمصادقة على PyPI بدون رمز واجهة برمجة التطبيقات (API) الذي تم تكوينه يدويًا أو مجموعة اسم المستخدم/كلمة المرور. لتنفيذ النشر الموثوق بهذا الإجراء، يجب أن يكون ناشر مشروعك قد تم تكوينه بالفعل على PyPI.
للدخول إلى تدفق النشر الموثوق، قم بتكوين مهمة هذا الإجراء باستخدام id-token: write
وبدون اسم مستخدم أو كلمة مرور صريحة:
# .github/workflows/ci-cd.ymljobs: pypi-publish:name: تحميل الإصدار إلى PyPIruns-on: ubuntu-latestenvironment: الاسم: pypi url: https://pypi.org/p/<your-pypi-project -الاسم>الأذونات: رمز المعرف: الكتابة # هام: هذا الإذن إلزامي لخطوات النشر الموثوقة: # استرداد التوزيعات الخاصة بك هنا- الاسم: نشر توزيعات الحزمة لاستخدامات PyPI: pypa/gh-action-pypi-publish@release/v1
ملحوظة
نصيحة احترافية: بدلاً من استخدام المؤشرات الفرعية، مثل unstable/v1
، قم بتثبيت إصدارات الإجراءات التي تستخدمها في الإصدارات ذات العلامات أو معرفات الالتزام sha1. سيؤدي ذلك إلى جعل سير العمل الخاص بك أكثر أمانًا وقابلية للتكرار بشكل أفضل، مما يوفر عليك من المفاجآت المفاجئة وغير السارة.
يمكن أيضًا استخدام مؤشرات أخرى تدعم النشر الموثوق، مثل TestPyPI:
- الاسم: نشر توزيعات الحزمة على TestPyPI الاستخدامات: pypa/gh-action-pypi-publish@release/v1 مع:repository-url: https://test.pypi.org/legacy/
(لا تنس تحديث اسم البيئة إلى testpypi
أو ما شابه!)
ملحوظة
نصيحة احترافية: قم بتعيين id-token: write
في الوظيفة التي تقوم بالنشر، وليس عالميًا. حاول أيضًا فصل البناء عن النشر - وهذا يضمن أن أي نصوص برمجية يتم إدخالها بشكل ضار في بيئة الإنشاء أو الاختبار لن تتمكن من رفع الامتيازات أثناء الطيران تحت الرادار.
إحدى حالات الاستخدام الشائعة هي تحميل الحزم فقط عند الالتزام الموسوم، وللقيام بذلك أضف مرشحًا إلى المهمة:
إذا: github.event_name == 'push' && beginWith(github.ref, 'refs/tags')
مهم
يعد دعم إنشاء الشهادات الرقمية وتحميلها تجريبيًا حاليًا ويقتصر فقط على تدفقات النشر الموثوق باستخدام PyPI أو TestPyPI. دعم هذه الميزة غير مستقر بعد؛ قد تتغير الإعدادات والسلوك الموضح أدناه دون إشعار مسبق.
ملحوظة
يتطلب إنشاء الشهادات الرقمية وتحميلها حاليًا المصادقة مع ناشر موثوق به.
أصبح إنشاء الشهادات الرقمية الموقعة لجميع ملفات التوزيع وتحميلها جميعًا معًا قيد التشغيل افتراضيًا لجميع المشاريع التي تستخدم النشر الموثوق. لتعطيله، قم بتعيين attestations
على النحو التالي:
مع: الشهادات: كاذبة
يتم إنشاء كائنات التصديق باستخدام Sigstore لكل حزمة توزيع، وتوقيعها بالهوية المقدمة بواسطة رمز OIDC الخاص بـ GitHub المرتبط بسير العمل الحالي. وهذا يعني أن كلاً من مصادقة النشر الموثوقة والشهادات مرتبطة بنفس الهوية.
لا علاقة لهذا الإجراء على GitHub ببناء توزيعات الحزم . يتحمل المستخدمون مسؤولية إعداد الأقراص للتحميل عن طريق وضعها في dist/
القرص قبل تشغيل هذا الإجراء.
مهم
نظرًا لأن إجراء GitHub هذا يعتمد على عامل الإرساء، فلا يمكن استخدامه إلا من داخل الوظائف المستندة إلى GNU/Linux في سير عمل GitHub Actions CI/CD. وهذا حسب التصميم ومن غير المرجح أن يتغير بسبب عدد من الاعتبارات التي نعتمد عليها.
لكن هذا لا ينبغي أن يمنع المرء من نشر حزم التوزيع الخاصة بالمنصة. يُنصح بشدة بفصل المهام الخاصة ببناء العجلات الخاصة بنظام التشغيل عن مهمة النشر. يسمح هذا بـ (1) اختبار نفس العناصر التي هي على وشك التحميل إلى PyPI، (2) منع المهام المتوازية غير المتزامنة من نشر جزء فقط من التوزيعات بشكل غير متزامن (في حالة فشل جزء من المهام ونجاح البعض الآخر في النهاية مع إصدار غير مكتمل على PyPI) و(3) إجراء تحميل ذري إلى PyPI (عندما يظهر جزء من التوزيعات على PyPI، سيستخدم المثبتون مثل النقطة هذا الإصدار لتحليل التبعية ولكن هذا قد يتسبب في قيام بعض البيئات باستخدام أدوات sdists بينما لا تكون العجلة الخاصة بوقت التشغيل متاحة بعد).
لتنفيذ هذا النوع من التنسيق، يرجى استخدام actions/upload-artifact
actions/download-artifact
الإجراء لمشاركة التوزيعات المبنية عبر المراحل والوظائف. ثم استخدم إعداد needs
لترتيب مراحل الإنشاء والاختبار والنشر.
للحصول على أفضل النتائج، اكتشف نوع سير العمل الذي يناسب الاحتياجات المحددة لمشروعك.
على سبيل المثال، يمكنك تنفيذ مهمة متوازية تدفع كل التزام إلى TestPyPI أو خادم الفهرس الخاص بك، مثل devpi
. لهذا، ستحتاج إلى (1) تحديد قيمة repository-url
المخصص و(2) إنشاء رقم إصدار فريد لكل عملية تحميل حتى لا يؤدي ذلك إلى حدوث تعارض. يكون هذا الأخير ممكنًا إذا كنت تستخدم حزمة setuptools_scm
ولكن يمكنك أيضًا ابتكار الحل الخاص بك استنادًا إلى المسافة إلى الالتزام الأخير الموسوم.
ستحتاج إلى إنشاء رمز مميز آخر لمضيف منفصل ثم حفظه باعتباره سر GitHub repo ضمن بيئة مستخدمة في وظيفتك. على الرغم من ذلك، فإن تمرير كلمة المرور سيؤدي إلى تعطيل النشر الموثوق به بدون أسرار، لذا من الأفضل تهيئته بدلاً من ذلك، عند النشر إلى TestPyPI وليس شيئًا مخصصًا.
سيبدو استدعاء الإجراء في هذه الحالة كما يلي:
- الاسم: نشر الحزمة على TestPyPI الاستخدامات: pypa/gh-action-pypi-publish@release/v1 مع: كلمة المرور: ${{ Secrets.TEST_PYPI_API_TOKEN }}repository-url: https://test.pypi.org/legacy/
يمكنك تغيير الدليل الهدف الافتراضي لـ dist/
إلى أي دليل تفضله. سيبدو استدعاء الإجراء الآن كما يلي:
- الاسم: نشر الحزمة إلى PyPI الاستخدامات: pypa/gh-action-pypi-publish@release/v1 مع: الحزم-دير: مخصص-دير/
من المستحسن أن تقوم بإجراء twine check
مباشرة بعد إنتاج ملفاتك، ولكن هذا يؤدي أيضًا إلى تشغيل twine check
قبل التحميل. يمكنك أيضًا تعطيل فحص الخيوط باستخدام:
مع: التحقق من البيانات الوصفية: خطأ
في بعض الأحيان، عندما تقوم بنشر إصدارات من أماكن متعددة، قد يصل سير العمل الخاص بك إلى ظروف السباق. على سبيل المثال، عند النشر من CIs متعددة أو حتى وجود مهام سير عمل بنفس الخطوات التي يتم تشغيلها داخل GitHub Actions CI/CD لأحداث مختلفة تتعلق بنفس الفعل عالي المستوى.
لتسهيل حالة الاستخدام هذه، يمكنك استخدام إعداد skip-existing
(معطل افتراضيًا) كما يلي:
مع: تخطي الموجود: صحيح
ملحوظة
نصيحة احترافية: حاول تجنب تمكين هذا الإعداد حيثما أمكن ذلك. إذا كانت لديك خطوات للنشر إلى كل من PyPI وTestPyPI، ففكر في استخدامه للأخير فقط، حيث يفشل الأول بشكل كبير في التكرارات.
في بعض الأحيان، يمكن أن يفشل twine upload
ولتصحيح الأخطاء استخدم الإعداد verbose
كما يلي:
مع: مطول: صحيح
قد ترغب في التحقق مما إذا كان قد تم تحميل الملفات الموجودة على PyPI تلقائيًا بواسطة البرنامج النصي CI. سيُظهر قيم SHA256 وMD5 وBLAKE2-256 للملفات التي سيتم تحميلها.
مع: طباعة التجزئة: صحيح
قيمة اسم المستخدم الافتراضية هي __token__
. إذا قمت بالنشر إلى سجل مخصص لا يوفر الرموز المميزة لواجهة برمجة التطبيقات، مثل devpi
، فقد تحتاج إلى تحديد زوج مخصص من اسم المستخدم وكلمة المرور. هذه هي الطريقة التي يتم بها ذلك.
مع: المستخدم: كلمة المرور التوجيهية: ${{ Secrets.DEVPI_PASSWORD }}
يجب إنشاء السر المستخدم في ${{ secrets.DEVPI_PASSWORD }}
في صفحة البيئة ضمن إعدادات مشروعك على GitHub. راجع إنشاء الأسرار واستخدامها.
في الماضي، عند النشر إلى PyPI، كانت الطريقة الأكثر أمانًا لتحديد نطاق الوصول للنشر التلقائي هي استخدام ميزة رموز API المميزة في PyPI. يمكن للمرء أن يجعله على نطاق المشروع ويحفظه باعتباره سرًا مرتبطًا بالبيئة في إعدادات مستودع GitHub، ويسميه ${{ secrets.PYPI_API_TOKEN }}
، على سبيل المثال. راجع إنشاء الأسرار واستخدامها. على الرغم من أن النشر الموثوق لا يزال آمنًا، إلا أنه يتم تشجيعه الآن عبر الرموز المميزة لواجهة برمجة التطبيقات (API) كأفضل ممارسة على الأنظمة الأساسية المدعومة (مثل GitHub).
تم إصدار ملف Dockerfile والبرامج النصية والوثائق المرتبطة به في هذا المشروع بموجب ترخيص BSD المكون من 3 فقرات.