In dieser Anleitung erfahren Sie, wie Sie selbst gehostete GitHub-Runner in Worker-Pools verwenden, um die in Ihrem GitHub-Repository definierten Workflows auszuführen und Ihren Worker-Pool mit Cloud Run External Metrics Autoscaling (CREMA) zu skalieren.
Selbst gehostete GitHub-Runner
In einem GitHub Actions-Workflow sind Runner die Maschinen, auf denen Jobs ausgeführt werden. Ein Runner kann beispielsweise Ihr Repository lokal klonen, Testsoftware installieren und dann Befehle ausführen, die Ihren Code auswerten.
Sie können selbst gehostete Runner verwenden, um GitHub Actions auf Cloud Run-Worker-Pool-Instanzen auszuführen. In dieser Anleitung erfahren Sie, wie Sie einen Pool von Runnern automatisch anhand der Anzahl der ausgeführten und nicht geplanten Jobs skalieren.
Ziele
In dieser Anleitung wird Folgendes beschrieben:
Selbst gehostete GitHub-Runner hinzufügen, um ein GitHub-Repository zu unterstützen, und Secret Manager-Secrets erstellen, um Tokens und Secrets sicher zu speichern.
Einen Cloud Run-Worker-Pool in Cloud Run bereitstellen und den Worker-Pool verwenden, um Jobs von GitHub Actions zu akzeptieren.
Den Autoscaler-CREMA-Dienst bereitstellen, um Ihren Worker-Pool zu skalieren.
Ihren CREMA-Dienst testen, indem Sie Logs prüfen.
Kosten
In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:
Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen.
Verwenden Sie den Preisrechner.
Hinweis
- Melden Sie sich in Ihrem Google Cloud -Konto an. Wenn Sie mit Google Cloudnoch nicht vertraut sind, erstellen Sie einfach ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Aktivieren Sie die Cloud Run API, die Secret Manager API, die Parameter Manager API, die Artifact Registry API und die Cloud Build API.
Rollen, die zum Aktivieren von APIs erforderlich sind
Zum Aktivieren von APIs benötigen Sie die Berechtigung
serviceusage.services.enable. Wenn Sie das Projekt erstellt haben, haben Sie diese Berechtigung wahrscheinlich bereits über die Rolle „Inhaber“ (roles/owner). Andernfalls können Sie diese Berechtigung über die Rolle „Service Usage-Administrator“ (roles/serviceusage.serviceUsageAdmin) erhalten. Informationen zum Zuweisen von Rollen.- Installieren und initialisieren Sie die gcloud CLI.
- Aktualisieren Sie die Komponenten:
gcloud components update
- Legen Sie die folgenden Konfigurationsvariablen für CREMA fest, die in dieser Anleitung verwendet werden:
Ersetzen Sie PROJECT_ID durch die ID Ihres Google Cloud Projekts von.PROJECT_ID=PROJECT_ID CREMA_SERVICE_ACCOUNT_NAME=crema-service-account@$PROJECT_ID.iam.gserviceaccount.com CREMA_REPO_NAME=crema AR_REGION=us-central1
- Für Ihren Cloud Run-Skalierungsdienst fallen Kosten an, je nachdem, wie oft Sie die Skalierung auslösen. Weitere Informationen finden Sie im Preisrechner.
Erforderliche Rollen
Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen für Ihr Projekt zuzuweisen, um die Berechtigungen zu erhalten, die Sie zum Ausführen der Anleitung benötigen:
- Repository-Administrator für Artifact Registry (
roles/artifactregistry.repoAdmin) - Cloud Build-Bearbeiter (
roles/cloudbuild.builds.editor) - Cloud Run-Administrator (
roles/run.admin) - Dienstkonten erstellen (
roles/iam.serviceAccountCreator) - Secret Manager-Administrator (
roles/secretmanager.admin) - Service Account User (
roles/iam.serviceAccountUser) - Service Usage Consumer (
roles/serviceusage.serviceUsageConsumer) - Storage-Administrator (
roles/storage.admin) - Parameter Manager-Administrator (
roles/parametermanager.admin)
Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.
Sie können die erforderlichen Berechtigungen auch über benutzerdefinierte Rollen oder andere vordefinierte Rollen erhalten.
Sie benötigen die Berechtigung zum Bearbeiten der Einstellungen für ein GitHub-Repository, um die selbst gehosteten Runner zu konfigurieren. Das Repository kann einem Nutzer oder einer Organisation gehören.
GitHub empfiehlt, selbst gehostete Runner nur mit privaten Repositorys zu verwenden.
Benutzerdefiniertes Dienstkonto erstellen
In dieser Anleitung wird ein benutzerdefiniertes Dienstkonto mit den Mindestberechtigungen verwendet, die für die Nutzung der bereitgestellten Ressourcen erforderlich sind. So richten Sie das Dienstkonto ein:
gcloud iam service-accounts create crema-service-account \
--display-name="CREMA Service Account"
Selbst gehostete GitHub-Runner hinzufügen
Folgen Sie der Anleitung unter Selbst gehostete Runner in der GitHub-Dokumentation, um selbst gehostete GitHub-Runner hinzuzufügen.
GitHub-Repository identifizieren
In dieser Anleitung steht die Variable GITHUB_REPO für den Namen des Repositorys. Dies ist der Teil des Namens, der nach dem Domainnamen für persönliche Nutzer-Repositories und Organisations-Repositories steht. Beispiel:
- Wenn Ihre Domain-URL
https://github.com/myuser/myrepolautet, ist GITHUB_REPOmyuser/myrepo. - Wenn Ihre Domain-URL
https://github.com/mycompany/ourrepolautet, ist GITHUB_REPOmycompany/ourrepo.
Zugriffstoken erstellen
Erstellen Sie ein GitHub-Zugriffstoken, um Runner dynamisch hinzuzufügen und zu entfernen, indem Sie mit dem ausgewählten Repository interagieren. So erstellen Sie ein Zugriffstoken auf GitHub und speichern es in Secret Manager:
- Prüfen Sie, ob Sie in Ihrem GitHub-Konto angemeldet sind.
- Rufen Sie die Seite „GitHub-Einstellungen“ > „Entwicklereinstellungen“ > „Persönliche Zugriffstokens“ > „Tokens (klassisch)“ auf.
- Klicken Sie auf Neues Token erstellen und wählen Sie Neues Token erstellen (klassisch) aus.
- Wählen Sie für den Tokenbereich das Kästchen repo aus.
- Klicken Sie auf Token generieren.
- Kopieren Sie das generierte Token.
Weitere Informationen zu Zugriffstokens finden Sie in der GitHub-Dokumentation unter Authentifizierungsanforderungen.
Secret für Ihr Zugriffstoken mit Secret Manager erstellen
Nehmen Sie das Secret-Token, das Sie im vorherigen Schritt erstellt haben, und speichern Sie es in Secret Manager. So legen Sie Zugriffsberechtigungen fest:
Erstellen Sie das Secret in Secret Manager:
echo -n "GITHUB_TOKEN" | gcloud secrets create github_runner_token --data-file=-Ersetzen Sie GITHUB_TOKEN durch den Wert, den Sie aus GitHub kopiert haben.
Gewähren Sie Ihrem benutzerdefinierten Dienstkonto die Rolle
roles/secretmanager.secretAccessor, um auf Ihr neu erstelltes Secret zuzugreifen:gcloud secrets add-iam-policy-binding github_runner_token \ --member "serviceAccount:$CREMA_SERVICE_ACCOUNT_NAME" \ --role "roles/secretmanager.secretAccessor"
Worker-Pool bereitstellen
Erstellen Sie einen Cloud Run-Worker-Pool, um GitHub Actions zu verarbeiten. Dieser Pool verwendet ein Image, das auf dem von GitHub erstellten Image actions/runner basiert. So stellen Sie einen Worker-Pool bereit:
Klonen Sie das Beispiel-Repository auf Ihren lokalen Computer, um das Codebeispiel abzurufen:
git clone https://github.com/GoogleCloudPlatform/cloud-run-samplesWechseln Sie in das Verzeichnis, das den Cloud Run-Beispielcode enthält:
cd cloud-run-samples/github-runner/worker-pool-containerStellen Sie den Worker-Pool bereit:
gcloud run worker-pools deploy WORKER_POOL_NAME \ --region us-central1 \ --source . \ --instances 1 \ --set-env-vars GITHUB_REPO=GITHUB_REPO \ --set-secrets GITHUB_TOKEN=github_runner_token:latest \ --service-account $CREMA_SERVICE_ACCOUNT_NAME \ --memory 2Gi \ --cpu 4Ersetzen Sie Folgendes:
- WORKER_POOL_NAME: der Name des Worker-Pools
- WORKER_POOL_LOCATION: die Region des Worker-Pools
- GITHUB_REPO: der Name des GitHub-Repositorys
Wenn Sie zum ersten Mal Cloud Run-Quellcodebereitstellungen in diesem Projekt verwenden, werden Sie von Cloud Run aufgefordert, ein Standard-Artifact Registry-Repository zu erstellen.
Codebeispiel
Der Worker-Pool ist mit einem Dockerfile konfiguriert, das auf dem von GitHub erstellten actions/runner Image basiert:
Dieses Hilfsskript wird ausgeführt, wenn der Container gestartet wird. Es registriert sich mit einem von Ihnen erstellten Token als kurzlebige Instanz im konfigurierten Repository.
Worker-Pool verwenden, um Jobs von GitHub Actions zu akzeptieren
Ihre Worker-Pool-Instanz ist bereit, Jobs von GitHub Actions zu akzeptieren.
Wenn Ihr Repository noch keine GitHub Actions enthält, folgen Sie der Anleitung in der Kurzanleitung zum Erstellen Ihres ersten Workflows.
Wenn Ihr Repository GitHub Actions enthält, prüfen Sie, ob Sie die Einrichtung Ihres selbst gehosteten Runners abgeschlossen haben, indem Sie eine GitHub Action in Ihrem Repository aufrufen.
Wenn Ihre GitHub Action keine selbst gehosteten Runner verwendet, ändern Sie den
Wert des Jobs Ihrer GitHub Action von runs-on in self-hosted.
Sobald Sie eine Action für die Verwendung der selbst gehosteten Runner konfiguriert haben, führen Sie die Action aus.
Prüfen Sie in der GitHub-Oberfläche, ob die Action erfolgreich abgeschlossen wurde.
Autoscaler-CREMA-Dienst bereitstellen
Sie haben einen Worker in Ihrem ursprünglichen Pool bereitgestellt, mit dem jeweils eine Action verarbeitet werden kann. Je nach Nutzung von Continuous Integration (CI) müssen Sie Ihren Pool möglicherweise skalieren, um eine große Anzahl von zu erledigenden Aufgaben zu bewältigen.
Nachdem Sie den Worker-Pool mit einem aktiven GitHub-Runner bereitgestellt haben, konfigurieren Sie den CREMA-Autoscaler so, dass Worker-Instanzen basierend auf dem Jobstatus in der Aktionswarteschlange bereitgestellt werden.
Diese Implementierung wartet auf ein
workflow_job
Ereignis. Wenn Sie einen Workflow-Job erstellen, wird der Worker-Pool hochskaliert und nach Abschluss des Jobs wieder herunterskaliert. Der Pool wird nicht über die von Ihnen konfigurierte maximale Anzahl von Instanzen hinaus skaliert und auf null skaliert, wenn alle ausgeführten Jobs abgeschlossen sind.
Sie können CREMA an Ihre Arbeitslasten anpassen.
Autoscaler konfigurieren
In dieser Anleitung wird der Parameter Manager verwendet, um die YAML-Konfigurationsdatei für CREMA zu speichern.
Erstellen Sie einen Parameter im Parameter Manager, um Parameterversionen für CREMA zu speichern:
PARAMETER_ID=crema-config PARAMETER_REGION=global gcloud parametermanager parameters create $PARAMETER_ID --location=$PARAMETER_REGION --parameter-format=YAMLErstellen Sie im übergeordneten Verzeichnis eine YAML-Datei
my-crema-config.yaml, um die Autoscaler-Konfiguration zu definieren:apiVersion: crema/v1 kind: CremaConfig metadata: name: gh-demo spec: pollingInterval: 10 triggerAuthentications: - metadata: name: github-trigger-auth spec: gcpSecretManager: secrets: - parameter: personalAccessToken id: github_runner_token version: latest scaledObjects: - spec: scaleTargetRef: name: projects/PROJECT_ID/locations/us-central1/workerpools/WORKER_POOL_NAME triggers: - type: github-runner name: GITHUB_RUNNER metadata: owner: REPOSITORY_OWNER runnerScope: repo repos: REPOSITORY_NAME targetWorkflowQueueLength: 1 authenticationRef: name: github-trigger-auth advanced: horizontalPodAutoscalerConfig: behavior: scaleDown: stabilizationWindowSeconds: 10 policies: - type: Pods value: 100 periodSeconds: 10 scaleUp: stabilizationWindowSeconds: 10 policies: - type: Pods value: 2 periodSeconds: 10Ersetzen Sie Folgendes:
- PROJECT_ID: die Google Cloud Projekt-ID
- WORKER_POOL_NAME: der Name des bereitgestellten Worker-Pools
- GITHUB_RUNNER: der Name des konfigurierten GitHub-Runners
- REPOSITORY_OWNER: der Inhaber des GitHub-Repositorys
- REPOSITORY_NAME: der Name des GitHub-Repositorys
Laden Sie Ihre lokale YAML-Datei als neue Parameter-Version hoch:
LOCAL_YAML_CONFIG_FILE=my-crema-config.yaml PARAMETER_VERSION=1 gcloud parametermanager parameters versions create $PARAMETER_VERSION \ --location=$PARAMETER_REGION \ --parameter=$PARAMETER_ID \ --payload-data-from-file=$LOCAL_YAML_CONFIG_FILE
Benutzerdefiniertem Dienstkonto zusätzliche Berechtigungen gewähren
Um den in Ihrer YAML-Konfiguration angegebenen Worker-Pool zu skalieren, gewähren Sie dem benutzerdefinierten Dienstkonto die folgenden Berechtigungen:
Gewähren Sie Ihrem CREMA-Dienstkonto die Berechtigung zum Lesen aus dem Parameter Manager:
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:$CREMA_SERVICE_ACCOUNT_NAME" \ --role="roles/parametermanager.parameterViewer"Weisen Sie Ihrem CREMA-Dienstkonto die Rolle
roles/run.developerfür den Worker-Pool zu:WORKER_POOL_NAME=WORKER_POOL_NAME WORKER_POOL_REGION=us-central1 gcloud run worker-pools add-iam-policy-binding $WORKER_POOL_NAME \ --region=$WORKER_POOL_REGION \ --member="serviceAccount:$CREMA_SERVICE_ACCOUNT_NAME" \ --role="roles/run.developer"Ersetzen Sie WORKER_POOL_NAME durch den Namen des Worker-Pools.
Gewähren Sie Ihrem CREMA-Dienstkonto die Berechtigung zum Schreiben von Messwerten:
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:$CREMA_SERVICE_ACCOUNT_NAME" \ --role="roles/monitoring.metricWriter"Weisen Sie Ihrem CREMA-Dienstkonto die Rolle „Dienstkontonutzer“ zu:
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:$CREMA_SERVICE_ACCOUNT_NAME" \ --role="roles/iam.serviceAccountUser"
Dienst bereitstellen, um Arbeitslasten zu skalieren
Führen Sie den folgenden Befehl mit einem vorgefertigten Container-Image aus, um den Dienst bereitzustellen und Ihren Worker-Pool zu skalieren:
SERVICE_NAME=my-crema-service
SERVICE_REGION=us-central1
CREMA_CONFIG_PARAM_VERSION=projects/$PROJECT_ID/locations/$PARAMETER_REGION/parameters/$PARAMETER_ID/versions/$PARAMETER_VERSION
IMAGE=us-central1-docker.pkg.dev/cloud-run-oss-images/crema-v1/autoscaler:1.0
gcloud run deploy $SERVICE_NAME \
--image=${IMAGE} \
--region=${SERVICE_REGION} \
--service-account="${CREMA_SERVICE_ACCOUNT_NAME}" \
--no-allow-unauthenticated \
--no-cpu-throttling \
--base-image=us-central1-docker.pkg.dev/serverless-runtimes/google-24/runtimes/java25 \
--labels=created-by=crema \
--set-env-vars="CREMA_CONFIG=${CREMA_CONFIG_PARAM_VERSION},OUTPUT_SCALER_METRICS=True"
CREMA-Dienst testen
In den Logs Ihres Dienstes sollten jedes Mal, wenn Messwerte aktualisiert werden, die folgenden Logs angezeigt werden:
Jeder Logeintrag ist mit der Komponente gekennzeichnet, die sie ausgegeben hat.
[INFO] [METRIC-PROVIDER] Starting metric collection cycle
[INFO] [METRIC-PROVIDER] Successfully fetched scaled object metrics ...
[INFO] [METRIC-PROVIDER] Sending scale request ...
[INFO] [SCALER] Received ScaleRequest ...
[INFO] [SCALER] Current instances ...
[INFO] [SCALER] Recommended instances ...
Bereinigen
Löschen Sie alle Ressourcen, die Sie mit dieser Anleitung bereitgestellt haben, um zusätzliche Kosten für Ihr Google Cloud Konto zu vermeiden.
Projekt löschen
Wenn Sie ein neues Projekt für diese Anleitung erstellt haben, löschen Sie das Projekt. Wenn Sie ein vorhandenes Projekt verwendet haben und es beibehalten möchten, ohne die Änderungen in dieser Anleitung hinzuzufügen , löschen Sie die für die Anleitung erstellten Ressourcen.
Am einfachsten vermeiden Sie weitere Kosten, wenn Sie das zum Ausführen der Anleitung erstellte Projekt löschen.
So löschen Sie das Projekt:
- Wechseln Sie in der Google Cloud -Console zur Seite Ressourcen verwalten.
- Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie auf Löschen.
- Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Herunterfahren , um das Projekt zu löschen.
Anleitungsressourcen löschen
Löschen Sie den Cloud Run-Dienst, den Sie in dieser Anleitung bereitgestellt haben. Für Cloud Run-Dienste fallen erst Kosten an, wenn sie Anfragen erhalten.
Führen Sie den folgenden Befehl aus, um Ihren Cloud Run-Dienst zu löschen:
gcloud run services delete SERVICE-NAME
Ersetzen Sie SERVICE-NAME durch den Namen Ihres Dienstes.
Sie können Cloud Run-Dienste auch über die Google Cloud Console löschen.
Entfernen Sie die Konfiguration der Standardregion
gcloud, die Sie während der Einrichtung für die Anleitung hinzugefügt haben:gcloud config unset run/regionEntfernen Sie die Projektkonfiguration:
gcloud config unset projectLöschen Sie andere Google Cloud in dieser Anleitung erstellte Ressourcen:
Nächste Schritte
- Weitere Informationen zu Cloud Run-Worker-Pools.
- Weitere Cloud Run-Demos, Anleitungen und Beispiele entdecken
- Stellen Sie Ihren CREMA-Dienst mit einem benutzerdefinierten Container-Image bereit, das Sie erstellen mit Cloud Build aus dem Quellcode.