Configura vistas previas de implementación


En este instructivo, se muestra cómo usar las URL de revisión de Cloud Run para implementar vistas previas de las solicitudes de extracción de GitHub mediante activadores de Cloud Build. Las vistas previas te permiten implementar posibles cambios en un servicio sin cambiar la versión publicada o de “producción” del servicio. Mediante la implementación de una revisión del tráfico del 0% de una solicitud de extracción abierta, puedes obtener una vista previa del cambio y asegurarte de que funcione como se espera en un entorno de cercano a producción antes de la fusión.

Este instructivo funciona con repositorios de GitHub públicos y privados. Ten en cuenta que las vistas previas serán públicas, si son ocultas.

Objetivos

  • Crear un servicio de Cloud Run
  • Implementar la integración continua basada en el control de código fuente en GitHub.
  • Crear y administrar el acceso a los secretos a través de Secret Manager
  • Implementar un Cloud Builder personalizado
  • Crear un activador de Cloud Build para invocar compilaciones cuando se realicen solicitudes de extracción de GitHub

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

Antes de comenzar

  1. Accede a tu cuenta de Google Cloud. Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
  2. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  4. Habilita las API de Cloud Run, Cloud Build, and Secret Manager.

    Habilita las API

  5. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  6. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  7. Habilita las API de Cloud Run, Cloud Build, and Secret Manager.

    Habilita las API

Roles obligatorios

Si quieres obtener los permisos que necesitas para completar el instructivo, pídele a tu administrador que te otorgue los siguientes roles de IAM en tu proyecto:

Si quieres obtener más información para otorgar roles, consulta Administra el acceso.

También puedes obtener los permisos necesarios mediante roles personalizados o cualquier otro rol predefinido.

Recupera la muestra de código

Para facilitar su uso en este instructivo, crearás un repositorio de GitHub nuevo con una copia de una aplicación Hello World basada en una plantilla. Luego, agregarás un archivo nuevo a este repositorio con la configuración personalizada de Cloud Build.

  1. Accede a GitHub y navega hasta el repositorio de la plantilla.
  2. Para crear un repositorio nuevo con esta plantilla, haz clic en “Use this template”.
    1. Asígnale el nombre helloworld-python al repositorio.
    2. Elige “Público” o “Privado” para el repositorio.
    3. Haz clic en Crear repositorio a partir de una plantilla.
  3. Crea un nuevo archivo de configuración de Cloud Build en tu repositorio (instrucciones completas):

    1. En la página de tu repositorio, haz clic en Add file > Create new file.
    2. Asígnale el nombre cloudbuild.yaml al archivo nuevo.
    3. Copia el código que aparece a continuación en 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. Mantén la selección predeterminada “Commit directly into the main branch”.

    5. Haz clic en Commit new file.

Implementa el servicio con un activador de compilación

En este instructivo, se muestra cómo configurar un activador de compilación para iniciar automáticamente una compilación cada vez que se actualice la rama principal de tu repositorio. También puedes implementar tu servicio de forma manual invocando a Cloud Build cada vez que quieras implementar un cambio.

