Deployment-Vorschauen konfigurieren


In dieser Anleitung erfahren Sie, wie Sie Cloud Run-Überarbeitungs-URLs zur Implementierung von Vorschauen für GitHub-Pull-Anfragen über Cloud Build-Trigger verwenden. Mit Vorschauen können Sie mögliche Änderungen für einen Dienst bereitstellen, ohne die Live- oder „Produktions“-Version des Dienstes zu ändern. Durch das Deployment einer Trafficüberarbeitung von 0 % einer geöffneten Pull-Anfrage können Sie eine Vorschau der Änderungen aufrufen und prüfen, ob sie in einer produktionsähnlichen Umgebung wie vorgesehen funktionieren, bevor sie zusammengeführt werden.

Diese Anleitung funktioniert sowohl mit öffentlichen als auch mit privaten GitHub-Repositories. Beachten Sie, dass die Vorschauen selbst, falls sie verdeckt sind, öffentlich sind.

Ziele

  • Cloud Run-Dienst erstellen
  • Implementieren Sie die Versionsverwaltungsbasierte Continuous Integration auf GitHub.
  • Zugriff auf Secrets über Secret Manager erstellen und verwalten
  • Benutzerdefinierten Cloud Builder bereitstellen
  • Cloud Build-Trigger zum Aufrufen von Builds für GitHub-Pull-Anfragen erstellen

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. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Hinweis

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Cloud Run, Cloud Build, and Secret Manager APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the Cloud Run, Cloud Build, and Secret Manager APIs.

    Enable the APIs

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:

Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff verwalten.

Sie können die erforderlichen Berechtigungen auch über benutzerdefinierte Rollen oder andere vordefinierte Rollen erhalten.

Codebeispiel abrufen

Der Einfachheit halber erstellen Sie für diese Anleitung ein neues GitHub-Repository mit der Kopie einer „Hello World“-Anwendung, die auf einer Vorlage basiert. Anschließend fügen Sie diesem Repository eine neue Datei mit der benutzerdefinierten Cloud Build-Konfiguration hinzu.

  1. Melden Sie sich bei GitHub an und rufen Sie das Vorlagen-Repository auf.
  2. Erstellen Sie mithilfe dieser Vorlage ein neues Repository durch Klicken auf „Diese Vorlage verwenden“.
    1. Benennen Sie Ihr Repository mit helloworld-python.
    2. Wählen Sie für das Repository entweder "Öffentlich" oder "Privat" aus.
    3. Klicken Sie auf Repository aus Vorlage erstellen.
  3. Erstellen Sie eine neue Cloud Build-Konfigurationsdatei im Repository (siehe vollständige Anleitung):

    1. Klicken Sie auf der Repository-Seite auf Datei hinzufügen > Neue Datei erstellen.
    2. Benennen Sie die neue Datei mit cloudbuild.yaml.
    3. Kopieren Sie den folgenden Code in die Datei cloudbuild.yaml:

      steps:
        - id: "build image"
          name: "gcr.io/cloud-builders/docker"
          args:
            [
              "build",
              "-t",
              "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}",
              ".",
            ]
      
        - id: "push image"
          name: "gcr.io/cloud-builders/docker"
          args:
            [
              "push",
              "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}",
            ]
      
        - id: "deploy prod service"
          name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
          entrypoint: "gcloud"
          args:
            [
              "run",
              "deploy",
              "${_SERVICE_NAME}",
              "--platform",
              "managed",
              "--region",
              "${_REGION}",
              "--allow-unauthenticated",
              "--image",
              "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}",
            ]
      
        # Force the new revision to serve 100% of traffic.
        - id: "ensure prod service live"
          name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
          entrypoint: "gcloud"
          args:
            [
              "run",
              "services",
              "update-traffic",
              "${_SERVICE_NAME}",
              "--to-latest",
              "--platform",
              "managed",
              "--region",
              "${_REGION}",
            ]
      
      substitutions:
        _SERVICE_NAME: myservice
        _REGION: us-central1
      
      options:
        logging: CLOUD_LOGGING_ONLY
    4. Behalten Sie die Standardauswahl „Commit direkt in den main-Zweig übernehmen“ bei.

    5. Klicken Sie auf Commit für neue Datei ausführen.

