GitHub Actions: أفضل الممارسات


هذا المستند قيد العمل يجمع أفضل الممارسات لاستخدام GitHub Actions. إذا كانت لديك أي اقتراحات أو إضافات، فافتح طلب سحب على GitHub!

مجموعة أفضل الممارسات

حدّد مُهلًا زمنية لمسارات العمل

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

تعتمد المهلة الزمنية المثالية على سير العمل نفسه، لكن 30 دقيقة عادةً أكثر من كافية لمسارات العمل المستخدمة في مستودعات Exercism.

ولهذا المزايا التالية:

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

مثال

jobs:
  configlet:
    timeout-minutes: 30
    runs-on: ubuntu-latest
    steps:
      - [...]

فكّر فيما إذا كانت الإجراءات (من أطراف ثالثة) مطلوبة فعلًا

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

لذلك، عليك أن تفكّر مليًا فيما إذا كان إدخال إجراء جديد يستحق العناء فعلًا، أو إن كان الأفضل نقل الكود إلى إجراء (جديد) تحت سيطرة Exercism.

وفكّر أيضًا فيما إذا كان الإجراء يُصان بنشاط، مثل التحقق من النشاط الحديث للمستودع أو التأكد من أن الإجراء تابع لمنظمة لا لحساب فردي.

الإجراءات المنشورة من GitHub أو من منظمة Exercism يمكن اعتبارها عمومًا آمنة (إلى حد ما) لإدراجها دون تفكير خاص.

حدّد نطاق رمز سير العمل

افتراضيًا، يتمتّع رمز الوصول المُمنوح لسير العمل بصلاحيات واسعة النطاق، سواء للقراءة أو للكتابة.

وينبغي تطبيق مبدأ أقل امتياز على مسارات العمل أيضًا.

يمكنك تحديد الصلاحيات التي يحتاجها سير العمل على أساس كل سير عمل على حدة.

مثال

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

permissions:
  contents: read

راجع وثائق GitHub للاطلاع على القائمة الكاملة للصلاحيات.

ثبّت الإجراءات عند قيم SHA

عند استخدام إجراءات أخرى، ثبّتها عند التزام محدد (عبر SHA الخاص به)، لا عند فرع أو وسم. فذلك يضمن تنفيذ الكود نفسه في كل مرة، وهذا غير مضمون عند التثبيت عند فرع أو وسم.

ولهذا فائدتان:

  1. يجعل البناء مستقرًا
  2. يمنع المهاجم من تغيير فرع أو وسم ليشير إلى كود ضار

الاستثناء الوحيد لهذه القاعدة يمكن أن يكون الإجراءات التي بنيناها نحن (Exercism) بأنفسنا.

العثور على SHA الالتزام

عادةً، تريد التثبيت عند SHA الالتزام الخاص بإصدار معيّن. للعثور على SHA الالتزام لأحد الإصدارات، انتقل إلى صفحة الإصدارات في مستودع الإجراء (مثل https://github.com/actions/checkout/releases). ابحث عن الإصدار الذي تريد استخدامه وانقر على SHA المختصر (مثل a12a394) المذكور في قسم الملخص على يسار الإصدار. وسيتم بعد ذلك توجيهك إلى صفحة تفاصيل الإصدار، التي تسرد SHA الالتزام الكامل الذي يمكنك استخدامه.

مثال

- name: Checkout code
  uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846

ثبّت إصدار مشغّلات الاختبار

ستعمل معظم مسارات العمل على المشغّلات المدعومة من GitHub. عند استخدام أحد هذه المشغّلات، استخدم إصدارًا محددًا بدلًا من أحدث إصدار.

فذلك يضمن أن سير العمل سيعمل دائمًا على المشغّل نفسه، وهو ما يجعل البناء مستقرًا.

مثال

استخدم:

runs-on: ubuntu-22.04

بدلًا من:

runs-on: ubuntu-latest

فكّر في إعداد استراتيجية تزامن

غالبًا لا يكون تشغيل التكامل المستمر على الالتزامات الوسيطة ضروريًا ولا مفيدًا إذا كان قد دُفع التزام أحدث في الأثناء.

يمكنك إعداد استراتيجية تزامن لإلغاء مسارات العمل الجارية تلقائيًا في السياق نفسه.

مثال

لإلغاء عمليات البناء الوسيطة في أحد طلبات السحب، يمكنك استخدام إعدادات التزامن التالية:

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: ${{ startsWith(github.ref, 'refs/pull/') }}
إشعار طرف ثالث

المثال أعلاه مبني على سير عمل التكامل المستمر في PkgTemplates.jl، المنشور بموجب رخصة MIT:

MIT License

Copyright (c) 2017-2020 Chris de Graaf, Invenia Technical Computing Corporation

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

فكّر في المُحفِّزات المطلوبة فعلًا

اقرأ دليل "تقوية الأمان في GitHub Actions"

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

قائمة التحقق الخاصة بسير العمل

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

نسخة قابلة للنسخ واللصق، مثلًا لطلبات السحب

  1. إلا إذا كانت اللغة تستخدم منظومة npm. ↩