الدليل: تشغيل مسارات عمل Git على نفس المشغل

الدليل: تشغيل مسارات عمل Git على نفس المشغل
الدليل: تشغيل مسارات عمل Git على نفس المشغل

تنسيق سير عمل GitHub على المتسابقين المشتركين

قد تكون إدارة عمليات سير عمل متعددة في GitHub Actions أمرًا صعبًا، خاصة عندما تحتاج إلى تشغيلها على نفس المشغل المستضاف ذاتيًا. في السيناريوهات التي يكون لديك فيها ملفات YAML منفصلة لسير عمل مختلفة، مثل codeql.yml وsnyk-zap.yml، قد يكون التأكد من تشغيلها على نفس المشغل من مجموعة معينة أمرًا صعبًا.

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

يأمر وصف
jq معالج JSON خفيف الوزن ومرن لسطر الأوامر يستخدم لتحليل مخرجات JSON في البرنامج النصي Bash.
head -n 1 يقوم بإخراج السطر الأول من النتيجة، المستخدم هنا لتحديد أول معرف عداء متاح.
curl أداة سطر أوامر لنقل البيانات باستخدام عناوين URL، تُستخدم للتفاعل مع واجهة برمجة تطبيقات GitHub في البرنامج النصي Bash.
os.getenv() يسترد متغيرات البيئة في Python، المستخدمة للحصول على رمز GitHub واسم المستودع.
requests.get() يرسل طلب GET إلى عنوان URL محدد، يُستخدم لجلب برامج التشغيل المتوفرة من واجهة برمجة تطبيقات GitHub في برنامج Python النصي.
os.path.exists() يتحقق من وجود مسار محدد، ويستخدم لتحديد ما إذا كان ملف معرف العداء موجودًا بالفعل في برنامج Python النصي.
with open() مدير السياق لعمليات الملفات في بايثون، يستخدم لقراءة وكتابة معرف العداء إلى ملف.

تنسيق سير العمل مع العدائين المشتركين

تدير البرامج النصية المقدمة مهمة التشغيل لسير عمل GitHub. يبدأ البرنامج النصي Bash بالتحقق مما إذا كان معرف العداء مخزنًا بالفعل في ملف مؤقت. إذا لم يكن كذلك، فإنه يستخدم curl للاستعلام عن واجهة برمجة تطبيقات GitHub للعدائين المتاحين و jq لتحليل استجابة JSON، واختيار أول عداء خامل وحفظ معرفه. يحقق برنامج Python النصي وظائف مماثلة من خلال استخدام requests.get() طريقة لجلب معلومات العداء من واجهة برمجة تطبيقات GitHub. يقوم البرنامج النصي بعد ذلك بالتحقق مما إذا كان معرف العداء قد تم تخزينه بالفعل باستخدام os.path.exists() ويحفظه إذا لم يكن كذلك.

يضمن كلا البرنامجين أنه بمجرد تعيين عداء، سيتم إعادة استخدامه للمهام اللاحقة من خلال الرجوع إلى معرف العداء المخزن. في نص بايثون، os.getenv() يسترد متغيرات البيئة الخاصة برمز GitHub والمستودع، و with open() يستخدم للتعامل مع عمليات الملف بأمان. تساعد هذه البرامج النصية في تنسيق مسارات عمل متعددة، مما يضمن تشغيلها على نفس المشغل دون ترميز اسم المشغل، مما يجعلها مرنة وفعالة في إدارة تنفيذ سير العمل.

تنفيذ استراتيجية العداء المشترك لإجراءات GitHub

استخدام البرمجة النصية Bash وإجراءات GitHub لضمان تشغيل سير العمل على نفس المشغل

# A script to manage runner assignment
#!/bin/bash

# Check if a runner is already assigned
RUNNER_ID=$(cat /tmp/runner_id)