Dienst mit Build-Trigger bereitstellen

In dieser Anleitung wird gezeigt, wie Sie einen Build-Trigger einrichten, damit bei jeder Aktualisierung des Hauptzweigs Ihres Repositorys automatisch ein Build gestartet wird. Sie können Ihren Dienst auch manuell bereitstellen. Dazu rufen Sie jedes Mal Cloud Build auf, wenn Sie eine Änderung bereitstellen möchten.

In dieser Anleitung verwenden Sie die Datei cloudbuild.yaml für das Deployment eines Beispieldienstes namens myservice.

  1. Weisen Sie dem Cloud Build-Dienstkonto die Rollen „Cloud Run-Administrator“ und „Dienstkontonutzer“ zu (siehe vollständige Anleitung):

    1. Rufen Sie in der Google Cloud Console die Cloud Build-Seite mit den Kontoeinstellungen auf.

      Zur Cloud Build-Seite mit den Kontoeinstellungen

    2. Aktivieren Sie die Rolle „Cloud Run-Administrator“.

    3. Klicken Sie im Dialogfeld zur Bestätigung auf Zugriff auf alle Dienstkonten gewähren.

  2. Verbinden Sie Ihr GitHub-Konto mit Cloud Build (siehe vollständige Anleitung):

    1. Rufen Sie in der Google Cloud Console die Seite "Cloud Build-Trigger" auf.

      Zur Seite „Cloud Build-Trigger“

    2. Klicken Sie auf Repository verbinden.

    3. Wählen Sie GitHub (Cloud Build-GitHub-Anwendung) als Quelle aus und folgen Sie den Dialogfeldern für die Authentifizierung und Autorisierung.

    4. Wählen Sie das Repository "GITHUB_USER_NAME/helloworld-python" aus.

    5. Klicken Sie auf Repository verbinden.

    6. Klicken Sie unter "Trigger erstellen (optional)" auf Trigger erstellen.

  3. Erstellen Sie einen Cloud Build-Trigger (siehe vollständige Anleitung):

    1. Klicken Sie auf der Seite „Cloud Build-Trigger“ auf Trigger erstellen.
    2. Geben Sie die folgenden Informationen ein:
      • Name: prod-deploy
      • Ereignis: Push zum Branch
      • Quell-Repository: "GITHUB_USER_NAME/helloworld-python"
      • Quellzweig: ^main$
      • Build-Konfiguration: Cloud Build-Konfigurationsdatei (YAML oder JSON)
      • Speicherort der Cloud Build-Konfigurationsdatei: cloudbuild.yaml
    3. Klicken Sie auf Erstellen.
  4. Führen Sie den neuen Trigger manuell aus:

    1. Klicken Sie in der neuen Triggerliste auf Ausführen.
    2. Bestätigen Sie im Pop-up-Fenster den Zweignamen (main) und klicken Sie auf Trigger ausführen.
    3. Prüfen Sie die Ausführung des Builds im Cloud Build-Verlauf.
    4. Warten Sie, bis der Build abgeschlossen ist.
  5. Prüfen Sie, ob das Deployment erfolgreich war.

    1. Wechseln Sie in der Google Cloud Console zur Seite Cloud Run.

      Zur Seite „Cloud Run“

    2. Prüfen Sie, ob der Dienst ein grünes Häkchen für ein erfolgreiches Deployment aufweist.

    3. Klicken Sie auf den Tab Überarbeitungen und prüfen Sie, ob der Dienst eine Überarbeitung hat, die 100 % des Traffics bereitstellt und mit „myservice-00001-“ beginnt.

    4. Klicken Sie auf die URL des Dienstes und prüfen Sie, ob mit dem Dienst „Hello World!“ angezeigt wird.

    Cloud Run-Konsole mit einer Überarbeitung und markierter Dienst-URL
    Bereitgestellter Cloud Run-Dienst mit „Hello World!“

Tokens und Konfigurationen erstellen

Der im vorherigen Abschnitt erstellte Trigger prod-deploy stellt den Dienst bereit, wenn eine Änderung per Push an den Hauptzweig übertragen wird. Sie erstellen jetzt einen zweiten Trigger, der immer dann ausgeführt wird, wenn in Ihrem Repository eine Pull-Anfrage erstellt oder aktualisiert wird.

