Lanzamiento con Cloud Deploy

1. Objetivos

En este instructivo, crearás tres clústeres de GKE llamados preview, canary y prod. Luego, crearás un destino de Cloud Deploy correspondiente a cada clúster y una canalización de Cloud Deploy que definirá la secuencia de pasos para realizar la implementación en esos destinos.

El flujo de implementación se activará mediante una canalización de Cloud Build que creará la versión de Cloud Deploy y realizará la implementación en el clúster de vista previa. Después de verificar que la implementación en la vista previa se realizó correctamente y funciona como se espera, promoverás manualmente la versión en el clúster canary. La promoción de la versión en el clúster prod requerirá aprobación. Aprobarás la canalización de prod en la IU de Cloud Deploy y, por último, la promoverás.

Los objetivos de este instructivo se pueden dividir en los siguientes pasos:

  • Prepara tu espacio de trabajo
  • Define los destinos de Cloud Deploy
  • Define la canalización de Cloud Deploy
  • Crea una versión
  • Promueve una implementación
  • Aprueba una versión de producción

Configuración del entorno de autoaprendizaje

  1. Accede a Google Cloud Console y crea un proyecto nuevo o reutiliza uno existente. Si aún no tienes una cuenta de Gmail o de Google Workspace, debes crear una.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • El Nombre del proyecto es el nombre visible de los participantes de este proyecto. Es una string de caracteres que no se utiliza en las API de Google y se puede actualizar en cualquier momento.
  • El ID del proyecto debe ser único en todos los proyectos de Google Cloud y es inmutable (no se puede cambiar después de configurarlo). Cloud Console genera automáticamente una string única, que, por lo general, no importa cuál sea. En la mayoría de los codelabs, debes hacer referencia al ID del proyecto (suele ser PROJECT_ID). Por lo tanto, si no te gusta, genera otro aleatorio o prueba con uno propio y comprueba si está disponible. Después de crear el proyecto, este ID se “congela” y no se puede cambiar.
  • Además, hay un tercer valor, el Número de proyecto, que usan algunas API. Obtén más información sobre estos tres valores en la documentación.
  1. A continuación, deberás habilitar la facturación en Cloud Console para usar las API o los recursos de Cloud. Ejecutar este codelab no debería costar mucho, tal vez nada. Si quieres cerrar los recursos para no se te facture más allá de este instructivo, sigue las instrucciones de “limpieza” que se encuentran al final del codelab. Los usuarios nuevos de Google Cloud son aptos para participar en el programa Prueba gratuita de USD 300.

2. Configuración de la plataforma

Prepara tu espacio de trabajo

Aquí configuraremos el entorno necesario para ejecutar este instructivo. Cuando se complete este paso, se creará un clúster de GKE en el que podremos ejecutar las implementaciones.

  1. Establece los valores predeterminados de la configuración de gcloud

gcloud config set project <your project>

gcloud config set deploy/region us-central1

  1. Clone el repositorio

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

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

cloudshell workspace .

rm -rf deploy && mkdir deploy

  1. Configura las variables de entorno

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

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

  1. Habilita las API

gcloud services enable \

cloudresourcemanager.googleapis.com \

    `container.googleapis.com \`

    `cloudbuild.googleapis.com \`

    `containerregistry.googleapis.com \`

    `secretmanager.googleapis.com \`

    `clouddeploy.googleapis.com` 
  1. Crea clústeres de GKE
     `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

Define los destinos de Cloud Deploy

  1. Crea un archivo en el directorio de implementación llamado preview.yaml con el siguiente comando en Cloud Shell:

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. Crea un archivo en el directorio de implementación llamado canary.yaml con el siguiente comando en Cloud Shell:

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. Crea un archivo en el directorio de implementación llamado prod.yaml con el siguiente comando en Cloud Shell:

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

