শেয়ার্ড রানার্সে গিটহাব ওয়ার্কফ্লো সমন্বয় করা
GitHub অ্যাকশনে একাধিক ওয়ার্কফ্লো পরিচালনা করা চ্যালেঞ্জিং হতে পারে, বিশেষ করে যখন আপনার একই স্ব-হোস্টেড রানারে চালানোর জন্য তাদের প্রয়োজন হয়। এমন পরিস্থিতিতে যেখানে আপনার কাছে বিভিন্ন ওয়ার্কফ্লোগুলির জন্য আলাদা YAML ফাইল রয়েছে, যেমন codeql.yml এবং snyk-zap.yml, একটি নির্দিষ্ট গ্রুপ থেকে একই রানারে চালানো নিশ্চিত করা কঠিন হতে পারে।
লক্ষ্য হল রানারকে স্পষ্টভাবে নাম না দিয়ে উভয় ওয়ার্কফ্লোতে একই রানার ব্যবহার করা, যার ফলে অন্যান্য ওয়ার্কফ্লোগুলির সাথে দ্বন্দ্ব এড়ানো। এই নির্দেশিকাটি পৃথক YAML ফাইলগুলিতে কর্মপ্রবাহ বজায় রেখে দক্ষতার সাথে এই সিঙ্ক্রোনাইজেশনটি অর্জনের সম্ভাব্য সমাধানগুলি অন্বেষণ করবে।
আদেশ | বর্ণনা |
---|---|
jq | একটি লাইটওয়েট এবং নমনীয় কমান্ড-লাইন JSON প্রসেসর ব্যাশ স্ক্রিপ্টে JSON আউটপুট পার্স করতে ব্যবহৃত হয়। |
head -n 1 | ফলাফলের প্রথম লাইন আউটপুট করে, প্রথম উপলব্ধ রানার আইডি নির্বাচন করতে এখানে ব্যবহৃত হয়। |
curl | ইউআরএল-এর সাথে ডেটা স্থানান্তর করার জন্য কমান্ড-লাইন টুল, ব্যাশ স্ক্রিপ্টে GitHub-এর API-এর সাথে ইন্টারঅ্যাক্ট করতে ব্যবহৃত হয়। |
os.getenv() | পাইথনে পরিবেশের ভেরিয়েবল পুনরুদ্ধার করে, গিটহাব টোকেন এবং সংগ্রহস্থলের নাম পেতে ব্যবহৃত হয়। |
requests.get() | একটি নির্দিষ্ট URL-এ একটি GET অনুরোধ পাঠায়, Python স্ক্রিপ্টে GitHub-এর API থেকে উপলব্ধ রানার আনতে ব্যবহৃত হয়। |
os.path.exists() | একটি নির্দিষ্ট পথ বিদ্যমান কিনা তা পরীক্ষা করে, রানার আইডি ফাইলটি পাইথন স্ক্রিপ্টে ইতিমধ্যে উপস্থিত আছে কিনা তা নির্ধারণ করতে ব্যবহৃত হয়। |
with open() | পাইথনে ফাইল অপারেশনের জন্য প্রসঙ্গ ম্যানেজার, একটি ফাইলে রানার আইডি পড়তে এবং লিখতে ব্যবহৃত হয়। |
শেয়ার্ড রানারদের সাথে ওয়ার্কফ্লো সমন্বয় করা
প্রদত্ত স্ক্রিপ্টগুলি গিটহাব ওয়ার্কফ্লোগুলির জন্য রানার অ্যাসাইনমেন্ট পরিচালনা করে। ব্যাশ স্ক্রিপ্ট একটি রানার আইডি ইতিমধ্যে একটি অস্থায়ী ফাইলে সংরক্ষিত আছে কিনা তা পরীক্ষা করে শুরু হয়। যদি না হয়, এটি ব্যবহার করে curl উপলব্ধ রানারদের জন্য GitHub এর API জিজ্ঞাসা করতে এবং jq JSON প্রতিক্রিয়া পার্স করতে, প্রথম নিষ্ক্রিয় রানার নির্বাচন করে এবং এর আইডি সংরক্ষণ করে। পাইথন স্ক্রিপ্ট ব্যবহার করে অনুরূপ কার্যকারিতা অর্জন করে requests.get() GitHub এর API থেকে রানার তথ্য আনার পদ্ধতি। স্ক্রিপ্ট তারপর একটি রানার আইডি ইতিমধ্যেই ব্যবহার করে সংরক্ষণ করা হয়েছে কিনা তা পরীক্ষা করে os.path.exists() এবং না থাকলে সংরক্ষণ করে।
উভয় স্ক্রিপ্ট নিশ্চিত করে যে একবার একজন রানার নিয়োগ করা হলে, এটি সঞ্চিত রানার আইডি উল্লেখ করে পরবর্তী কাজের জন্য পুনরায় ব্যবহার করা হবে। পাইথন স্ক্রিপ্টে, os.getenv() GitHub টোকেন এবং সংগ্রহস্থলের জন্য পরিবেশ ভেরিয়েবল পুনরুদ্ধার করে, এবং with open() নিরাপদে ফাইল অপারেশন পরিচালনা করতে ব্যবহৃত হয়। এই স্ক্রিপ্টগুলি একাধিক ওয়ার্কফ্লো সমন্বয় করতে সাহায্য করে, নিশ্চিত করে যে তারা রানার নামের হার্ডকোডিং ছাড়াই একই রানারে চলে, এগুলিকে নমনীয় এবং কার্যপ্রবাহ সম্পাদন পরিচালনায় দক্ষ করে তোলে।
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}")
গিটহাব অ্যাকশনে দক্ষ রানার ব্যবস্থাপনা
এমন পরিস্থিতিতে যেখানে ওয়ার্কফ্লোগুলি একই স্ব-হোস্টেড রানারে চালানোর প্রয়োজন, একটি মূল বিবেচ্য বিষয় হল রানার প্রাপ্যতা নিশ্চিত করা এবং দ্বন্দ্ব কমানো। একটি ভাগ করা রানার কৌশল ব্যবহার করে, যেমনটি পূর্ববর্তী স্ক্রিপ্টগুলিতে দেখা গেছে, নিশ্চিত করে যে একবার একজন রানারকে একটি কাজের জন্য নিয়োগ করা হলে, পরবর্তী কাজগুলি একই রানার ব্যবহার করে। এটি জটিল CI/CD পাইপলাইনগুলিতে বিশেষভাবে উপকারী হতে পারে যেখানে অবস্থা বজায় রাখা বা ক্যাশে করা সংস্থানগুলি ব্যবহার করা অত্যন্ত গুরুত্বপূর্ণ।
বিবেচনা করার আরেকটি দিক হল রানার ব্যবহার অপ্টিমাইজ করা। প্রাপ্যতার উপর ভিত্তি করে গতিশীলভাবে রানার্স নির্বাচন এবং বরাদ্দ করে, সংস্থাগুলি তাদের সংস্থানগুলি আরও ভালভাবে পরিচালনা করতে পারে। এই ধরনের কৌশলগুলি বাস্তবায়ন করা শুধুমাত্র দক্ষতার উন্নতি করে না বরং একজন উপলব্ধ রানারের জন্য অপেক্ষা করে সারিতে থাকা কর্মপ্রবাহের সময়কেও কমিয়ে দেয়। এই পদ্ধতিটি অন্যান্য CI/CD সরঞ্জাম এবং প্ল্যাটফর্মগুলিতে প্রসারিত করা যেতে পারে, এটি বিভিন্ন অটোমেশন প্রয়োজনের জন্য একটি বহুমুখী সমাধান করে তোলে।
শেয়ার্ড রানার্সে ওয়ার্কফ্লো সমন্বয় করার বিষয়ে সাধারণ প্রশ্ন
- আমি কীভাবে নিশ্চিত করব যে একটি নির্দিষ্ট রানার সর্বদা ব্যবহৃত হয়?
- ব্যবহার runs-on রানার গ্রুপ বা সঠিক রানার নাম নির্দিষ্ট করতে আপনার YAML ফাইলে কী।
- আমি কি গতিশীলভাবে ওয়ার্কফ্লোতে রানারদের বরাদ্দ করতে পারি?
- হ্যাঁ, স্ক্রিপ্ট ব্যবহার করে উপলব্ধ রানারদের জিজ্ঞাসা করে এবং গতিশীলভাবে তাদের বরাদ্দ করে।
- আমি কিভাবে একটি ব্যস্ত পরিবেশে রানার দ্বন্দ্ব পরিচালনা করব?
- রানার বরাদ্দ কার্যকরভাবে পরিচালনা করতে একটি সারিবদ্ধ প্রক্রিয়া বা কর্মপ্রবাহকে অগ্রাধিকার দিন।
- কোন রানার পাওয়া না গেলে কি হবে?
- একজন রানার উপলব্ধ না হওয়া পর্যন্ত ওয়ার্কফ্লো সারিবদ্ধ হবে। অপেক্ষার সময় কমাতে রানার ব্যবহার অপ্টিমাইজ করুন।
- আমি কি অন্যান্য সিআই/সিডি প্ল্যাটফর্মের সাথে এই স্ক্রিপ্টগুলি ব্যবহার করতে পারি?
- হ্যাঁ, রানার ম্যানেজমেন্টে API অ্যাক্সেস সহ অন্যান্য প্ল্যাটফর্মের জন্য যুক্তিটি মানিয়ে নেওয়া যেতে পারে।
- আমি কিভাবে কর্মপ্রবাহের মধ্যে অবস্থা বজায় রাখব?
- নিশ্চিত করুন যে একই রানার সম্পর্কিত কাজগুলির জন্য ব্যবহার করা হয়েছে এবং যেখানে সম্ভব ক্যাশিং পদ্ধতির লিভারেজ।
- এই স্ক্রিপ্টগুলির জন্য কি অনুমতি প্রয়োজন?
- নিশ্চিত করুন যে আপনার GitHub টোকেনের প্রয়োজনীয় সুযোগ রয়েছে, যেমন repo এবং workflow.
- আমি কি একই রানারে একসাথে একাধিক ওয়ার্কফ্লো চালাতে পারি?
- সাধারণত, না. প্রতিটি রানার একবারে একটি কাজ সম্পাদন করে। একযোগে একাধিক রানার ব্যবহার করুন।
- আমি কিভাবে রানার ব্যবহার এবং কর্মক্ষমতা নিরীক্ষণ করব?
- রানার কার্যকলাপ এবং কর্মক্ষমতা ট্র্যাক করতে GitHub এর অন্তর্নির্মিত মনিটরিং সরঞ্জাম বা বাহ্যিক পরিষেবাগুলি ব্যবহার করুন৷
উপসংহার:
একই স্ব-হোস্টেড রানারে চালানোর জন্য GitHub ওয়ার্কফ্লো পরিচালনা করা দক্ষতা এবং ধারাবাহিকতার জন্য অত্যন্ত গুরুত্বপূর্ণ। আলোচিত ব্যাশ এবং পাইথন স্ক্রিপ্টগুলি গতিশীলভাবে রানার বরাদ্দ করে এবং পরবর্তী কাজগুলি একই রানার ব্যবহার করে তা নিশ্চিত করে একটি শক্তিশালী সমাধান প্রদান করে। এই পদ্ধতিটি দ্বন্দ্বকে হ্রাস করে এবং সম্পদের ব্যবহারকে অপ্টিমাইজ করে, এটি জটিল CI/CD পাইপলাইনের জন্য একটি কার্যকর কৌশল তৈরি করে। এই পদ্ধতিগুলি বাস্তবায়নের মাধ্যমে, সংস্থাগুলি তাদের কর্মপ্রবাহ সম্পাদনকে স্ট্রিমলাইন করতে পারে এবং অপেক্ষার সময় কমাতে পারে, শেষ পর্যন্ত উত্পাদনশীলতা উন্নত করতে এবং একটি মসৃণ বিকাশ প্রক্রিয়া বজায় রাখতে পারে।