Nachdem der neue Trigger eingerichtet wurde, wird die Vorschau bereitgestellt. Die Pull-Anfrage enthält aber keine Informationen zur Verknüpfung mit der Vorschau. Um diese Funktionalität einzurichten, müssen Sie folgende zusätzliche Konfigurationsschritte ausführen:

  • GitHub-Token erstellen
  • Dieses Token in Secret Manager speichern
  • Benutzerdefiniertes Image für einen Schritt in Cloud Build erstellen

GitHub-Token erstellen und speichern

  1. Erstellen Sie ein GitHub-Token, um das Zurückschreiben in eine Pull-Anfrage zu ermöglichen (siehe vollständige Anleitung):
    1. Rufen Sie die Seite mit den Einstellungen für das persönliche GitHub-Zugriffstoken auf.
    2. Klicken Sie auf Neues Token erstellen.
    3. Geben Sie die folgenden Informationen ein:
      • Hinweis: preview-deploy
      • Ablauf: 30 Tage
      • Umfang:
        • Für ein öffentliches Repository: repo:status ("Status des Zugriffs-Commits")
        • Für ein privates Repository: repo ("Vollständige Kontrolle über private Repositories")
    4. Klicken Sie auf Token generieren.
    5. Kopieren Sie den Wert des generierten Tokens.
  2. Speichern Sie das GitHub-Token in Secret Manager:

    1. Wechseln Sie in der Google Cloud Console zur Seite Secret Manager.

      Zur Seite „Secret Manager“

    2. Klicken Sie auf Secret erstellen.

    3. Geben Sie die folgenden Informationen ein:

      1. Name: github_token.
      2. Secret-Wert: Fügen Sie den aus GitHub kopierten Tokenwert ein.
    4. Klicken Sie auf Secret erstellen.

  3. Erlauben Sie Cloud Build den Zugriff auf dieses Secret:

    1. Rufen Sie in einem neuen Browsertab in der Google Cloud Console die Seite Cloud Build-Einstellungen auf.

      Zur Seite „Cloud Build-Einstellungen“

    2. Kopieren Sie den Wert unter „E-Mail-Adresse des Dienstkontos“.

      • Die E-Mail-Adresse lautet PROJECT_NUM@cloudbuild.gserviceaccount.com.
    3. Kehren Sie zu Secret Manager zurück, klicken Sie auf den Tab Berechtigung und dann auf Hinzufügen.

      • Neue Hauptkonten: PROJECT_NUM@cloudbuild.gserviceaccount.com
      • Rolle: Zugriffsperson für Secret Manager-Secret
    4. Klicken Sie auf Speichern.

GitHub empfiehlt, eine Ablaufzeit für persönliche Zugriffstokens festzulegen und E-Mail-Benachrichtigungen zu senden, wenn Tokens ablaufen. Wenn Sie weiterhin Bereitstellungsvorschauen verwenden, erstellen Sie eine neue Version von github_token, wenn Sie Ihr Token neu generieren. Der Builder im nächsten Schritt ruft die neueste Version des Tokens ab, sodass die Vorschauen weiterhin funktionieren.

Neues Image für Cloud Build erstellen

Das Skript, das die Benachrichtigung „Deployment Preview“ in die Pull-Anfrage schreibt, befindet sich in den Python-Dokumentbeispielen. Statt dieses Skript in Ihren Quellcode aufzunehmen, können Sie es optional in einen Container innerhalb Ihres Projekts einbinden und diesen Container als Schritt in Ihrer Cloud Build-Konfiguration ausführen.

