Releases mit Cloud Deploy

1. Lernziele

In dieser Anleitung erstellen Sie drei GKE-Cluster mit den Namen „preview“, „canary“ und „prod“. Anschließend erstellen Sie für jeden Cluster ein Cloud Deploy-Ziel und eine Cloud Deploy-Pipeline, die die Abfolge der Schritte für die Bereitstellung in diesen Zielen definiert.

Der Bereitstellungsablauf wird durch eine Cloud Build-Pipeline ausgelöst, die ein Cloud Deploy-Release erstellt und die Bereitstellung im Vorschaucluster durchführt. Nachdem Sie überprüft haben, dass die Bereitstellung in der Vorschau erfolgreich war und wie erwartet funktioniert, stufen Sie die Version manuell im Canary-Cluster hoch. Die Freigabe der Version im Prod-Cluster erfordert eine Genehmigung. Sie genehmigen die Prod-Pipeline in der Cloud Deploy-Benutzeroberfläche und führen dann die Freigabe durch.

Die Ziele dieser Anleitung können in die folgenden Schritte unterteilt werden:

  • Arbeitsbereich vorbereiten
  • Cloud Deploy-Ziele definieren
  • Cloud Deploy-Pipeline definieren
  • Release erstellen
  • Bereitstellung hochstufen
  • Produktionsrelease genehmigen

Einrichten der Umgebung im eigenen Tempo

  1. Melden Sie sich in der Google Cloud Console an und erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes. Wenn Sie noch kein Gmail- oder Google Workspace-Konto haben, müssen Sie ein Konto erstellen.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Der Projektname ist der Anzeigename für die Teilnehmer dieses Projekts. Es handelt sich um einen Zeichenstring, der nicht von Google APIs verwendet wird. Sie können ihn jederzeit aktualisieren.
  • Die Projekt-ID muss für alle Google Cloud-Projekte eindeutig sein und kann nach der Festlegung nicht mehr geändert werden. Die Cloud Console generiert automatisch einen eindeutigen String. In den meisten Codelabs müssen Sie auf die Projekt-ID verweisen, die normalerweise als PROJECT_ID gekennzeichnet ist. Wenn Ihnen die ID nicht gefällt, generieren Sie eine andere zufällige ID oder versuchen Sie, Ihre eigene zu verwenden und prüfen Sie, ob sie verfügbar ist. Nach dem Erstellen des Projekts wird es „eingefroren“.
  • Es gibt einen dritten Wert, die Projektnummer, die von einigen APIs verwendet wird. Weitere Informationen zu diesen drei Werten finden Sie in der Dokumentation.
  1. Als Nächstes müssen Sie die Abrechnung in der Cloud Console aktivieren, um Cloud-Ressourcen/-APIs verwenden zu können. Die Ausführung dieses Codelabs sollte nur wenige Kosten verursachen, wenn überhaupt. Wenn Sie die Ressourcen herunterfahren möchten, damit keine Kosten über diese Anleitung hinaus anfallen, folgen Sie der Anleitung zum Bereinigen am Ende des Codelabs. Neuen Nutzern der Google Cloud Platform steht das kostenlose Testprogramm mit einem Guthaben von 300$ zur Verfügung.

2. Plattformeinrichtung

Arbeitsbereich vorbereiten

Hier richten wir die Umgebung ein, die für die Ausführung dieser Anleitung erforderlich ist. Nach Abschluss dieses Schritts haben wir einen GKE-Cluster erstellt, in dem wir die Bereitstellungen ausführen können.

  1. gcloud config-Standardeinstellungen festlegen

gcloud config set project <your project>

gcloud config set deploy/region us-central1

  1. Repository klonen

git clone https://github.com/gushob21/software-delivery-workshop

cd software-delivery-workshop/labs/cloud-deploy/

cloudshell workspace .

rm -rf deploy && mkdir deploy

  1. Umgebungsvariablen festlegen

