$lang['tuto'] = "ट्यूटोरियल"; ?>$lang['tuto'] = "ट्यूटोरियल"; ?> गाइड: एक ही रनर पर गिट

गाइड: एक ही रनर पर गिट वर्कफ़्लो चलाना

गाइड: एक ही रनर पर गिट वर्कफ़्लो चलाना
गाइड: एक ही रनर पर गिट वर्कफ़्लो चलाना

साझा धावकों पर GitHub वर्कफ़्लो का समन्वय करना

GitHub Actions में कई वर्कफ़्लोज़ को प्रबंधित करना चुनौतीपूर्ण हो सकता है, खासकर जब आपको उन्हें एक ही स्व-होस्टेड रनर पर चलाने की आवश्यकता होती है। ऐसे परिदृश्यों में जहां आपके पास अलग-अलग वर्कफ़्लो के लिए अलग-अलग YAML फ़ाइलें हैं, जैसे कि Codeql.yml और snyk-zap.yml, यह सुनिश्चित करना मुश्किल हो सकता है कि वे एक विशिष्ट समूह से एक ही रनर पर चलें।

लक्ष्य स्पष्ट रूप से रनर का नाम लिए बिना दोनों वर्कफ़्लो के लिए एक ही रनर का उपयोग करना है, जिससे अन्य वर्कफ़्लो के साथ टकराव से बचा जा सके। यह मार्गदर्शिका अलग-अलग YAML फ़ाइलों में वर्कफ़्लो को बनाए रखते हुए इस सिंक्रनाइज़ेशन को कुशलतापूर्वक प्राप्त करने के लिए संभावित समाधानों का पता लगाएगी।

आज्ञा विवरण
jq एक हल्का और लचीला कमांड-लाइन JSON प्रोसेसर जिसका उपयोग बैश स्क्रिप्ट में JSON आउटपुट को पार्स करने के लिए किया जाता है।
head -n 1 परिणाम की पहली पंक्ति को आउटपुट करता है, जिसका उपयोग यहां पहली उपलब्ध रनर आईडी का चयन करने के लिए किया जाता है।
curl यूआरएल के साथ डेटा स्थानांतरित करने के लिए कमांड-लाइन टूल, बैश स्क्रिप्ट में गिटहब के एपीआई के साथ इंटरैक्ट करने के लिए उपयोग किया जाता है।
os.getenv() पायथन में पर्यावरण चर को पुनः प्राप्त करता है, जिसका उपयोग GitHub टोकन और रिपॉजिटरी नाम प्राप्त करने के लिए किया जाता है।
requests.get() एक निर्दिष्ट URL पर GET अनुरोध भेजता है, जिसका उपयोग Python स्क्रिप्ट में GitHub के API से उपलब्ध धावकों को लाने के लिए किया जाता है।
os.path.exists() जाँचता है कि क्या कोई निर्दिष्ट पथ मौजूद है, यह निर्धारित करने के लिए उपयोग किया जाता है कि रनर आईडी फ़ाइल पहले से ही पायथन स्क्रिप्ट में मौजूद है या नहीं।
with open() पायथन में फ़ाइल संचालन के लिए संदर्भ प्रबंधक, फ़ाइल में रनर आईडी को पढ़ने और लिखने के लिए उपयोग किया जाता है।

साझा धावकों के साथ वर्कफ़्लो का समन्वय करना

प्रदान की गई स्क्रिप्ट GitHub वर्कफ़्लो के लिए रनर असाइनमेंट का प्रबंधन करती हैं। बैश स्क्रिप्ट यह जांच कर शुरू होती है कि क्या रनर आईडी पहले से ही एक अस्थायी फ़ाइल में संग्रहीत है। यदि नहीं, तो यह उपयोग करता है curl उपलब्ध धावकों के लिए GitHub की API को क्वेरी करने के लिए jq JSON प्रतिक्रिया को पार्स करने के लिए, पहले निष्क्रिय धावक का चयन करें और उसकी आईडी सहेजें। पायथन स्क्रिप्ट का उपयोग करके समान कार्यक्षमता प्राप्त करती है requests.get() GitHub के एपीआई से धावक जानकारी प्राप्त करने की विधि। स्क्रिप्ट तब जांच करती है कि क्या रनर आईडी पहले से ही संग्रहीत है os.path.exists() और यदि नहीं तो इसे सहेजता है।

दोनों स्क्रिप्ट यह सुनिश्चित करती हैं कि एक बार रनर असाइन करने के बाद, इसे संग्रहीत रनर आईडी को संदर्भित करके बाद की नौकरियों के लिए पुन: उपयोग किया जाएगा। पायथन लिपि में, os.getenv() GitHub टोकन और रिपॉजिटरी के लिए पर्यावरण चर पुनर्प्राप्त करता है, और with open() फ़ाइल संचालन को सुरक्षित रूप से संभालने के लिए उपयोग किया जाता है। ये स्क्रिप्ट कई वर्कफ़्लो को समन्वयित करने में मदद करती हैं, यह सुनिश्चित करती हैं कि वे रनर नाम को हार्डकोड किए बिना एक ही रनर पर चलें, जिससे वे वर्कफ़्लो निष्पादन को प्रबंधित करने में लचीले और कुशल बन जाते हैं।

GitHub क्रियाओं के लिए एक साझा रनर रणनीति लागू करना

वर्कफ़्लो को एक ही रनर पर चलाना सुनिश्चित करने के लिए बैश स्क्रिप्टिंग और 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 फ़ाइलों में लगातार रनर उपयोग सुनिश्चित करना