En este instructivo, usa el archivo cloudbuild.yaml para implementar un servicio de muestra llamado myservice.

  1. Otorga las funciones Administrador de Cloud Run y Usuario de cuenta de servicio a la cuenta de servicio de Cloud Build (instrucciones completas):

    1. En la consola de Google Cloud, ve a la página Configuración de la cuenta de Cloud Build.

      Ir a la página de configuración de la cuenta de Cloud Build

    2. Habilita la función Administrador de Cloud Run.

    3. En el cuadro de diálogo de confirmación, haz clic en Otorgar acceso a todas las cuentas de servicio.

  2. Conecta tu cuenta de GitHub a Cloud Build (instrucciones completas):

    1. En la consola de Google Cloud, ve a la página Activadores de Cloud Build.

      Ir a la página Activadores de Cloud Build

    2. Haz clic en Conectar repositorio.

    3. Selecciona GitHub (App de GitHub de Cloud Build) como fuente y completa los diálogos de autenticación y autorización.

    4. Selecciona el repositorio "GITHUB_USER_NAME/helloworld-python".

    5. Haz clic en Conectar repositorio.

    6. En “Crear un activador (opcional)”, haz clic en Crear un activador.

  3. Crea un activador de Cloud Build (instrucciones completas):

    1. En la página Activadores de Cloud Build, haz clic en Crear activador.
    2. Ingresa los siguientes detalles:
      • Nombre: prod-deploy
      • Evento: Envío a la rama
      • Repositorio de código fuente: “GITHUB_USER_NAME/helloworld-python”
      • Rama de origen: ^main$
      • Configuración de compilación: Archivo de configuración de Cloud Build (YAML o JSON)
      • Ubicación del archivo de configuración de Cloud Build: cloudbuild.yaml
    3. Haz clic en Crear.
  4. Ejecuta el activador nuevo de forma manual:

    1. En la lista de activadores nuevos, haz clic en Ejecutar.
    2. En la ventana emergente, confirma el nombre de la rama (main ) y haz clic enEjecutar activadores.
    3. Para verificar el progreso de la compilación, ve al historial de Cloud Build.
    4. Espera a que se complete la compilación.
  5. Confirma que la implementación se haya realizado correctamente.

    1. En la consola de Google Cloud, ve a la página Cloud Run.

      Ir a la página Cloud Run

    2. Confirma que el servicio tenga una marca de verificación verde, que representa una implementación exitosa.

    3. Haz clic en la pestaña Revisiones y confirma que el servicio tenga una revisión que entregue el 100% del tráfico y comience con “myservice-00001-”.

    4. Haz clic en la URL del servicio y confirma que el servicio muestra el mensaje “Hello World!”.

    Captura de pantalla de la consola de Cloud Run. Se muestra una sola revisión, y se destaca la URL del servicio.
    Captura de pantalla del servicio implementado de Cloud Run. Se muestra “Hello World!”.

Crea tokens y opciones de configuración

El activador prod‑deploy creado en la sección anterior implementa el servicio cuando se realiza un envío a la rama principal. Ahora, crearás un segundo activador que se ejecutará cada vez que se cree o actualice una solicitud de extracción en tu repositorio.

Una vez que se configure el activador nuevo, se implementará la vista previa, pero no habrá información en la solicitud de extracción para vincular a la vista previa. Para configurar esta funcionalidad, debes completar los siguientes pasos de configuración adicionales:

  • Crea un token de GitHub.
  • Almacena este token en Secret Manager.
  • Crea una imagen personalizada para usarla como paso en Cloud Build.

Crea y almacena un token de GitHub

  1. Crea un token de GitHub para permitir la escritura cuando se realice una solicitud de extracción (instrucciones completas):
    1. Ve a la página de configuración Personal access tokens de GitHub.
    2. Haz clic en Generate new token.
    3. Ingresa los siguientes detalles:
      • Nota: preview-deploy
      • Vencimiento: 30 días
      • Permiso:
        • En un repositorio público: repo:status (“Acceder al estado de confirmación”)
        • En el caso de un repositorio privado: repo (“control total de repositorios privados”)
    4. Haz clic en Generate token.
    5. Copia el valor del token generado.
  2. Almacena el token de GitHub en Secret Manager:

    1. En la consola de Google Cloud, ve a la página Secret Manager.

      Ir a la página Secret Manager

    2. Haz clic en Crear secreto.

    3. Ingresa los siguientes detalles:

      1. Nombre: github_token.
      2. Valor secreto: Pega el valor del token que copiaste de GitHub.
    4. Haz clic en Crear secreto.

  3. Permite que Cloud Build acceda a este secreto:

    1. En una pestaña nueva del navegador, en la consola de Google Cloud, ve a la página Configuración de Cloud Build.

      Ir a la página de configuración de Cloud Build

    2. Copia el valor de "Correo electrónico de la cuenta de servicio".

      • El correo electrónico es PROJECT_NUM@cloudbuild.gserviceaccount.com.
    3. Regresa a Secret Manager y haz clic en la pestaña Permiso y, luego, en Agregar.

      • Principales nuevas: PROJECT_NUM@cloudbuild.gserviceaccount.com
      • Función: Usuario con acceso a secretos de Secret Manager
    4. Haz clic en Guardar.