export PROJECT_ID=$(gcloud config get-value project)

export PROJECT_NUMBER=$(gcloud projects list --filter="$PROJECT_ID" --format="value(PROJECT_NUMBER)")

  1. APIs aktivieren

gcloud services enable \

cloudresourcemanager.googleapis.com \

    `container.googleapis.com \`

    `cloudbuild.googleapis.com \`

    `containerregistry.googleapis.com \`

    `secretmanager.googleapis.com \`

    `clouddeploy.googleapis.com` 
  1. GKE-Cluster erstellen
     `gcloud container clusters create preview \`
    

--zone=us-central1-a --async

    `gcloud container clusters create canary \`

--zone=us-central1-b --async

    `gcloud container clusters create prod \`

--zone=us-central1-c

Cloud Deploy-Ziele definieren

  1. Erstellen Sie im Verzeichnis „deploy“ mit dem folgenden Befehl in Cloud Shell eine Datei namens „preview.yaml“:

cat <<EOF >deploy/preview.yaml

apiVersion: deploy.cloud.google.com/v1beta1

kind: Target

metadata:

name: preview

annotations: {}

labels: {}

description: Target for preview environment

gke:

cluster: projects/$PROJECT_ID/locations/us-central1-a/clusters/preview

EOF

    As you noticed, the "kind" tag is "Target". It allows us to add some metadata to the target, a description and finally the GKE cluster where the deployment is supposed to happen for this target.
  1. Erstellen Sie im Verzeichnis „deploy“ mit dem folgenden Befehl in Cloud Shell eine Datei namens „canary.yaml“:

cat <<EOF >deploy/canary.yaml

apiVersion: deploy.cloud.google.com/v1beta1

kind: Target

metadata:

name: canary

annotations: {}

labels: {}

description: Target for canary environment

gke:

cluster: projects/$PROJECT_ID/locations/us-central1-b/clusters/canary

EOF

  1. Erstellen Sie im Verzeichnis „deploy“ mit dem folgenden Befehl in Cloud Shell eine Datei namens „prod.yaml“:

cat <<EOF >deploy/prod.yaml

apiVersion: deploy.cloud.google.com/v1beta1

kind: Target

metadata:

name: prod

annotations: {}

labels: {}

description: Target for prod environment

requireApproval: true

gke:

cluster: projects/$PROJECT_ID/locations/us-central1-c/clusters/prod

EOF

Beachten Sie, dass das Tag „requireApproval“ auf „true“ gesetzt ist. Die Promotion kann erst nach der Genehmigung auf das Produktionsziel angewendet werden. Sie benötigen die Rolle „roles/clouddeploy.approver“, um eine Version zu genehmigen.

  1. Bereitstellungsziele erstellen
         `gcloud config set deploy/region us-central1` 
    

gcloud beta deploy apply --file deploy/preview.yaml

gcloud beta deploy apply --file deploy/canary.yaml

gcloud beta deploy apply --file deploy/prod.yaml

3. App-Erstellung

Im Rahmen der Erstellung einer neuen Anwendung wird die CICD-Pipeline in der Regel so eingerichtet, dass automatische Builds, Integrationstests und Bereitstellungen durchgeführt werden. Die folgenden Schritte sind Teil der Einrichtung einer neuen App. Für jede neue Anwendung wird eine Bereitstellungspipeline konfiguriert.

Cloud Deploy-Pipeline definieren

  1. Erstellen Sie im Verzeichnis „deploy“ mit dem folgenden Befehl in Cloud Shell eine Datei namens „pipeline.yaml“:

cat <<EOF >>deploy/pipeline.yaml

apiVersion: deploy.cloud.google.com/v1beta1

kind: DeliveryPipeline

metadata:

name: sample-app

labels:

`app: sample-app`

description: delivery pipeline

serialPipeline:

stages:

- targetId: preview

`profiles:`

`- preview`

- targetId: canary

`profiles:`

`- canary`

- targetId: prod

`profiles:`

`- prod`

EOF

    As you noticed, the "kind" tag is "DeliveryPipeline". It lets you define the metadata for the pipeline, a description and an order of deployment into various targets via serialPipeline tag.

Das serialPipeline-Tag enthält ein Tag namens „stages“, das eine Liste aller Ziele enthält, für die diese Bereitstellungspipeline konfiguriert wurde.

targetId gibt das spezifische Ziel an, das für diese Phase der Lieferpipeline verwendet werden soll. Der Wert ist das Attribut „metadata.name“ aus der Zieldefinition.

profiles ist eine Liste mit null oder mehr Skaffold-Profilnamen aus skaffold.yaml. Cloud Deploy verwendet das Profil mit Skaffold-Rendering beim Erstellen des Release.

  1. Pipeline anwenden

gcloud beta deploy apply --file deploy/pipeline.yaml

4. Entwicklungsphase

Während der Entwicklung der Anwendungen werden Assets mithilfe automatisierter CICD-Toolchains erstellt und gespeichert. Die folgenden Befehle werden ausgeführt, um die Anwendung mit skaffold zu erstellen und Assets für die Bereitstellung mit Cloud Deploy zu speichern. Dieser Schritt wird von Ihrem CICD-Prozess für jeden Anwendungs-Build ausgeführt.

  1. Anwendung mit skaffold erstellen und speichern

skaffold build \

--file-output=artifacts.json \

--default-repo gcr.io/$PROJECT_ID \

--push=true

5. Releasephase

Am Ende des CICD-Prozesses, in der Regel wenn der Code für die Produktion getaggt wurde, starten Sie den Release-Prozess durch Aufrufen des Befehls cloud deploy release. Nachdem die Bereitstellung validiert und genehmigt wurde, verschieben Sie den Release in die verschiedenen Zielumgebungen, indem Sie die Aktion über automatisierte Prozesse oder manuelle Genehmigungen hochstufen und genehmigen.

Release erstellen

Wir haben in dieser Anleitung bereits Cloud Deploy-Dateien erstellt, um die Funktionsweise von Cloud Deploy zu verstehen. Für die Demo haben wir dieselben Cloud Deploy-Dateien erstellt und sie in ein GitHub-Repository mit einer Beispiel-Go-Anwendung gepusht. Wir verwenden Cloud Deploy, um diese Anwendung zu veröffentlichen.

export REL_TIMESTAMP=$(date '+%Y%m%d-%H%M%S')

gcloud beta deploy releases create \

sample-app-release-${REL_TIMESTAMP} \

--delivery-pipeline=sample-app \

--description="Release demo" \

--build-artifacts=artifacts.json \

--annotations="release-id=rel-${REL_TIMESTAMP}"

Release prüfen

Wenn ein Cloud Deploy-Release erstellt wird, wird er automatisch im ersten Ziel bereitgestellt, also in der Vorschau.

  1. Rufen Sie in der Google Cloud Console <Cloud Deploy> auf.
  2. Klicken Sie auf „sample-app“.

Auf diesem Bildschirm sehen Sie eine grafische Darstellung Ihrer Pipeline.

  1. Prüfen Sie, ob links im Vorschaufeld ein grüner Umriss zu sehen ist. Das bedeutet, dass der Release in dieser Umgebung bereitgestellt wurde.
  2. Optional können Sie unter „Release-Details“ im unteren Bereich des Bildschirms auf den Release-Namen klicken, um weitere Details zur Veröffentlichung aufzurufen.
  3. Prüfen Sie, ob die Anwendung mit dem Release erfolgreich bereitgestellt wurde. Führen Sie dazu den folgenden Befehl in der Cloud Shell aus:

gcloud container clusters get-credentials preview --zone us-central1-a && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080

  1. Klicken Sie oben rechts auf dem Bildschirm auf das Symbol für die Webvorschau.
  2. Wählen Sie „Vorschau auf Port 8080“ aus.

Daraufhin wird eine neue Seite mit der Meldung „Hello World!“ angezeigt.

  1. Verwenden Sie ctrl+c im Terminal, um die Portweiterleitung zu beenden.

Release hochstufen

Nachdem Ihr Release im ersten Ziel (Vorabversion) in der Pipeline bereitgestellt wurde, können Sie ihn zum nächsten Ziel (Canary) hochstufen. Führen Sie den folgenden Befehl aus, um den Vorgang zu starten.

gcloud beta deploy releases promote \

--release=sample-app-release-${REL_TIMESTAMP} \

--delivery-pipeline=sample-app \

--quiet

Informationen zur Veröffentlichung prüfen

  1. Rufen Sie die Pipeline der Beispiel-App in der Google Cloud Console auf.
  2. Prüfen Sie, ob links neben dem Canary-Feld ein grüner Umriss zu sehen ist. Das bedeutet, dass die Version in dieser Umgebung bereitgestellt wurde.
  3. Prüfen Sie, ob die Anwendung korrekt bereitgestellt wurde, indem Sie einen Tunnel zu ihr erstellen.

gcloud container clusters get-credentials canary --zone us-central1-b && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080

  1. Klicken Sie oben rechts auf dem Bildschirm auf das Symbol für die Webvorschau.
  2. Wählen Sie „Vorschau auf Port 8080“ aus.

Daraufhin wird eine neue Seite mit der Meldung „Hello World!“ angezeigt.

  1. Verwenden Sie ctrl+c im Terminal, um die Portweiterleitung zu beenden.

Produktionsrelease genehmigen

Denken Sie daran, dass wir beim Erstellen des Produktionsziels über „prod.yaml“ das Tag „requireApproval“ auf „true“ festgelegt haben. Dadurch wird eine Genehmigung für die Werbung in der Produktion erzwungen.

  1. Stufen Sie den Canary-Release mit dem folgenden Befehl zur Produktion hoch:

gcloud beta deploy releases promote \

--release=sample-app-release-${REL_TIMESTAMP} \

--delivery-pipeline=sample-app \

--quiet

  1. Rufen Sie die Pipeline der Beispiel-App in der Google Cloud Console auf.
  2. Beachten Sie die gelbe Anzeige „1 ausstehend“.

Diese Meldung gibt an, dass ein Release für die Bereitstellung in der Produktion in der Warteschlange steht, aber noch geprüft und genehmigt werden muss.

  1. Klicken Sie direkt unter der gelben Benachrichtigung auf die Schaltfläche „Überprüfen“.
  2. Klicken Sie auf dem nächsten Bildschirm noch einmal auf „Überprüfen“, um den Genehmigungsbildschirm für die Produktion aufzurufen.
  3. Optional können Sie sich die Änderungen im Manifest-Diff ansehen. In diesem Fall eine ganz neue Datei.
  4. Klicken Sie auf die Schaltfläche „Genehmigen“.
  5. Kehren Sie zur Pipelineseite der Beispiel-App zurück. Dort sehen Sie, dass die Veröffentlichung in der Produktion in Bearbeitung ist.

Produktionsrelease prüfen

Wie bei den anderen Umgebungen können Sie die Bereitstellung nach Abschluss wie unten beschrieben prüfen.

  1. Führen Sie in Cloud Shell den folgenden Befehl aus, um die Portweiterleitung zu erstellen:

gcloud container clusters get-credentials prod --zone us-central1-c && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080

  1. Klicken Sie oben rechts auf dem Bildschirm auf das Symbol für die Webvorschau.
  2. Wählen Sie „Vorschau auf Port 8080“ aus.

Daraufhin wird eine neue Seite mit der Meldung „Hello World!“ angezeigt.

  1. Verwenden Sie ctrl+c im Terminal, um die Portweiterleitung zu beenden.