Releases mit Cloud Deploy

1. Ziele

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, in der die Reihenfolge der Schritte für die Bereitstellung in diesen Zielen definiert wird.

Der Bereitstellungsablauf wird durch eine Cloud Build-Pipeline ausgelöst, die einen Cloud Deploy-Release erstellt und die Bereitstellung im Vorschaucluster ausführt. Nachdem Sie bestätigt haben, dass die Bereitstellung in der Vorschau erfolgreich war und wie erwartet funktioniert, stufen Sie die Version manuell im Canary-Cluster hoch. Die Promotion der Version im Produktionscluster erfordert eine Genehmigung. Sie genehmigen die Produktionspipeline in der Cloud Deploy-UI und führen dann die Promotion durch.

Die Ziele dieser Anleitung lassen sich in die folgenden Schritte unterteilen:

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

Umgebung zum selbstbestimmten Lernen einrichten

  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 eines erstellen.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Der Projektname ist der Anzeigename für die Teilnehmer dieses Projekts. Es handelt sich um einen String, der nicht von Google APIs verwendet wird und den Sie jederzeit aktualisieren können.
  • Die Projekt-ID muss für alle Google Cloud-Projekte eindeutig sein und ist unveränderlich (kann nach der Festlegung nicht mehr geändert werden). In der Cloud Console wird automatisch ein eindeutiger String generiert. Normalerweise ist es nicht wichtig, wie dieser aussieht. In den meisten Codelabs müssen Sie auf die Projekt-ID verweisen (die in der Regel als PROJECT_ID angegeben wird). Wenn Ihnen die ID nicht gefällt, können Sie eine andere zufällige ID generieren oder eine eigene ID ausprobieren und sehen, ob sie verfügbar ist. Nachdem das Projekt erstellt wurde, wird es „eingefroren“.
  • Es gibt einen dritten Wert, die Projektnummer, die von einigen APIs verwendet wird. Weitere Informationen zu diesen drei Werten
  1. Als Nächstes müssen Sie die Abrechnung in der Cloud Console aktivieren, um Cloud-Ressourcen/-APIs verwenden zu können. Die Durchführung dieses Codelabs sollte keine oder nur geringe Kosten verursachen. Wenn Sie Ressourcen herunterfahren möchten, damit nach Abschluss dieses Codelabs keine Gebühren anfallen, folgen Sie den Bereinigungsanweisungen am Ende des Codelabs. Neue Nutzer von Google Cloud kommen für das Programm für kostenlose Testversionen mit einem Guthaben von 300$ infrage.

2. Plattform einrichten

Arbeitsbereich vorbereiten

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

  1. gcloud-Konfigurationsstandardeinstellungen 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 mit dem folgenden Befehl in Cloud Shell eine Datei mit dem Namen „preview.yaml“ im Bereitstellungsverzeichnis:

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 mit dem folgenden Befehl in Cloud Shell eine Datei namens „canary.yaml“ im Bereitstellungsverzeichnis:

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 mit dem folgenden Befehl in Cloud Shell eine Datei namens „prod.yaml“ im Bereitstellungsverzeichnis:

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 das Tag „requireApproval“, das auf „true“ gesetzt ist. Die Promotion in das Produktionsziel ist erst möglich, wenn die Genehmigung erteilt wurde. Sie benötigen die Rolle „roles/clouddeploy.approver“, um eine Version zu genehmigen.

  1. Deploy-Ziele 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 des Einrichtungsprozesses für eine neue App. Für jede neue Anwendung wird eine Bereitstellungspipeline konfiguriert.

Cloud Deploy-Pipeline definieren

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

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 ist, für die diese Lieferpipeline 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 render“ beim Erstellen des Releases.

  1. Pipeline anwenden

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

4. Entwicklungsphase

Während die Anwendungen entwickelt werden, werden Assets durch automatisierte 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. Release-Phase

Am Ende des CICD-Prozesses, in der Regel wenn der Code für die Produktion getaggt ist, starten Sie den Releaseprozess durch Aufrufen des Befehls cloud deploy release. Sobald die Bereitstellung validiert und genehmigt wurde, verschieben Sie den Release durch 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 in ein GitHub-Repository mit einer Beispiel-Go-Anwendung übertragen. Wir verwenden Cloud Deploy, um das Release dieser Anwendung durchzuführen.

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 überprüfen

Wenn ein Cloud Deploy-Release erstellt wird, wird er automatisch im ersten Ziel (Vorschau) eingeführt.

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

Auf diesem Bildschirm sehen Sie eine grafische Darstellung Ihrer Pipeline.

  1. Prüfen Sie, ob sich auf der linken Seite des Vorschaufensters ein grüner Rahmen befindet. Das bedeutet, dass der Release in dieser Umgebung bereitgestellt wurde.
  2. Optional können Sie sich weitere Details zur Veröffentlichung ansehen, indem Sie im unteren Bereich des Bildschirms unter „Release Details“ (Release-Details) auf den Namen des Releases klicken.
  3. Prüfen Sie, ob die Anwendung mit dem Release erfolgreich bereitgestellt wurde, indem Sie den folgenden Befehl in Cloud Shell ausführen:

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 rechts oben auf dem Bildschirm auf das Symbol für die Webvorschau.
  2. „Vorschau auf Port 8080“ auswählen

Sie werden auf eine neue Seite weitergeleitet, auf der die Meldung „Hello World!“ angezeigt wird.

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

Release hochstufen

Nachdem Ihr Release im ersten Ziel (Vorschau) in der Pipeline bereitgestellt wurde, können Sie es 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

Release-Promotion überprüfen

  1. Pipeline für die Beispiel-App in der Google Cloud Console aufrufen
  2. Prüfen Sie, ob links neben dem Canary-Kästchen ein grüner Rahmen 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 rechts oben auf dem Bildschirm auf das Symbol für die Webvorschau.
  2. „Vorschau auf Port 8080“ auswählen

Sie werden auf eine neue Seite weitergeleitet, auf der die Meldung „Hello World!“ angezeigt wird.

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

Produktionsrelease genehmigen

Als wir das Produktionsziel über prod.yaml erstellt haben, haben wir das Tag „requireApproval“ auf „true“ gesetzt. Dadurch wird eine Genehmigung für die Hochstufung in der Produktionsumgebung 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. Pipeline für die Beispiel-App in der Google Cloud Console aufrufen
  2. Beachten Sie die gelbe Anzeige mit dem Hinweis „1 ausstehend“.

Diese Meldung weist darauf hin, 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 dem gelben Hinweis 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 Pipeline-Seite der Beispiel-App zurück. Dort sehen Sie, dass die Veröffentlichung in der Produktion läuft.

Produktionsrelease überprüfen

Wie bei den anderen Umgebungen können Sie die Bereitstellung nach Abschluss mit den folgenden Schritten überprüfen.

  1. Führen Sie den folgenden Befehl in Cloud Shell 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 rechts oben auf dem Bildschirm auf das Symbol für die Webvorschau.
  2. „Vorschau auf Port 8080“ auswählen

Sie werden auf eine neue Seite weitergeleitet, auf der die Meldung „Hello World!“ angezeigt wird.

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