Οδηγός: Εκτέλεση ροών εργασίας Git στον ίδιο Runner

Οδηγός: Εκτέλεση ροών εργασίας Git στον ίδιο Runner
Οδηγός: Εκτέλεση ροών εργασίας Git στον ίδιο Runner

Συντονισμός ροών εργασίας GitHub σε Shared Runners

Η διαχείριση πολλαπλών ροών εργασίας στο GitHub Actions μπορεί να είναι δύσκολη, ειδικά όταν τις χρειάζεστε για να εκτελούνται στον ίδιο αυτόνομο δρομέα. Σε σενάρια όπου έχετε ξεχωριστά αρχεία YAML για διαφορετικές ροές εργασίας, όπως το codeql.yml και το snyk-zap.yml, η διασφάλιση ότι εκτελούνται στον ίδιο runner από μια συγκεκριμένη ομάδα μπορεί να είναι δύσκολη.

Ο στόχος είναι να χρησιμοποιηθεί το ίδιο runner και για τις δύο ροές εργασίας χωρίς να ονομαστεί ρητά ο δρομέας, αποφεύγοντας έτσι τις συγκρούσεις με άλλες ροές εργασίας. Αυτός ο οδηγός θα διερευνήσει πιθανές λύσεις για την αποτελεσματική επίτευξη αυτού του συγχρονισμού διατηρώντας παράλληλα τις ροές εργασίας σε ξεχωριστά αρχεία YAML.

Εντολή Περιγραφή
jq Ένας ελαφρύς και ευέλικτος επεξεργαστής JSON γραμμής εντολών που χρησιμοποιείται για την ανάλυση της εξόδου JSON στο σενάριο Bash.
head -n 1 Εξάγει την πρώτη γραμμή του αποτελέσματος, που χρησιμοποιείται εδώ για την επιλογή του πρώτου διαθέσιμου αναγνωριστικού δρομέα.
curl Εργαλείο γραμμής εντολών για τη μεταφορά δεδομένων με διευθύνσεις URL, που χρησιμοποιείται για την αλληλεπίδραση με το API του GitHub στο σενάριο Bash.
os.getenv() Ανακτά μεταβλητές περιβάλλοντος στην Python, που χρησιμοποιούνται για τη λήψη του διακριτικού GitHub και του ονόματος αποθετηρίου.
requests.get() Στέλνει ένα αίτημα GET σε μια καθορισμένη διεύθυνση URL, που χρησιμοποιείται για την ανάκτηση διαθέσιμων δρομέων από το API του GitHub στο σενάριο Python.
os.path.exists() Ελέγχει εάν υπάρχει μια καθορισμένη διαδρομή, η οποία χρησιμοποιείται για να προσδιορίσει εάν το αρχείο αναγνωριστικού προγράμματος εκτέλεσης υπάρχει ήδη στο σενάριο Python.
with open() Διαχείριση περιβάλλοντος για λειτουργίες αρχείων στην Python, που χρησιμοποιείται για την ανάγνωση και εγγραφή του αναγνωριστικού προγράμματος εκτέλεσης σε ένα αρχείο.

Συντονισμός ροών εργασίας με Shared Runners

Τα παρεχόμενα σενάρια διαχειρίζονται την ανάθεση εκτέλεσης για ροές εργασίας GitHub. Το σενάριο Bash ξεκινά ελέγχοντας εάν ένα αναγνωριστικό εκτέλεσης είναι ήδη αποθηκευμένο σε ένα προσωρινό αρχείο. Αν όχι, χρησιμοποιεί curl για να ρωτήσετε το API του GitHub για διαθέσιμους δρομείς και jq για να αναλύσετε την απόκριση JSON, επιλέγοντας τον πρώτο αδρανή εκτέλεση και αποθηκεύοντας το αναγνωριστικό του. Το σενάριο Python επιτυγχάνει παρόμοια λειτουργικότητα χρησιμοποιώντας το requests.get() μέθοδος ανάκτησης πληροφοριών δρομέα από το API του GitHub. Στη συνέχεια, το σενάριο ελέγχει εάν ένα αναγνωριστικό δρομέα έχει ήδη αποθηκευτεί χρησιμοποιώντας os.path.exists() και το αποθηκεύει αν όχι.

Και τα δύο σενάρια διασφαλίζουν ότι μόλις εκχωρηθεί ένας δρομέας, θα χρησιμοποιηθεί ξανά για επόμενες εργασίες, αναφέροντας το αποθηκευμένο αναγνωριστικό δρομέα. Στο σενάριο Python, os.getenv() ανακτά μεταβλητές περιβάλλοντος για το διακριτικό και το αποθετήριο GitHub και with open() χρησιμοποιείται για τον ασφαλή χειρισμό των λειτουργιών αρχείων. Αυτά τα σενάρια βοηθούν στο συντονισμό πολλαπλών ροών εργασίας, διασφαλίζοντας ότι εκτελούνται στον ίδιο δρομέα χωρίς κωδικοποίηση του ονόματος του δρομέα, καθιστώντας τα ευέλικτα και αποτελεσματικά στη διαχείριση της εκτέλεσης της ροής εργασίας.

Εφαρμογή μιας κοινής στρατηγικής Runner για ενέργειες 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

Διασφάλιση συνεπούς χρήσης Runner σε ξεχωριστά αρχεία YAML

Χρήση Python και GitHub Actions για συντονισμένη εκτέλεση ροής εργασίας

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}")

Αποτελεσματική Διαχείριση Runner στις Ενέργειες GitHub