Observa la etiqueta requireApproval, que se establece en true. Esto no permitirá la promoción al destino de prod hasta que se otorgue la aprobación. Necesitas el rol roles/clouddeploy.approver para aprobar una versión.

  1. Crea los destinos de implementación
         `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. Creación de la app

Como parte de la creación de una aplicación nueva, la canalización de CICD suele configurarse para realizar compilaciones, pruebas de integración y, también, implementaciones automáticas. Los siguientes pasos se consideran parte del proceso de configuración de una app nueva. Cada aplicación nueva tendrá configurada una canalización de implementación.

Define la canalización de Cloud Deploy

  1. Crea un archivo en el directorio de implementación llamado pipeline.yaml con el siguiente comando en Cloud Shell:

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.

La etiqueta serialPipeline contiene una etiqueta llamada stages, que es una lista de todos los destinos en los que se configura esta canalización de entrega para la implementación.

targetId identifica el destino específico que se usará para esta etapa de la canalización de entrega. El valor es la propiedad metadata.name de la definición de destino.

profiles es una lista de cero o más nombres de perfiles de Skaffold, de skaffold.yaml. Cloud Deploy usa el perfil con skaffold render cuando crea la versión.

  1. Aplica la canalización

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

4. Fase de desarrollo

A medida que se desarrollan las aplicaciones, las cadenas de herramientas de CICD automatizadas compilan y almacenan recursos. Se ejecutan los siguientes comandos para compilar la aplicación con Skaffold y almacenar recursos para la implementación con Cloud Deploy. Tu proceso de CICD realizará este paso para cada compilación de la aplicación.

  1. Compila y almacena la aplicación con Skaffold

skaffold build \

--file-output=artifacts.json \

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

--push=true

5. Fase de lanzamiento

Al final del proceso de CICD, por lo general, cuando el código se etiqueta para la producción, llamarás al comando cloud deploy release para iniciar el proceso de lanzamiento. Más adelante, una vez que se haya validado y aprobado la implementación, moverás la versión a través de los distintos entornos de destino mediante la promoción y la aprobación de la acción a través de procesos automatizados o aprobaciones manuales.

Crea una versión

Anteriormente, en este instructivo, creamos archivos de Cloud Deploy para comprender cómo funciona Cloud Deploy. Para los fines de la demostración, creamos los mismos archivos de Cloud Deploy y los enviamos a un repositorio de GitHub con una aplicación de Go de muestra. Usaremos Cloud Deploy para lanzar esa aplicación.

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

Revisa la versión

Cuando se crea una versión de Cloud Deploy, se lanza automáticamente en el primer destino, que es la vista previa.

  1. Ve a <Cloud Deploy> en la consola de Google Cloud.
  2. Haz clic en “sample-app”.

En esta pantalla, verás una representación gráfica de tu canalización.

  1. Confirma un contorno verde en el lado izquierdo del cuadro de vista previa, lo que significa que la versión se implementó en ese entorno.
  2. De manera opcional, revisa los detalles adicionales sobre la versión haciendo clic en el nombre de la versión en Detalles de la versión, en la sección inferior de la pantalla.
  3. Para verificar que la versión implementó correctamente la aplicación, ejecuta el siguiente comando en Cloud Shell.

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. Haz clic en el ícono de vista previa web en la parte superior derecha de la pantalla.
  2. Selecciona Vista previa en el puerto 8080.

Esto te llevará a una página nueva que muestra el mensaje “Hello World!”.

  1. Usa ctrl+c en la terminal para finalizar la redirección de puertos.

Promueve una actualización

Ahora que tu versión se implementó en el primer destino (vista previa) de la canalización, puedes promoverla al siguiente destino (canary). Ejecuta el siguiente comando para comenzar el proceso.

gcloud beta deploy releases promote \

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

--delivery-pipeline=sample-app \

--quiet

Revisa la promoción de la versión

  1. Ve a la canalización sample-app en la consola de Google Cloud.
  2. Confirma un contorno verde en el lado izquierdo del cuadro de Canary, lo que significa que la versión se implementó en ese entorno.
  3. Para verificar que la aplicación se implementó correctamente, crea un túnel hacia ella.

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. Haz clic en el ícono de vista previa web en la parte superior derecha de la pantalla.
  2. Selecciona Vista previa en el puerto 8080.

Esto te llevará a una página nueva que muestra el mensaje “Hello World!”.

  1. Usa ctrl+c en la terminal para finalizar la redirección de puertos.

Aprueba una versión de producción

Recuerda que, cuando creamos el destino de prod a través de prod.yaml, especificamos la etiqueta requireApproval como true. Esto forzará un requisito de aprobación para la promoción en prod.

  1. Promueve la versión canary a producción con el siguiente comando.

gcloud beta deploy releases promote \

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

--delivery-pipeline=sample-app \

--quiet

  1. Ve a la canalización sample-app en la consola de Google Cloud.
  2. Observa el indicador amarillo que indica “1 pendiente”.

Este mensaje indica que hay una versión en cola para la implementación en producción, pero requiere revisión y aprobación.

  1. Haz clic en el botón “Revisar” justo debajo del aviso amarillo.
  2. En la siguiente pantalla, vuelve a hacer clic en “Revisar” para acceder a la pantalla de aprobación de producción.
  3. De manera opcional, revisa la diferencia del manifiesto para revisar los cambios. En este caso, un archivo completamente nuevo.
  4. Haz clic en el botón “Aprobar”.
  5. Regresa a la página de la canalización sample-app, en la que verás la versión en producción en curso.

Revisa la versión de producción

Al igual que con los otros entornos, puedes revisar la implementación cuando se complete con los pasos que se indican a continuación.

  1. Ejecuta el siguiente comando en Cloud Shell para crear la redirección de puertos.

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. Haz clic en el ícono de vista previa web en la parte superior derecha de la pantalla.
  2. Selecciona Vista previa en el puerto 8080.

Esto te llevará a una página nueva que muestra el mensaje “Hello World!”.

  1. Usa ctrl+c en la terminal para finalizar la redirección de puertos.