Die folgende Anleitung lässt sich entweder mit Cloud Shell oder mit Ihrem lokalen Computer ausführen, wenn Sie git und das Google Cloud CLI installiert sowie konfiguriert haben. In der folgenden Anleitung werden beide Vorgehensweisen beschrieben.

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Konfigurieren Sie die Google Cloud CLI so, dass Ihr Projekt verwendet wird. Ersetzen Sie dabei PROJECT_ID durch Ihre Projekt-ID:
    export PROJECT_ID=PROJECT_ID
    gcloud config set project $PROJECT_ID
    
    Wenn Sie Cloud Shell verwenden, müssen Sie möglicherweise die Google Cloud CLI autorisieren, um einen Google Cloud API-Aufruf durchzuführen. Klicken Sie auf Autorisieren, um diese Aktion fortzusetzen.
  3. Erstellen Sie ein neues Container-Image:
    git clone https://github.com/GoogleCloudPlatform/python-docs-samples
    cd python-docs-samples/
    gcloud builds submit --tag gcr.io/$PROJECT_ID/deployment-previews run/deployment-previews
    
  4. Prüfen Sie, ob der Container erstellt wurde:
    gcloud container images list
    
  5. Entfernen Sie das geklonte Repository:
    cd ..
    rm -rf python-docs-samples
    

Neue Cloud Build-Konfiguration hinzufügen

Ihr Repository enthält bereits eine Datei cloudbuild.yaml, die in Ihrem Hauptzweig verwendet wird. Sie erstellen nun eine neue Konfiguration für diesen neuen Trigger.

  1. Klicken Sie auf der GitHub-Repository-Seite auf Datei hinzufügen > Neue Datei erstellen.

    1. Benennen Sie die neue Datei mit cloudbuild-preview.yaml.
    2. Kopieren Sie den folgenden Code und fügen Sie ihn der neuen Datei hinzu:
    steps:
      - id: "build image"
        name: "gcr.io/cloud-builders/docker"
        args:
          [
            "build",
            "-t",
            "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}:${_PR_NUMBER}-${SHORT_SHA}",
            ".",
          ]
    
      - id: "push image"
        name: "gcr.io/cloud-builders/docker"
        args:
          [
            "push",
            "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}:${_PR_NUMBER}-${SHORT_SHA}",
          ]
    
      - id: "deploy revision with tag"
        name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
        entrypoint: "gcloud"
        args:
          [
            "run",
            "deploy",
            "${_SERVICE_NAME}",
            "--platform",
            "managed",
            "--region",
            "${_REGION}",
            "--image",
            "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}:${_PR_NUMBER}-${SHORT_SHA}",
            "--tag",
            "pr-${_PR_NUMBER}",
            "--no-traffic",
          ]
    
      - id: "link revision on pull request"
        name: "us-central1-docker.pkg.dev/$PROJECT_ID/containers/deployment-previews" # our custom builder
        secretEnv: ["GITHUB_TOKEN"]
        args:
          [
            "set",
            "--project-id",
            "${PROJECT_ID}",
            "--region",
            "${_REGION}",
            "--service",
            "${_SERVICE_NAME}",
            "--pull-request",
            "${_PR_NUMBER}",
            "--repo-name",
            "${REPO_FULL_NAME}",
            "--commit-sha",
            "${SHORT_SHA}",
          ]
    
    substitutions:
      _SERVICE_NAME: myservice
      _REGION: us-central1
    
    options:
      dynamicSubstitutions: true
      logging: CLOUD_LOGGING_ONLY
    
    availableSecrets:
      secretManager:
        - versionName: projects/$PROJECT_ID/secrets/github_token/versions/latest
          env: "GITHUB_TOKEN"
  2. Übernehmen Sie die Änderung in den Hauptzweig Ihres Repositorys.

Sekundären Trigger erstellen

Nachdem die grundlegenden Elemente vorhanden sind, erstellen Sie jetzt den neuen Trigger.

  1. Erstellen Sie einen neuen Cloud Build-Trigger (siehe vollständige Anleitung):

    1. Rufen Sie in der Google Cloud Console die Seite Cloud Build-Trigger auf.

      Zur Seite „Cloud Build-Trigger“

    2. Klicken Sie auf Trigger erstellen.

    3. Geben Sie die folgenden Informationen ein:

      • Name: preview-deploy
      • Ereignis: Pull-Anfrage
      • Quell-Repository: "GITHUB_USER_NAME/helloworld-python"
      • Basis-Branch: ^main$
      • Kommentarsteuerung: Erforderlich, außer für Inhaber und Mitbearbeiter
        • Für Inhaber des Repositorys werden Vorschauen automatisch auf der Basis der von ihnen erstellten Pull-Anfragen erstellt.
        • Wenn Sie die Vorschau von Änderungen für alle Nutzer zulassen möchten, informieren Sie sich über die Sicherheitsanforderungen bei Auswahl von „Nicht erforderlich“.
      • Konfiguration: Cloud Build-Konfigurationsdatei
      • Speicherort der Cloud Build-Konfigurationsdatei: cloudbuild-preview.yaml
    4. Klicken Sie auf Erstellen.

