En este documento, se describe cómo ejecutar operaciones o programas arbitrarios antes o después de la implementación.
Puedes configurar Cloud Deploy y Skaffold para ejecutar acciones que realicen acciones previas a la implementación o posteriores a ella, o ambas. Estos programas, que se ejecutan de esta manera, se denominan “hooks”. Los hooks previos y posteriores a la implementación se ejecutan como trabajos previos y posteriores a la implementación en el lanzamiento.
Puedes configurar cada hook para que se ejecute en un entorno de ejecución de Cloud Deploy especificado, pero si realizas la implementación en Google Kubernetes Engine, puedes configurarlo de manera opcional para que se ejecute en el clúster de GKE en el que implementas tu aplicación.
Se supone que los hooks de implementación son idempotentes. Si se ejecuta una acción determinada más de una vez, no se produce ningún efecto adicional.
¿Cómo funcionan los hooks de implementación?
A continuación, se describen los pasos para configurar los hooks de implementación y el proceso de Skaffold y Cloud Deploy para ejecutarlos:
Configuras el
skaffold.yaml
que se usa para una versión determinada para incluircustomActions
que identifican la o las imágenes de contenedor que se usarán para ejecutar los hooks, y el comando o la secuencia de comandos específicos que se ejecutarán en cada contenedor.Configuras hooks en una o más etapas de la progresión de tu canalización de entrega, cada una de las cuales hace referencia a uno de los
customActions
que configuraste enskaffold.yaml
.Antes de que se ejecute el trabajo de implementación del lanzamiento, Skaffold ejecuta cualquier comando configurado en
skaffold.yaml
al que se hace referencia en una estrofapredeploy
en la progresión de la canalización.El hook
predeploy
siempre se ejecuta como la primera tarea de la fase.Después de que se ejecuta el trabajo de implementación del lanzamiento, Cloud Deploy ejecuta cualquier comando configurado en
skaffold.yaml
al que se hace referencia en una estrofapostdeploy
en el progreso de la canalización.
Los hooks de implementación se ejecutan en el entorno de ejecución predeterminada de Cloud Deploy o en un entorno de ejecución alternativo especificado. En el caso de las implementaciones en GKE y GKE Enterprise, puedes ejecutar los hooks en el mismo clúster en el que se implementa la aplicación.
Cómo usar hooks de implementación con una implementación de versiones canary
Cuando configuras hooks de implementación para una implementación de versiones canary, debes tener en cuenta lo siguiente:
En la etapa de canalización de publicación, la configuración del hook (
predeploy
ypostdeploy
) se encuentra enstrategy.canary.canaryDeployment
ostrategy.canary.customCanaryDeployment.phaseConfigs
, en lugar destrategy.standard
.Para un canario automatizado, los hooks de
predeploy
se ejecutan antes de la implementación solo en la primera fase, y los hooks depostdeploy
se ejecutan después de la implementación solo en la última fase (estable).
Configura acciones en Skaffold
En tu archivo skaffold.yaml
, la estrofa customActions
toma una o más estrofas customActions
configuradas de la siguiente manera:
customActions
- name: ACTION_NAME
containers:
- name: CONTAINER_NAME
image: IMAGE
command: [COMMANDS_TO_RUN]
args: [LIST_OF_ARGS]
En esta estrofa customerActions
:
ACTION_NAME
Es un nombre para esta acción. Este nombre puede ser cualquier cosa, pero debe ser único dentro de este
skaffold.yaml
. Este es el nombre al que se hará referencia desde las acciones previas y posteriores a la implementación definidas en la etapa de la canalización de publicación.CONTAINER_NAME
Es un nombre para el contenedor específico. Este nombre puede ser el que quieras, pero debe ser único dentro de este
skaffold.yaml
.IMAGE
Es el nombre de la imagen de contenedor en la que se ejecutará tu comando.
COMMANDS_TO_RUN
Es una lista de puntos de entrada para ejecutar en ese contenedor.
"/bin/sh"
es un comando típico para especificar aquí, para invocar un shell, y debes incluir el comando para ejecutar en ese shell en los argumentos.LIST_OF_ARGS
Es una lista de argumentos que se deben proporcionar al comando. Esta es una lista separada por comas, con cada argumento entre comillas. Si tu COMMAND_TO_RUN es
"/bin/sh"
, uno de los argumentos aquí sería"-c"
y otro sería el comando completo que deseas ejecutar en la shell que invocas.A continuación, se presenta un ejemplo:
command: ["/bin/sh"] args: ["-c", `echo "This command ran!"`]
Para obtener más información sobre las acciones personalizadas de Skaffold, consulta la documentación de Skaffold.
Configura la canalización para que haga referencia a las acciones
Para terminar de configurar tus hooks de implementación, debes configurar la canalización de entrega para que haga referencia a las acciones personalizadas que definiste en tu archivo skaffold.yaml
. Las acciones previas y posteriores a la implementación se configuran en una o más etapas específicas de la progresión de la canalización.
A continuación, se muestra cómo configurar los hooks previos y posteriores a la implementación en una etapa de canalización cuando se usa una estrategia de implementación de standard
:
serialPipeline:
stages:
- targetId: hooks-staging
profiles: []
strategy:
standard:
predeploy:
actions: ["PREDEPLOY-ACTION"]
postdeploy:
actions: ["POSTDEPLOY-ACTION"]
En este archivo yaml:
PREDEPLOY_ACTION
Es el mismo que el ACTION_NAME que usaste en tu
skaffold.yaml
para definir la acción personalizada que deseas ejecutar antes de la implementación.POSTDEPLOY_ACTION
Es el mismo que el ACTION_NAME que usaste en tu
skaffold.yaml
para definir la acción personalizada que deseas ejecutar después de la implementación.
Puedes especificar más de una acción para predeploy
y postdeploy
, separadas por comas. Cuando se especifica más de una acción, estas se ejecutan de forma serial, en el orden en que se especifican. La tarea (preaprovisionamiento o posaprovisionamiento) falla en la primera acción que falla y no se ejecutan las acciones restantes.
De forma predeterminada, si ejecutas más de un contenedor en paralelo y falla un trabajo, ambos contenedores se detienen. Puedes configurar este comportamiento con la estrategia de error de acción personalizada de Skaffold.
Ejecuta los hooks en el clúster de aplicaciones
De forma predeterminada, los hooks de implementación se ejecutan en el entorno de ejecución de Cloud Deploy. También puedes configurar Skaffold para que ejecute esas acciones personalizadas en el mismo clúster en el que se ejecuta tu aplicación. Cuando
configuras acciones personalizadas en skaffold.yaml
y
las habilitas en una etapa de canalización, la acción se ejecuta
automáticamente en el clúster de ese destino.
Esta función solo está disponible para implementaciones en GKE y GKE Enterprise, no en Cloud Run. Las implementaciones en Cloud Run solo pueden ejecutar hooks en el entorno de ejecución de Cloud Deploy.
Para ejecutar el hook en el clúster, incluye una stanza executionMode.kubernetesCluster
en el archivo de configuración skaffold.yaml
, dentro de la stanza customActions
para la acción personalizada específica:
customActions
- name: ACTION_NAME
containers:
- name: CONTAINER_NAME
image: IMAGE
command: [COMMANDS_TO_RUN]
args: [LIST_OF_ARGS]
executionMode:
kubernetesCluster: {}
El siguiente es un ejemplo de estrofa customActions
que incluye executionMode
para invocar el contenedor de hook en el clúster de aplicaciones:
customActions:
- name: predeploy-action
containers:
- name: predeploy-echo
image: ubuntu
command: ["/bin/sh"]
args: ["-c", 'echo "this is a predeploy action"' ]
executionMode:
kubernetesCluster: {}
La estrofa executionMode
es opcional y, si la omites, Skaffold ejecutará el
contenedor de acción personalizada en el entorno de ejecución de Cloud Deploy.
Variables de entorno disponibles
Cloud Deploy proporciona y propaga las siguientes variables de entorno en el entorno de ejecución, que puedes usar para tus hooks:
ANTHOS_MEMBERSHIP
Para los destinos de tipo
ANTHOS
, el nombre de recurso completamente especificado de la membresía de Anthos.CLOUD_RUN_LOCATION
Para los destinos de tipo
RUN
, la región en la que se implementa el servicio de Cloud RunCLOUD_RUN_PROJECT
Para los destinos de tipo
RUN
, el proyecto en el que se creó el servicio de Cloud Run.CLOUD_RUN_SERVICE
Para los destinos de tipo
RUN
, el nombre del servicio de Cloud Run implementadoCLOUD_RUN_SERVICE_URLS
Para los destinos de tipo
RUN
, las URLs (lista separada por comas) que los usuarios finales usarán para acceder a tu servicio. Puedes encontrar estos datos en los detalles del servicio de Cloud Run de tu servicio, en la consola de Google Cloud.CLOUD_RUN_REVISION
Para los destinos de tipo
RUN
, la revisión específica del servicio de Cloud RunGKE_CLUSTER
Para los destinos de tipo
GKE
, el nombre de recurso completamente especificado del clúster de Google Kubernetes Engine, por ejemplo,projects/p/locations/us-central1/clusters/dev
.TARGET_TYPE
Es el tipo de entorno de ejecución específico del destino.
GKE
,ANTHOS
oRUN
. En el caso de los objetivos personalizados, no se establecerá.CLOUD_DEPLOY_LOCATION
La región que contiene los recursos de Cloud Deploy.
CLOUD_DEPLOY_DELIVERY_PIPELINE
Es el ID de la canalización de entrega.
CLOUD_DEPLOY_TARGET
Es el ID del objetivo.
CLOUD_DEPLOY_PROJECT
El proyecto de Google Cloud que contiene los recursos de Cloud Deploy
CLOUD_DEPLOY_RELEASE
Es el ID de la versión en la que se ejecutarán los hooks.
CLOUD_DEPLOY_ROLLOUT
El ID del lanzamiento que contiene los trabajos de los hooks.
CLOUD_DEPLOY_JOB_RUN
Es el ID de la ejecución de trabajo que representa la ejecución actual del trabajo.
CLOUD_DEPLOY_PHASE
La fase del lanzamiento que contiene el trabajo de los hooks.
Cómo implementar parámetros como variables de entorno
Además de las variables de entorno que se enumeran en esta sección, Cloud Deploy puede pasar a tus contenedores personalizados cualquier parámetro de implementación que hayas establecido.
¿Qué sigue?
Prueba la guía de inicio rápido: Ejecuta hooks antes y después de la implementación.
Obtén más información sobre Skaffold.