Paylaşılan Çalıştırıcılarda GitHub İş Akışlarını Koordine Etme
GitHub Actions'da birden fazla iş akışını yönetmek, özellikle bunların şirket içinde barındırılan aynı çalıştırıcıda çalıştırılmasına ihtiyaç duyduğunuzda zorlayıcı olabilir. Codeql.yml ve snyk-zap.yml gibi farklı iş akışları için ayrı YAML dosyalarının olduğu senaryolarda, bunların belirli bir gruptan aynı çalıştırıcıda çalışmasını sağlamak zor olabilir.
Amaç, çalıştırıcıyı açıkça adlandırmadan her iki iş akışı için de aynı çalıştırıcıyı kullanmak, böylece diğer iş akışlarıyla çakışmaları önlemektir. Bu kılavuz, iş akışlarını ayrı YAML dosyalarında tutarken bu senkronizasyonu verimli bir şekilde gerçekleştirmek için olası çözümleri araştıracaktır.
Emretmek | Tanım |
---|---|
jq | Bash betiğinde JSON çıktısını ayrıştırmak için kullanılan hafif ve esnek bir komut satırı JSON işlemcisi. |
head -n 1 | Burada ilk kullanılabilir koşucu kimliğini seçmek için kullanılan sonucun ilk satırını çıkarır. |
curl | Bash betiğinde GitHub'un API'si ile etkileşimde bulunmak için kullanılan, URL'lerle veri aktarımına yönelik komut satırı aracı. |
os.getenv() | GitHub belirtecini ve depo adını almak için kullanılan Python'daki ortam değişkenlerini alır. |
requests.get() | Python betiğindeki GitHub API'sinden mevcut koşucuları getirmek için kullanılan, belirtilen bir URL'ye bir GET isteği gönderir. |
os.path.exists() | Koşucu kimlik dosyasının Python betiğinde zaten mevcut olup olmadığını belirlemek için kullanılan, belirtilen bir yolun mevcut olup olmadığını kontrol eder. |
with open() | Python'da dosya işlemlerine yönelik bağlam yöneticisi, koşucu kimliğini bir dosyaya okumak ve yazmak için kullanılır. |
Paylaşılan Koşucularla İş Akışlarını Koordine Etme
Sağlanan komut dosyaları GitHub iş akışları için çalıştırıcı atamasını yönetir. Bash betiği, koşucu kimliğinin zaten geçici bir dosyada depolanıp depolanmadığını kontrol ederek başlar. Değilse, kullanır curl mevcut koşucular için GitHub'un API'sini sorgulamak ve jq JSON yanıtını ayrıştırmak için ilk boşta çalışan koşucuyu seçip kimliğini kaydederek. Python betiği, aşağıdakileri kullanarak benzer işlevlere ulaşır: requests.get() GitHub'un API'sinden koşucu bilgilerini alma yöntemi. Komut dosyası daha sonra bir koşucu kimliğinin zaten kullanılarak saklanıp saklanmadığını kontrol eder. os.path.exists() ve değilse kaydeder.
Her iki komut dosyası da bir koşucu atandıktan sonra, saklanan koşucu kimliğine başvurularak sonraki işler için yeniden kullanılmasını sağlar. Python betiğinde, os.getenv() GitHub belirteci ve deposu için ortam değişkenlerini alır ve with open() Dosya işlemlerini güvenli bir şekilde gerçekleştirmek için kullanılır. Bu komut dosyaları, birden fazla iş akışının koordine edilmesine yardımcı olur, bunların çalıştırıcı adını sabit kodlamadan aynı çalıştırıcıda çalışmasını sağlar ve iş akışı yürütmenin yönetilmesinde onları esnek ve verimli hale getirir.
GitHub Eylemleri için Paylaşılan Çalıştırıcı Stratejisinin Uygulanması
İş akışlarının aynı çalıştırıcıda çalışmasını sağlamak için Bash komut dosyası oluşturma ve GitHub Eylemlerini kullanma
# 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
Ayrı YAML Dosyalarında Tutarlı Runner Kullanımının Sağlanması
Koordineli iş akışı yürütme için Python ve GitHub Eylemlerini kullanma
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 Eylemlerinde Verimli Çalıştırıcı Yönetimi
İş akışlarının aynı şirket içinde barındırılan çalıştırıcıda çalıştırılmasının gerekli olduğu senaryolarda, önemli bir husus, çalıştırıcının kullanılabilirliğini sağlamak ve çakışmaları en aza indirmektir. Önceki komut dosyalarında görüldüğü gibi, paylaşılan bir çalıştırıcı stratejisi kullanmak, bir çalıştırıcı bir işe atandığında sonraki işlerin aynı çalıştırıcıyı kullanmasını sağlar. Bu, durumu korumanın veya önbelleğe alınmış kaynakları kullanmanın çok önemli olduğu karmaşık CI/CD işlem hatlarında özellikle yararlı olabilir.
Dikkate alınması gereken bir diğer husus, koşucu kullanımını optimize etmektir. Koşucuları uygunluk durumuna göre dinamik olarak seçip atayarak kuruluşlar kaynaklarını daha iyi yönetebilir. Bu tür stratejilerin uygulanması yalnızca verimliliği artırmakla kalmaz, aynı zamanda iş akışlarının uygun bir çalıştırıcıyı beklerken kuyrukta harcadığı zamanı da azaltır. Bu yaklaşım diğer CI/CD araçlarına ve platformlarına genişletilebilir, bu da onu çeşitli otomasyon ihtiyaçları için çok yönlü bir çözüm haline getirir.
Paylaşılan Koşucularda İş Akışlarını Koordine Etmeye İlişkin Sık Sorulan Sorular
- Belirli bir koşucunun her zaman kullanıldığından nasıl emin olabilirim?
- Kullan runs-on Koşucu grubunu veya tam koşucu adını belirtmek için YAML dosyanızı girin.
- Çalıştırıcıları dinamik olarak iş akışlarına atayabilir miyim?
- Evet, mevcut koşucuları sorgulamak ve bunları dinamik olarak atamak için komut dosyalarını kullanarak.
- Yoğun bir ortamda koşucu çatışmalarını nasıl halledebilirim?
- Koşucu tahsisini etkili bir şekilde yönetmek için bir sıraya alma mekanizması uygulayın veya iş akışlarına öncelik verin.
- Koşucu yoksa ne olur?
- Bir çalıştırıcı uygun hale gelinceye kadar iş akışları sıraya girecektir. Bekleme sürelerini en aza indirmek için koşucu kullanımını optimize edin.
- Bu komut dosyalarını diğer CI/CD platformlarıyla kullanabilir miyim?
- Evet, mantık, koşucu yönetimine API erişimi olan diğer platformlara da uyarlanabilir.
- İş akışları arasındaki durumu nasıl koruyabilirim?
- İlgili işler için aynı çalıştırıcının kullanıldığından emin olun ve mümkün olduğunda önbelleğe alma mekanizmalarından yararlanın.
- Bu komut dosyaları için hangi izinler gerekiyor?
- GitHub belirtecinizin aşağıdaki gibi gerekli kapsamlara sahip olduğundan emin olun: repo Ve workflow.
- Aynı çalıştırıcıda aynı anda birden fazla iş akışını çalıştırabilir miyim?
- Tipik olarak hayır. Her koşucu aynı anda bir işi yürütür. Eşzamanlılık için birden fazla çalıştırıcı kullanın.
- Koşucu kullanımını ve performansını nasıl izlerim?
- Koşucu etkinliğini ve performansını izlemek için GitHub'un yerleşik izleme araçlarını veya harici hizmetlerini kullanın.
Çözüm:
GitHub iş akışlarını aynı şirket içinde barındırılan çalıştırıcıda çalışacak şekilde yönetmek, verimlilik ve tutarlılık açısından çok önemlidir. Tartışılan Bash ve Python betikleri, çalıştırıcıları dinamik olarak atayarak ve sonraki işlerin aynı çalıştırıcıyı kullanmasını sağlayarak sağlam bir çözüm sağlar. Bu yaklaşım, çatışmaları en aza indirir ve kaynak kullanımını optimize ederek onu karmaşık CI/CD işlem hatları için etkili bir strateji haline getirir. Kuruluşlar bu yöntemleri uygulayarak iş akışı uygulamalarını kolaylaştırabilir ve bekleme sürelerini azaltabilir, sonuçta üretkenliği artırabilir ve sorunsuz bir geliştirme sürecini sürdürebilir.