Erfolgreiche Trigger-Ausführung prüfen

Da dieser neue Trigger ausgelöst wird, wenn eine neue Pull-Anfrage erstellt wird, müssen Sie eine solche Anfrage erstellen, um diesen zu testen.

  1. Wechseln Sie dazu zu Ihrem Repository und nehmen Sie eine visuelle Änderung an app.py in einem neuen Zweig vor:
    1. Rufen Sie app.py auf und klicken Sie auf das Stiftsymbol ().
      GitHub-Schnittstelle zum Bearbeiten von Dateien auf der Website
    2. Nehmen Sie eine Änderung vor. Ersetzen Sie z. B. „Hello“ durch „Greetings“.
    3. Wählen Sie Neuen Branch für diesen Commit erstellen und Pull-Anfrage starten aus und klicken Sie auf Änderung vorschlagen.
  2. Erstellen Sie eine neue Pull-Anfrage mit diesem Zweig.

    Wenn der Trigger ordnungsgemäß konfiguriert wurde, wird kurz nach der Erstellung der Pull-Anfrage eine neue Prüfung angezeigt:

    GitHub-Schnittstelle mit einer ausstehenden Prüfung
  3. Der Name der Prüfung besteht aus dem Namen des Triggers und Ihrer Projekt-ID. Prüfen Sie die Ausführung des Builds. Klicken Sie dazu auf Details > Weitere Details in Google Cloud Build anzeigen.

    Wenn Ihr Trigger fehlschlägt und Sie den Build noch einmal senden müssen oder wenn Sie eine weitere Änderung an der Pull-Anfrage vornehmen möchten, müssen Sie ein Commit für die Änderung im selben Zweig ausführen. Jedes neue Commit für eine Pull-Anfrage löst einen neuen Build aus.

  4. Wenn der Trigger ausgeführt wurde, wird für die Pull-Anfrage eine neue Statusprüfung mit dem Namen Deployment Preview angezeigt. Das angezeigte Symbol ist Ihr Avatar, da Ihr Konto der Inhaber des verwendeten Tokens ist:

    GitHub-Schnittstelle mit ausgeführter Prüfung
  5. Klicken Sie auf Details, um die Vorschau aufzurufen. Die angezeigte URL entspricht der ursprünglichen Dienst-URL, hat jedoch das Präfix "pr-1---".

    Vorschau des bereitgestellten Cloud Run-Dienstes mit „Greetings World!“

    Hinweis: Wenn Sie die ursprüngliche Dienst-URL aufrufen, wird der ursprüngliche Inhalt angezeigt:

    Ursprünglich bereitgestellter Cloud Run-Dienst, mit dem weiterhin „Hello World!“ angezeigt wird
  6. Sehen Sie sich die Überarbeitungsliste für Ihren Dienst an, um den Dienststatus in Cloud Run zu prüfen. Es gibt jetzt zwei Überarbeitungen, die Traffic bereitstellen: die ursprüngliche Version und die Vorschau:

    Screenshot der Cloud Run-Konsole mit zwei aktiven Überarbeitungen
  7. Nehmen Sie weitere Änderungen an der Pull-Anfrage vor und fügen Sie dazu dem Zweig neue Commits hinzu. Bei jedem Commit wird der Trigger preview-deploy ausgelöst. Dadurch wird eine neue Überarbeitung des Dienstes erstellt und diese unter derselben URL verfügbar gemacht:

    Cloud Run-Konsole mit drei Überarbeitungen
  8. Wenn Sie nun bereit sind, die Änderungen zusammenzuführen, klicken Sie auf Pull-Anfrage zusammenführen. Der ursprüngliche Trigger prod-deploy wird ausgeführt und die Änderungen aus der Pull-Anfrage werden in der ursprünglichen URL berücksichtigt:

    Neu bereitgestellter Cloud Run-Dienst mit „Greetings World!“

    Die neue Überarbeitung stellt 100 % des Traffics zur Haupt-URL bereit. Die Vorschau-URL der Pull-Anfrage ist aber nach wie vor mit dem neuesten Commit für diese Pull-Anfrage verknüpft, sodass der Link weiterhin funktioniert:

    Cloud Run-Konsole mit vier Überarbeitungen

