Mengkoordinasikan Alur Kerja GitHub pada Pelari Bersama
Mengelola beberapa alur kerja di GitHub Actions dapat menjadi tantangan, terutama ketika Anda membutuhkannya untuk dijalankan pada runner yang dihosting sendiri. Dalam skenario ketika Anda memiliki file YAML terpisah untuk alur kerja yang berbeda, seperti codeql.yml dan snyk-zap.yml, memastikan file tersebut berjalan di runner yang sama dari grup tertentu bisa jadi rumit.
Tujuannya adalah menggunakan runner yang sama untuk kedua alur kerja tanpa menyebutkan nama runner secara eksplisit, sehingga menghindari konflik dengan alur kerja lainnya. Panduan ini akan mengeksplorasi kemungkinan solusi untuk mencapai sinkronisasi ini secara efisien sambil mempertahankan alur kerja dalam file YAML terpisah.
Memerintah | Keterangan |
---|---|
jq | Prosesor JSON baris perintah yang ringan dan fleksibel yang digunakan untuk mengurai keluaran JSON dalam skrip Bash. |
head -n 1 | Menghasilkan baris pertama hasil, digunakan di sini untuk memilih ID pelari pertama yang tersedia. |
curl | Alat baris perintah untuk mentransfer data dengan URL, digunakan untuk berinteraksi dengan API GitHub di skrip Bash. |
os.getenv() | Mengambil variabel lingkungan dengan Python, digunakan untuk mendapatkan token GitHub dan nama repositori. |
requests.get() | Mengirimkan permintaan GET ke URL tertentu, digunakan untuk mengambil runner yang tersedia dari API GitHub dalam skrip Python. |
os.path.exists() | Memeriksa apakah jalur tertentu ada, digunakan untuk menentukan apakah file ID pelari sudah ada dalam skrip Python. |
with open() | Manajer konteks untuk operasi file dengan Python, digunakan untuk membaca dan menulis ID runner ke file. |
Mengkoordinasikan Alur Kerja dengan Pelari Bersama
Skrip yang disediakan mengelola tugas runner untuk alur kerja GitHub. Skrip Bash dimulai dengan memeriksa apakah ID pelari sudah disimpan dalam file sementara. Jika tidak, ia menggunakan untuk menanyakan API GitHub untuk pelari yang tersedia dan untuk mengurai respons JSON, memilih idle runner pertama dan menyimpan ID-nya. Skrip Python mencapai fungsionalitas serupa dengan memanfaatkan metode untuk mengambil informasi pelari dari API GitHub. Skrip kemudian memeriksa apakah ID pelari sudah disimpan menggunakan os.path.exists() dan menyimpannya jika tidak.
Kedua skrip memastikan bahwa setelah pelari ditetapkan, pelari tersebut akan digunakan kembali untuk pekerjaan berikutnya dengan mereferensikan ID pelari yang disimpan. Dalam skrip Python, mengambil variabel lingkungan untuk token dan repositori GitHub, dan digunakan untuk menangani operasi file dengan aman. Skrip ini membantu mengoordinasikan beberapa alur kerja, memastikan alur kerja tersebut berjalan pada runner yang sama tanpa melakukan hardcoding pada nama runner, menjadikannya fleksibel dan efisien dalam mengelola eksekusi alur kerja.
Menerapkan Strategi Pelari Bersama untuk Tindakan GitHub
Menggunakan skrip Bash dan Tindakan GitHub untuk memastikan alur kerja berjalan di runner yang sama
# 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
Memastikan Penggunaan Runner yang Konsisten dalam File YAML Terpisah
Menggunakan Tindakan Python dan GitHub untuk eksekusi alur kerja yang terkoordinasi
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}")
Manajemen Pelari yang Efisien dalam Tindakan GitHub
Dalam skenario ketika alur kerja harus dijalankan pada runner yang dihosting sendiri, pertimbangan utamanya adalah memastikan ketersediaan runner dan meminimalkan konflik. Menggunakan strategi pelari bersama, seperti yang terlihat pada skrip sebelumnya, memastikan bahwa setelah pelari ditugaskan ke suatu pekerjaan, pekerjaan berikutnya menggunakan pelari yang sama. Hal ini dapat sangat bermanfaat dalam pipeline CI/CD yang kompleks di mana mempertahankan status atau memanfaatkan sumber daya yang disimpan dalam cache sangatlah penting.
Aspek lain yang perlu dipertimbangkan adalah mengoptimalkan pemanfaatan runner. Dengan memilih dan menugaskan runner secara dinamis berdasarkan ketersediaan, organisasi dapat mengelola sumber daya mereka dengan lebih baik. Menerapkan strategi tersebut tidak hanya meningkatkan efisiensi tetapi juga mengurangi waktu yang dihabiskan alur kerja dalam antrian, menunggu pelari yang tersedia. Pendekatan ini dapat diperluas ke alat dan platform CI/CD lainnya, menjadikannya solusi serbaguna untuk berbagai kebutuhan otomatisasi.
- Bagaimana cara memastikan pelari tertentu selalu digunakan?
- Menggunakan masukkan file YAML Anda untuk menentukan grup pelari atau nama pelari yang tepat.
- Bisakah saya menugaskan pelari ke alur kerja secara dinamis?
- Ya, dengan menggunakan skrip untuk menanyakan pelari yang tersedia dan menugaskannya secara dinamis.
- Bagaimana cara menangani konflik pelari di lingkungan yang sibuk?
- Menerapkan mekanisme antrian atau memprioritaskan alur kerja untuk mengelola alokasi runner secara efektif.
- Apa yang terjadi jika tidak ada pelari yang tersedia?
- Alur kerja akan mengantre hingga runner tersedia. Optimalkan penggunaan pelari untuk meminimalkan waktu tunggu.
- Bisakah saya menggunakan skrip ini dengan platform CI/CD lainnya?
- Ya, logikanya dapat diadaptasi untuk platform lain dengan akses API ke manajemen runner.
- Bagaimana cara mempertahankan status antar alur kerja?
- Pastikan runner yang sama digunakan untuk pekerjaan terkait dan manfaatkan mekanisme caching jika memungkinkan.
- Izin apa yang diperlukan untuk skrip ini?
- Pastikan token GitHub Anda memiliki cakupan yang diperlukan, seperti Dan .
- Bisakah saya menjalankan beberapa alur kerja secara bersamaan pada pelari yang sama?
- Biasanya, tidak. Setiap pelari menjalankan satu pekerjaan pada satu waktu. Gunakan beberapa pelari untuk konkurensi.
- Bagaimana cara memantau penggunaan dan kinerja pelari?
- Gunakan alat pemantauan atau layanan eksternal bawaan GitHub untuk melacak aktivitas dan kinerja pelari.
Kesimpulan:
Mengelola alur kerja GitHub agar berjalan pada runner yang dihosting sendiri sangat penting untuk efisiensi dan konsistensi. Skrip Bash dan Python yang dibahas memberikan solusi yang kuat dengan menugaskan runner secara dinamis dan memastikan pekerjaan selanjutnya menggunakan runner yang sama. Pendekatan ini meminimalkan konflik dan mengoptimalkan pemanfaatan sumber daya, menjadikannya strategi yang efektif untuk saluran CI/CD yang kompleks. Dengan menerapkan metode ini, organisasi dapat menyederhanakan pelaksanaan alur kerja mereka dan mengurangi waktu tunggu, yang pada akhirnya meningkatkan produktivitas dan menjaga kelancaran proses pengembangan.