if [ -z "$RUNNER_ID" ]; then
  # No runner assigned yet, pick one and save its ID
  RUNNER_ID=$(curl -s -H "Authorization: token $GITHUB_TOKEN" \
               https://api.github.com/repos/$GITHUB_REPOSITORY/actions/runners |
               jq -r '.runners[] | select(.status=="online" and .busy==false) | .id' | head -n 1)
  echo $RUNNER_ID > /tmp/runner_id
fi

echo "Using runner $RUNNER_ID"

# Proceed with the workflow using the assigned runner

ضمان الاستخدام المتسق للعداء في ملفات YAML المنفصلة

استخدام إجراءات Python وGitHub لتنفيذ سير العمل المنسق

import requests
import os

# GitHub API token and repository
GITHUB_TOKEN = os.getenv('GITHUB_TOKEN')
REPO = os.getenv('GITHUB_REPOSITORY')

# Function to get an available runner
def get_runner():
    url = f"https://api.github.com/repos/{REPO}/actions/runners"
    headers = {'Authorization': f'token {GITHUB_TOKEN}'}
    response = requests.get(url, headers=headers)
    runners = response.json()['runners']
    for runner in runners:
        if runner['status'] == 'online' and not runner['busy']:
            return runner['id']
    return None

# Check if a runner is already assigned
if not os.path.exists('/tmp/runner_id'):
    runner_id = get_runner()
    with open('/tmp/runner_id', 'w') as f:
        f.write(str(runner_id))
else:
    with open('/tmp/runner_id', 'r') as f:
        runner_id = f.read()

print(f"Using runner {runner_id}")

إدارة العداء الفعالة في إجراءات GitHub

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

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

أسئلة شائعة حول تنسيق سير العمل على المتسابقين المشتركين

  1. كيف أتأكد من استخدام عداء معين دائمًا؟
  2. استخدم ال runs-on أدخل ملف YAML الخاص بك لتحديد مجموعة العداء أو اسم العداء الدقيق.
  3. هل يمكنني تعيين العدائين ديناميكيًا لسير العمل؟
  4. نعم، من خلال استخدام البرامج النصية للاستعلام عن العدائين المتاحين وتعيينهم ديناميكيًا.
  5. كيف أتعامل مع صراعات العداء في بيئة مزدحمة؟
  6. قم بتنفيذ آلية الانتظار أو تحديد أولويات سير العمل لإدارة تخصيص العداء بشكل فعال.
  7. ماذا يحدث في حالة عدم توفر العدائين؟
  8. سيتم وضع سير العمل في قائمة الانتظار حتى يصبح العداء متاحًا. تحسين استخدام العداء لتقليل أوقات الانتظار.
  9. هل يمكنني استخدام هذه البرامج النصية مع منصات CI/CD الأخرى؟
  10. نعم، يمكن تكييف المنطق ليناسب الأنظمة الأساسية الأخرى التي تتمتع بإمكانية وصول واجهة برمجة التطبيقات (API) إلى إدارة التشغيل.
  11. كيف يمكنني الحفاظ على الحالة بين سير العمل؟
  12. تأكد من استخدام نفس العداء للوظائف ذات الصلة والاستفادة من آليات التخزين المؤقت حيثما أمكن ذلك.
  13. ما هي الأذونات المطلوبة لهذه البرامج النصية؟
  14. تأكد من أن رمز GitHub الخاص بك يحتوي على النطاقات اللازمة، مثل repo و workflow.
  15. هل يمكنني تشغيل مهام سير عمل متعددة بشكل متزامن على نفس المشغل؟
  16. عادة، لا. يقوم كل عداء بتنفيذ مهمة واحدة في كل مرة. استخدم عدة متسابقين للتزامن.
  17. كيف يمكنني مراقبة استخدام وأداء العداء؟
  18. استخدم أدوات المراقبة المضمنة في GitHub أو الخدمات الخارجية لتتبع نشاط العداء وأدائه.

خاتمة:

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