समन्वित वर्कफ़्लो निष्पादन के लिए पायथन और गिटहब क्रियाओं का उपयोग करना

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 क्रियाओं में कुशल धावक प्रबंधन

ऐसे परिदृश्यों में जहां वर्कफ़्लो को उसी स्व-होस्ट किए गए रनर पर चलाने की आवश्यकता होती है, एक महत्वपूर्ण विचार रनर की उपलब्धता सुनिश्चित करना और संघर्षों को कम करना है। साझा धावक रणनीति का उपयोग करना, जैसा कि पिछली स्क्रिप्ट में देखा गया है, यह सुनिश्चित करता है कि एक बार एक धावक को एक नौकरी सौंपी जाती है, बाद की नौकरियां उसी धावक का उपयोग करती हैं। यह जटिल सीआई/सीडी पाइपलाइनों में विशेष रूप से फायदेमंद हो सकता है जहां स्थिति को बनाए रखना या कैश्ड संसाधनों का उपयोग करना महत्वपूर्ण है।

विचार करने योग्य एक अन्य पहलू धावक उपयोग को अनुकूलित करना है। उपलब्धता के आधार पर गतिशील रूप से धावकों का चयन और असाइनमेंट करके, संगठन अपने संसाधनों का बेहतर प्रबंधन कर सकते हैं। ऐसी रणनीतियों को लागू करने से न केवल दक्षता में सुधार होता है, बल्कि उपलब्ध धावक की प्रतीक्षा में कतार में लगने वाले समय में भी कमी आती है। इस दृष्टिकोण को अन्य सीआई/सीडी टूल और प्लेटफ़ॉर्म तक बढ़ाया जा सकता है, जिससे यह विभिन्न स्वचालन आवश्यकताओं के लिए एक बहुमुखी समाधान बन जाएगा।

साझा धावकों पर वर्कफ़्लो के समन्वय के बारे में सामान्य प्रश्न

  1. मैं यह कैसे सुनिश्चित करूँ कि एक विशिष्ट धावक का हमेशा उपयोग किया जाए?
  2. उपयोग runs-on धावक समूह या सटीक धावक नाम निर्दिष्ट करने के लिए अपनी YAML फ़ाइल में कुंजी।
  3. क्या मैं गतिशील रूप से रनर्स को वर्कफ़्लोज़ में असाइन कर सकता हूँ?
  4. हां, उपलब्ध धावकों से पूछताछ करने और उन्हें गतिशील रूप से असाइन करने के लिए स्क्रिप्ट का उपयोग करके।
  5. मैं व्यस्त माहौल में धावकों के झगड़ों को कैसे संभालूँ?
  6. धावक आवंटन को प्रभावी ढंग से प्रबंधित करने के लिए कतार तंत्र लागू करें या वर्कफ़्लो को प्राथमिकता दें।
  7. यदि कोई धावक उपलब्ध न हो तो क्या होगा?
  8. रनर उपलब्ध होने तक वर्कफ़्लो कतारबद्ध रहेगा। प्रतीक्षा समय को कम करने के लिए धावक के उपयोग को अनुकूलित करें।
  9. क्या मैं इन स्क्रिप्टों का उपयोग अन्य सीआई/सीडी प्लेटफार्मों के साथ कर सकता हूँ?
  10. हां, तर्क को रनर प्रबंधन तक एपीआई पहुंच वाले अन्य प्लेटफार्मों के लिए अनुकूलित किया जा सकता है।
  11. मैं वर्कफ़्लो के बीच स्थिति कैसे बनाए रखूँ?
  12. सुनिश्चित करें कि संबंधित कार्यों के लिए एक ही रनर का उपयोग किया जाए और जहां संभव हो कैशिंग तंत्र का लाभ उठाया जाए।
  13. इन स्क्रिप्ट के लिए क्या अनुमतियाँ आवश्यक हैं?
  14. सुनिश्चित करें कि आपके GitHub टोकन में आवश्यक दायरे हैं, जैसे repo और workflow.
  15. क्या मैं एक ही रनर पर एक साथ कई वर्कफ़्लो चला सकता हूँ?
  16. आमतौर पर, नहीं. प्रत्येक धावक एक समय में एक कार्य निष्पादित करता है। समवर्तीता के लिए एकाधिक धावकों का उपयोग करें।
  17. मैं धावक के उपयोग और प्रदर्शन की निगरानी कैसे करूँ?
  18. धावक गतिविधि और प्रदर्शन को ट्रैक करने के लिए GitHub के अंतर्निहित निगरानी उपकरण या बाहरी सेवाओं का उपयोग करें।

निष्कर्ष:

GitHub वर्कफ़्लो को उसी स्व-होस्ट किए गए रनर पर चलाने के लिए प्रबंधित करना दक्षता और स्थिरता के लिए महत्वपूर्ण है। चर्चा की गई बैश और पायथन स्क्रिप्ट गतिशील रूप से धावकों को निर्दिष्ट करके और बाद की नौकरियों में उसी धावक का उपयोग सुनिश्चित करके एक मजबूत समाधान प्रदान करती है। यह दृष्टिकोण संघर्षों को कम करता है और संसाधन उपयोग को अनुकूलित करता है, जिससे यह जटिल सीआई/सीडी पाइपलाइनों के लिए एक प्रभावी रणनीति बन जाती है। इन तरीकों को लागू करके, संगठन अपने वर्कफ़्लो निष्पादन को सुव्यवस्थित कर सकते हैं और प्रतीक्षा समय को कम कर सकते हैं, अंततः उत्पादकता में सुधार कर सकते हैं और एक सुचारू विकास प्रक्रिया बनाए रख सकते हैं।