Beschränkungen

Die Anzahl der Überarbeitungs-URLs, die erstellt werden können, ist begrenzt. Wenn Sie davon ausgehen, dass Ihr Repository mehr als 1.000 Pull-Anfragen enthält, sollten Sie einen Vorgang zum Bereinigen von Tags ausführen, wie in cloudbuild-cleanup.yaml gezeigt.

Code verstehen

cloudbuild.yaml

Dieser Code basiert auf der Beispieldatei cloudbuild.yaml, die von Cloud Build bereitgestellt wird, mit einer speziellen Aktualisierung: der vierte Schritt, der update-traffic ausführt.

steps:
  - id: "build image"
    name: "gcr.io/cloud-builders/docker"
    args:
      [
        "build",
        "-t",
        "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}",
        ".",
      ]

  - id: "push image"
    name: "gcr.io/cloud-builders/docker"
    args:
      [
        "push",
        "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}",
      ]

  - id: "deploy prod service"
    name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
    entrypoint: "gcloud"
    args:
      [
        "run",
        "deploy",
        "${_SERVICE_NAME}",
        "--platform",
        "managed",
        "--region",
        "${_REGION}",
        "--allow-unauthenticated",
        "--image",
        "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}",
      ]

  # Force the new revision to serve 100% of traffic.
  - id: "ensure prod service live"
    name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
    entrypoint: "gcloud"
    args:
      [
        "run",
        "services",
        "update-traffic",
        "${_SERVICE_NAME}",
        "--to-latest",
        "--platform",
        "managed",
        "--region",
        "${_REGION}",
      ]

substitutions:
  _SERVICE_NAME: myservice
  _REGION: us-central1

options:
  logging: CLOUD_LOGGING_ONLY

Durch die Konfigurationen in cloudbuild.yaml werden Änderungen an der Trafficaufteilung vorgenommen. Der Parameter --to-latest bietet die gleiche Funktionalität wie das Kästchen Diese Überarbeitung sofort bereitstellen auf der Cloud Run-Seite. Dieser garantiert, dass die Überarbeitung des Dienstes sofort 100 % des Traffics bereitstellt.

cloudbuild-preview.yaml

steps:
  - id: "build image"
    name: "gcr.io/cloud-builders/docker"
    args:
      [
        "build",
        "-t",
        "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}:${_PR_NUMBER}-${SHORT_SHA}",
        ".",
      ]

  - id: "push image"
    name: "gcr.io/cloud-builders/docker"
    args:
      [
        "push",
        "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}:${_PR_NUMBER}-${SHORT_SHA}",
      ]

  - id: "deploy revision with tag"
    name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
    entrypoint: "gcloud"
    args:
      [
        "run",
        "deploy",
        "${_SERVICE_NAME}",
        "--platform",
        "managed",
        "--region",
        "${_REGION}",
        "--image",
        "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}:${_PR_NUMBER}-${SHORT_SHA}",
        "--tag",
        "pr-${_PR_NUMBER}",
        "--no-traffic",
      ]

  - id: "link revision on pull request"
    name: "us-central1-docker.pkg.dev/$PROJECT_ID/containers/deployment-previews" # our custom builder
    secretEnv: ["GITHUB_TOKEN"]
    args:
      [
        "set",
        "--project-id",
        "${PROJECT_ID}",
        "--region",
        "${_REGION}",
        "--service",
        "${_SERVICE_NAME}",
        "--pull-request",
        "${_PR_NUMBER}",
        "--repo-name",
        "${REPO_FULL_NAME}",
        "--commit-sha",
        "${SHORT_SHA}",
      ]

substitutions:
  _SERVICE_NAME: myservice
  _REGION: us-central1

options:
  dynamicSubstitutions: true
  logging: CLOUD_LOGGING_ONLY

availableSecrets:
  secretManager:
    - versionName: projects/$PROJECT_ID/secrets/github_token/versions/latest
      env: "GITHUB_TOKEN"