GitHub recomienda establecer el vencimiento de los tokens de acceso personales y enviará correos electrónicos de recordatorio cuando los tokens estén configurados para vencer. Si continúas usando vistas previas de implementación, crea una versión nueva de github_token cuando vuelvas a generar el token. El compilador del siguiente paso recupera la última versión del token para que las vistas previas sigan funcionando.

Crea una imagen nueva para Cloud Build

La secuencia de comandos que escribe la notificación “Deployment Preview” en la solicitud de extracción se encuentra en las muestras de la documentación de Python. En vez de agregar esta secuencia de comandos a tu código fuente, de manera opcional, puedes compilar esta secuencia en un contenedor que pertenezca al proyecto y ejecutar ese contenedor como un paso en la configuración de Cloud Build.

Puedes completar las siguientes instrucciones con Cloud Shell o en tu máquina local si instalaste y configuraste git y Google Cloud CLI. En las siguientes instrucciones, se indican ambos métodos.

  1. En la consola de Google Cloud, activa Cloud Shell.

    Activar Cloud Shell

    En la parte inferior de la consola de Google Cloud, se inicia una sesión de Cloud Shell en la que se muestra una ventana de línea de comandos. Cloud Shell es un entorno de shell con Google Cloud CLI ya instalada y con valores ya establecidos para el proyecto actual. La sesión puede tardar unos segundos en inicializarse.

  2. Configura Google Cloud CLI para usar tu proyecto y reemplaza PROJECT_ID por el ID del proyecto:
    export PROJECT_ID=PROJECT_ID
    gcloud config set project $PROJECT_ID
    
    Si usas Cloud Shell, es posible que debas autorizar a Google Cloud CLI para que realice una llamada a la API de Google Cloud. Haz clic en Autorizar para permitir que continúe esta acción.
  3. Crea una nueva imagen de contenedor:
    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. Confirma que se haya creado el contenedor:
    gcloud container images list
    
  5. Quita el repositorio clonado:
    cd ..
    rm -rf python-docs-samples
    

Agrega la nueva configuración de Cloud Build

El repositorio ya tiene un archivo cloudbuild.yaml que se usa en la rama principal. Ahora creará una configuración nueva para este activador nuevo.

  1. En la página del repositorio de GitHub, haz clic en Add file > Create new file.

    1. Asígnale el nombre cloudbuild-preview.yaml al archivo nuevo.
    2. Copia el código que aparece a continuación y pégalo en tu archivo nuevo:
    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. Confirma el cambio en la rama principal del repositorio.

Crea el activador secundario

Ahora que sentaste las bases, crea el activador nuevo.

  1. Crea un activador de Cloud Build nuevo (instrucciones completas):

    1. En la consola de Google Cloud, ve a la página Activadores de Cloud Build.

      Ir a la página Activadores de Cloud Build

    2. Haz clic en Crear activador.

    3. Ingresa los siguientes detalles:

      • Nombre: preview-deploy
      • Evento: solicitud de extracción
      • Repositorio de código fuente: “GITHUB_USER_NAME/helloworld-python”
      • Rama base: ^main$
      • Control de comentarios: Obligatorio excepto para los propietarios o colaboradores
        • Como propietario del repositorio, las vistas previas se compilarán automáticamente en las solicitudes de extracción que crees.
        • Si quieres permitir que cualquier persona obtenga una vista previa de los cambios, lee la información sobre las implicaciones de seguridad y selecciona "No es obligatorio".
      • Configuración: Archivo de configuración de Cloud Build
      • Ubicación del archivo de configuración de Cloud Build: cloudbuild-preview.yaml
    4. Haz clic en Crear.

Verifica el éxito