Σε σενάρια όπου οι ροές εργασιών πρέπει να εκτελούνται στον ίδιο αυτο-φιλοξενούμενο δρομέα, ένα βασικό στοιχείο είναι η διασφάλιση της διαθεσιμότητας του δρομέα και η ελαχιστοποίηση των διενέξεων. Η χρήση μιας κοινής στρατηγικής δρομέα, όπως φαίνεται στα προηγούμενα σενάρια, διασφαλίζει ότι όταν ένας δρομέας ανατεθεί σε μια εργασία, οι επόμενες εργασίες χρησιμοποιούν τον ίδιο δρομέα. Αυτό μπορεί να είναι ιδιαίτερα ωφέλιμο σε πολύπλοκους αγωγούς CI/CD όπου η διατήρηση της κατάστασης ή η χρήση αποθηκευμένων πόρων είναι ζωτικής σημασίας.

Μια άλλη πτυχή που πρέπει να λάβετε υπόψη είναι η βελτιστοποίηση της χρήσης του δρομέα. Με την δυναμική επιλογή και ανάθεση δρομέων με βάση τη διαθεσιμότητα, οι οργανισμοί μπορούν να διαχειρίζονται καλύτερα τους πόρους τους. Η εφαρμογή τέτοιων στρατηγικών όχι μόνο βελτιώνει την αποτελεσματικότητα, αλλά μειώνει επίσης τον χρόνο που αφιερώνουν οι ροές εργασίας στην ουρά, περιμένοντας έναν διαθέσιμο δρομέα. Αυτή η προσέγγιση μπορεί να επεκταθεί σε άλλα εργαλεία και πλατφόρμες CI/CD, καθιστώντας την μια ευέλικτη λύση για διάφορες ανάγκες αυτοματισμού.

Συνήθεις ερωτήσεις σχετικά με τον συντονισμό των ροών εργασίας σε Shared Runners

  1. Πώς μπορώ να διασφαλίσω ότι χρησιμοποιείται πάντα ένας συγκεκριμένος δρομέας;
  2. Χρησιμοποιήστε το runs-on πληκτρολογήστε το αρχείο YAML για να καθορίσετε την ομάδα δρομέων ή το ακριβές όνομα δρομέα.
  3. Μπορώ να αντιστοιχίσω δυναμικά runners σε ροές εργασίας;
  4. Ναι, χρησιμοποιώντας σενάρια για να ρωτήσετε τους διαθέσιμους δρομείς και να τους εκχωρήσετε δυναμικά.
  5. Πώς μπορώ να διαχειριστώ τις συγκρούσεις δρομέων σε ένα πολυάσχολο περιβάλλον;
  6. Εφαρμόστε έναν μηχανισμό ουράς ή δώστε προτεραιότητα στις ροές εργασίας για να διαχειριστείτε αποτελεσματικά την κατανομή των δρομέων.
  7. Τι συμβαίνει εάν δεν υπάρχουν διαθέσιμοι δρομείς;
  8. Οι ροές εργασίας θα παραμείνουν σε ουρά μέχρι να γίνει διαθέσιμος ένας δρομέας. Βελτιστοποιήστε τη χρήση του δρομέα για να ελαχιστοποιήσετε τους χρόνους αναμονής.
  9. Μπορώ να χρησιμοποιήσω αυτά τα σενάρια με άλλες πλατφόρμες CI/CD;
  10. Ναι, η λογική μπορεί να προσαρμοστεί για άλλες πλατφόρμες με πρόσβαση API στη διαχείριση δρομέων.
  11. Πώς διατηρώ την κατάσταση μεταξύ των ροών εργασίας;
  12. Βεβαιωθείτε ότι το ίδιο runner χρησιμοποιείται για σχετικές εργασίες και αξιοποιήστε μηχανισμούς προσωρινής αποθήκευσης όπου είναι δυνατόν.
  13. Τι δικαιώματα απαιτούνται για αυτά τα σενάρια;
  14. Βεβαιωθείτε ότι το διακριτικό GitHub έχει τα απαραίτητα πεδία, όπως π.χ repo και workflow.
  15. Μπορώ να εκτελέσω πολλές ροές εργασίας ταυτόχρονα στον ίδιο δρομέα;
  16. Τυπικά, όχι. Κάθε δρομέας εκτελεί μία εργασία τη φορά. Χρησιμοποιήστε πολλαπλούς δρομείς για συγχρονισμό.
  17. Πώς παρακολουθώ τη χρήση και την απόδοση του δρομέα;
  18. Χρησιμοποιήστε τα ενσωματωμένα εργαλεία παρακολούθησης ή τις εξωτερικές υπηρεσίες του GitHub για να παρακολουθείτε τη δραστηριότητα και την απόδοση του δρομέα.

Συμπέρασμα:

Η διαχείριση των ροών εργασίας του GitHub για εκτέλεση στον ίδιο αυτό-φιλοξενούμενο δρομέα είναι ζωτικής σημασίας για την αποτελεσματικότητα και τη συνέπεια. Τα συζητημένα σενάρια Bash και Python παρέχουν μια ισχυρή λύση, αναθέτοντας δυναμικά τους runners και διασφαλίζοντας ότι οι επόμενες εργασίες χρησιμοποιούν τον ίδιο runner. Αυτή η προσέγγιση ελαχιστοποιεί τις συγκρούσεις και βελτιστοποιεί τη χρήση των πόρων, καθιστώντας την μια αποτελεσματική στρατηγική για πολύπλοκους αγωγούς CI/CD. Με την εφαρμογή αυτών των μεθόδων, οι οργανισμοί μπορούν να εξορθολογίσουν την εκτέλεση της ροής εργασίας τους και να μειώσουν τους χρόνους αναμονής, βελτιώνοντας τελικά την παραγωγικότητα και διατηρώντας μια ομαλή διαδικασία ανάπτυξης.