Dieser Code entspricht cloudbuild.yaml, enthält jedoch zusätzliche Schritte:

  1. Nachdem Sie das Dienst-Image erstellt und per Push übertragen haben, stellt cloudbuild-preview.yaml den Dienst mit dem Flag --no-traffic bereit. Dies führt dazu, dass diese Überarbeitung, auch wenn sie die neueste Überarbeitung ist, nicht für das Bereitstellen von Traffic verwendet wird.

  2. cloudbuild-preview.yaml fügt ein benutzerdefiniertes Tag anhand der Pull-Anfragenummer hinzu. Das ist in diesem Fall ein String mit dem Präfix „pr-“ und der Nummer der Pull-Anfrage am Ende.

    An diesem Punkt funktioniert die Überarbeitungs-URL. Allerdings kann die Person, die die Pull-Anfrage gesendet hat, dies nicht feststellen. Cloud Build-Logs sind in GitHub selbst nicht sichtbar, sondern nur ein Link zu den Logs. Die Logs können nur von authentifizierten Nutzern des Cloud Build-Projekts mit den erforderlichen Berechtigungen eingesehen werden.

  3. cloudbuild-preview.yaml führt das Skript check_status.py mithilfe von integrierten Substitutionsparametern aus, die von Cloud Build bereitgestellt werden. Einige dieser Parameter stehen bei der Nutzung von GitHub-Repositories zur Verfügung, wie etwa die Pull-Anfragenummer, den Repository-Namen und das Commit-SHA.

Um diesen Trigger noch einmal auszuführen, senden Sie einen weiteren Commit nach GitHub. Dieser Trigger kann auf der Cloud Build-Seite der Console nicht noch einmal ausgeführt werden.

cloudbuild-cleanup.yaml


steps:
  - id: "build image"
    name: "gcr.io/cloud-builders/docker"
    args:
      [
        "build",
        "-t",
        "us-central1-docker.pkg.dev/${PROJECT_ID}/containers/${_SERVICE_NAME}",
        ".",
      ]

  - id: "push image"
    name: "gcr.io/cloud-builders/docker"
    args:
      [
        "push",
        "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}",
      ]

  - id: "deploy prod service"
    name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
    entrypoint: "gcloud"
    args:
      [
        "run",
        "deploy",
        "${_SERVICE_NAME}",
        "--platform",
        "managed",
        "--region",
        "${_REGION}",
        "--allow-unauthenticated",
        "--image",
        "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}",
      ]

  # Force the new revision to serve 100% of traffic.
  - id: "ensure prod service live"
    name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
    entrypoint: "gcloud"
    args:
      [
        "run",
        "services",
        "update-traffic",
        "${_SERVICE_NAME}",
        "--to-latest",
        "--platform",
        "managed",
        "--region",
        "${_REGION}",
      ]

  # Cleanup tags against closed pull requests
  - id: "clean up old tag"
    name: "us-central1-docker.pkg.dev/${PROJECT_ID}/containers/deployment-previews" # our custom builder
    secretEnv: ["GITHUB_TOKEN"]
    args:
      [
        "cleanup",
        "--project-id",
        "${PROJECT_ID}",
        "--region",
        "${_REGION}",
        "--service",
        "${_SERVICE_NAME}",
        "--repo-name",
        "${REPO_FULL_NAME}",
      ]

substitutions:
  _SERVICE_NAME: myservice
  _REGION: us-central1

options:
  dynamicSubstitutions: true
  logging: CLOUD_LOGGING_ONLY

availableSecrets:
  secretManager:
    - versionName: projects/$PROJECT_ID/secrets/github_token/versions/latest
      env: "GITHUB_TOKEN"

Dieser Code ist eine Alternative zu cloudbuild.yaml mit zusätzlichen Bereinigungsfunktionen. Die ersten Schritte führen das Deployment aus und die Funktionalität soll dann so erweitert werden:

  1. Ermitteln Sie mithilfe der Discovery API und den GitHub APIs, welche Tags des Dienstes für geschlossene Pull-Anfragen gelten. Es muss mindestens die zusammengeführte Pull-Anfrage vorhanden sein, die diesen Trigger auslöst.

  2. Löschen Sie die ermittelten Tags.