Dado que este activador nuevo se activa cuando se crea una nueva solicitud de extracción, deberás crear una solicitud de este tipo para probarla.

  1. Ve al repositorio y realiza un cambio visual en app.py en una rama nueva.
    1. Ve a app.py y haz clic en el ícono de lápiz ().
      Captura de pantalla de la interfaz de GitHub para editar archivos en el sitio web
    2. Haz un cambio; por ejemplo, cambia "Hola" por "Saludos".
    3. Selecciona Create a new branch for this commit and start a pull request y, luego, haga clic en Propose change.
  2. Crea una nueva solicitud de extracción con esta rama.

    Si el activador se configuró de forma correcta, se mostrará una verificación nueva poco después de crear la solicitud de extracción:

    Captura de pantalla de la interfaz de GitHub. Se muestra una verificación pendiente.
  3. El nombre de la verificación es el nombre del activador y el ID del proyecto. Para verificar el progreso de la compilación, haz clic en Detalles > Ver más detalles de Google Cloud Build.

    Si el activador falla y necesitas volver a enviar la compilación, o si deseas realizar otro cambio en la solicitud de extracción, debes confirmar un cambio en la misma rama. Cada confirmación nueva en una solicitud de extracción activará una compilación nueva.

  4. Una vez que se completa el activador, se muestra una verificación de estado nueva llamada “Vista previa de la implementación” para la solicitud de extracción. El ícono que se muestra es tu avatar porque tu cuenta es propietaria del token que se usa:

    Captura de pantalla de la interfaz de GitHub. Se muestra una verificación completa.
  5. Haz clic en Detalles para navegar a la vista previa. La URL que se muestra es la misma que la URL de servicio original, pero tiene el prefijo “pr-1---”.

    Captura de pantalla de la implementación de vista previa del servicio de Cloud Run. Se muestra "Greetings World!".

    Ten en cuenta que, si navegas a la URL del servicio original, se mostrará el contenido original:

    Captura de pantalla de la implementación original del servicio de Cloud Run. Se muestra “Hello World!”.
  6. Visualiza la lista de revisiones de tu servicio para verificar el estado del servicio en Cloud Run: ahora hay dos revisiones para entregar tráfico, la original y la vista previa:

    Captura de pantalla de la consola de Cloud Run, con dos revisiones activas.
  7. Agrega confirmaciones nuevas a la rama para continuar realizando cambios en la solicitud de extracción. Cada vez que realizas una confirmación, se activa el activador preview-deploy y este crea una revisión nueva del servicio y la pone a disposición en la misma URL:

    Captura de pantalla de la consola de Cloud Run. Se muestran tres revisiones.
  8. Una vez que esté todo listo para combinar los cambios, haz clic en Merge Pull Request. Se ejecuta el activador prod-deploy original, y los cambios de la solicitud de extracción se reflejan en la URL original:

    Captura de pantalla del servicio de Cloud Run implementado recientemente. Se muestra “Greetings World!”.

    La revisión nueva entrega el 100% del tráfico en la URL principal, pero la URL de vista previa de la solicitud de extracción aún está adjunta a la confirmación más reciente de esa solicitud de extracción, por lo que el vínculo seguirá funcionando:

    Captura de pantalla de la consola de Cloud Run. Se muestran cuatro revisiones.

Limitaciones

Existe un límite para la cantidad de URL de revisiones que se pueden crear. Si esperas que tu repositorio tendrá más de 1,000 solicitudes de extracción, te recomendamos que implementes un proceso para limpiar las etiquetas, como se muestra en cloudbuild-cleanup.yaml.

Comprende el código

cloudbuild.yaml

Este código se basa en la muestra cloudbuild.yaml que proporciona Cloud Build, pero con una actualización importante: el cuarto paso que ejecuta update-traffic.

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

La configuración de cloudbuild.yaml realiza cambios en la división del tráfico. El parámetro --to-latest ofrece la misma función que la casilla de verificación Aplicar esta revisión inmediatamente de la página Cloud Run. Garantiza que esta revisión del servicio entregue el 100% del tráfico de inmediato.

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"

Este código es similar a cloudbuild.yaml, pero incluye pasos adicionales:

  1. Después de compilar y enviar la imagen de servicio, cloudbuild-preview.yaml implementa el servicio mediante la marca --no-traffic. Esto significa que, aunque esta es la revisión más reciente, no se usa para entregar tráfico.

  2. cloudbuild-preview.yaml agrega una etiqueta personalizada basada en el número de la solicitud de extracción. En este caso, una string con el prefijo “pr-” que termina con el número de la solicitud de extracción.

    En este punto, la URL de revisión funciona, pero la persona que envió la solicitud de extracción no puede determinar esto porque los registros de Cloud Build no son visibles desde GitHub: solo un vínculo para que los registros sean visibles. Solo los usuarios autenticados del proyecto de Cloud Build con los permisos suficientes pueden ver los registros.

  3. cloudbuild-preview.yaml ejecuta la secuencia de comandos check_status.py mediante parámetros de sustitución integrados que proporciona Cloud Build. Varios de estos parámetros están disponibles cuando funcionan con repositorios de GitHub, como el número de solicitud de extracción, el nombre del repositorio y el SHA de confirmación.

Para volver a ejecutar este activador, envía otra confirmación en GitHub. Este activador no se puede volver a ejecutar desde la página de Cloud Build en Console.

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"

Este código es una alternativa a cloudbuild.yaml, con una función de limpieza agregada. Los pasos iniciales realizan la implementación, y la función se extiende de la siguiente manera:

  1. Con las API de Discovery y de GitHub, determina qué etiquetas del servicio corresponden a solicitudes de extracción cerradas. Como mínimo, estará la solicitud de extracción que se fusionó, que hace que se accione este activador.

  2. Borra las etiquetas identificadas.

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']}"
    )

La secuencia de comandos check_status.py toma la información proporcionada sobre el servicio de Cloud Run, el repositorio y la confirmación de GitHub. Luego, realiza las siguientes operaciones:

  • Recupera el nombre del servicio, la etiqueta y la URL de revisión con el cliente de la API de Google para Python.
  • Recupera el token de GitHub de la variable de entorno que proporciona Secret Manager.
  • Crea un estado en la confirmación determinada y vincula a la URL de revisión recuperada mediante una API cliente de GitHub para Python.

Limpia

Si creaste un proyecto nuevo para este instructivo, bórralo. Si usaste un proyecto existente y deseas conservarlo sin los cambios que se agregaron en este instructivo, borra los recursos creados para el instructivo. Además, deberás borrar las configuraciones de GitHub que se crearon para el instructivo.

Borra el proyecto

La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el instructivo.

Para borrar el proyecto, sigue estos pasos:

  1. En la consola de Google Cloud, ve a la página Administrar recursos.

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

Borra los recursos del instructivo

  1. Usa este comando para borrar el servicio de Cloud Run que implementaste en este instructivo:

    1. Navega a la consola de Cloud Run.
    2. Selecciona la ficha "myservice" y haz clic en Borrar.
    3. En el diálogo de confirmación, haz clic en Borrar.
  2. Borra otros recursos de Google Cloud que creaste en este instructivo:

Borra las configuraciones del instructivo

Para limpiar las configuraciones en GitHub, deberás quitar la aplicación de Google Cloud Build de GitHub:

  1. Navega a la configuración de la aplicación de GitHub.
  2. En la ficha Google Cloud Build, haz clic en Configure.
  3. En la sección Danger Zone, haz clic en Uninstall.
  4. En el diálogo de confirmación, haz clic en Okay.

También deberás borrar el token de GitHub creado:

  1. Navega a la página Personal access tokens de GitHub.
  2. En la lista preview-deploy, haz clic en Borrar.
  3. En el diálogo de confirmación, haz clic en I understand, delete this token.

También deberás borrar el repositorio de GitHub:

  1. Navega al repositorio de GitHub que creaste y haz clic en la pestaña Configuración.
  2. En la sección Danger Zone, haz clic en Delete this repository.
  3. En el diálogo de confirmación, ingresa el nombre completo del repositorio y haz clic en I understand the consequences, delete this repository.

¿Qué sigue?