check_status.py

def set(
    dry_run: str,
    project_id: str,
    region: str,
    service: str,
    repo_name: str,
    commit_sha: str,
    pull_request: str,
) -> None:
    """Set a status on a GitHub commit to a specific revision URL"""
    service_obj = get_service(project_id, region, service)
    revision_url = get_revision_url(service_obj, tag=make_tag(pull_request))

    ghtoken = os.environ.get("GITHUB_TOKEN", None)

    if not ghtoken:
        raise ValueError("GITHUB_TOKEN not defined.")

    try:
        repo = github.Github(ghtoken).get_repo(repo_name)
    except GithubException as e:
        error(
            e.data["message"],
            context=f"finding repo {repo_name}. Is it a private repo, and does your token have the correct permissions?",
        )

    try:
        commit = repo.get_commit(sha=commit_sha)
    except GithubException as e:
        error(e.data["message"], context=f"finding commit {commit_sha}")

    # ...

    commit.create_status(
        state="success",
        target_url=revision_url,
        context=f"Deployment Preview for {service}",
        description="Your preview is now available.",
    )
    click.secho("Success: ", fg="green", bold=True, nl=False)
    click.echo(
        f"Status created on {repo_name}, commit {commit.sha[:7]}, "
        f"linking to {revision_url} on service {service_obj['metadata']['name']}"
    )

Das Skript check_status.py übernimmt die bereitgestellten Informationen zum Cloud Run-Dienst, zum GitHub-Repository sowie zum Commit und führt dann die folgenden Vorgänge aus:

  • Rufen Sie den Dienstnamen, das Tag und die Überarbeitungs-URL mit dem Google API-Python-Client ab.
  • Rufen Sie das GitHub-Token aus der von Secret Manager bereitgestellten Umgebungsvariable ab.
  • Erstellen eines Status für das betreffende Commit durch Verknüpfen mit der abgerufenen Überarbeitungs-URL mithilfe der GitHub-Client-API für Python

Bereinigen

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. Löschen Sie außerdem die für die Anleitung erstellten GitHub-Konfigurationen.

Projekt löschen

Am einfachsten vermeiden Sie weitere Kosten, wenn Sie das zum Ausführen der Anleitung erstellte Projekt löschen.

So löschen Sie das Projekt:

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Anleitungsressourcen löschen

  1. Löschen Sie den Cloud Run-Dienst, den Sie in dieser Anleitung bereitgestellt haben:

    1. Rufen Sie die Cloud Run-Konsole auf.
    2. Wählen Sie den Eintrag „myservice“ aus und klicken Sie auf Löschen.
    3. Klicken Sie im Dialogfeld zur Bestätigung auf Löschen.
  2. Löschen Sie sonstige Google Cloud-Ressourcen, die in dieser Anleitung erstellt wurden:

Konfigurationen der Anleitung löschen

Um die Konfigurationen in GitHub zu bereinigen, müssen Sie die Google Cloud Build-Anwendung aus GitHub entfernen:

  1. Rufen Sie die Einstellungen der GitHub-Anwendung auf.
  2. Klicken Sie in der Liste Google Cloud Build auf Konfigurieren.
  3. Klicken Sie im Abschnitt Gefahrenbereich auf Deinstallieren.
  4. Klicken Sie im Dialogfeld zur Bestätigung auf OK.

Löschen Sie außerdem das erstellte GitHub-Token:

  1. Rufen Sie die Seite mit den persönlichen GitHub-Zugriffstokens auf.
  2. Klicken Sie in der Liste preview-deploy auf Löschen.
  3. Klicken Sie im Dialogfeld zur Bestätigung auf Ich verstehe die Auswirkungen, dieses Token löschen.

Außerdem müssen Sie das GitHub-Repository löschen:

  1. Wechseln Sie zu Ihrem erstellten GitHub-Repository und klicken Sie auf den Tab „Einstellungen“.
  2. Klicken Sie im Abschnitt Gefahrenbereich auf Dieses Repository löschen.
  3. Geben Sie im Dialogfeld zur Bestätigung den vollständigen Namen des Repositorys ein und klicken Sie auf Ich verstehe die Auswirkungen, dieses Repository löschen.

Nächste Schritte