Ayúdanos a definir el futuro de la entrega de software y haz que escuche tu opinión mediante la encuesta del estado de DevOps 2021.

Compila aplicaciones de Go

En esta página, se explica cómo usar Cloud Build para compilar, probar y, también, implementar aplicaciones de Go. Si estás dando los primeros pasos en Cloud Build, lee primero las guías de inicio rápido y la descripción general de la configuración de compilación.

Antes de comenzar

En las instrucciones de esta página, se supone que estás familiarizado con Go. Además, ten en cuenta la información siguiente:

  • Habilita las API de Cloud Build, Cloud Run, and Artifact Registry.

    Habilita las API

  • Para ejecutar los comandos de gcloud en esta página, instala el SDK de Cloud.
  • Ten tu proyecto de Go a mano.
  • Si deseas crear contenedores en tu app de Go con Cloud Build, necesitarás un Dockerfile junto con tu código fuente.
  • Si deseas almacenar el contenedor compilado en Artifact Registry, crea un repositorio de Docker en Artifact Registry.
  • Si quieres almacenar registros de prueba en Cloud Storage, crea un depósito en Cloud Storage.

Permisos de IAM obligatorios

A fin de obtener instrucciones para otorgar estas funciones, consulta cómo otorgar una función con la página de IAM.

Configura compilaciones de Go

La imagen pública golang de Docker Hub admite la compilación mediante módulos de Go. Usar esta imagen como un paso de compilación en tu archivo de configuración de Cloud Build te permite invocar comandos go dentro de la imagen. Los argumentos que se pasan a este paso de compilación se pasan directo a la herramienta de golang, lo que te permite ejecutar cualquier comando de go en esta imagen.

En esta sección, se brinda un ejemplo de un archivo de configuración de compilación para una app de Go. Cuenta con pasos de compilación para compilar la app, agregar pruebas de unidades y, después de pasar las pruebas, crear contenedores y, luego, implementar la app.

Para compilar la aplicación de Go, sigue estos pasos:

  1. En el directorio raíz del proyecto, crea el archivo de configuración de Cloud Build con el nombre cloudbuild.yaml.

  2. Compila y prueba: Si definiste pruebas de unidades en tu aplicación, puedes configurar Cloud Build a fin de ejecutar las pruebas; para ello, agrega los siguientes campos en un paso de compilación:

    • name: Establece el valor de este campo en golang a fin de usar la imagen de golang de Docker Hub para tu tarea.
    • entrypoint: establece el valor de este campo en /bin/bash. Esto te permite ejecutar comandos de Bash de varias líneas directamente desde el paso de compilación.
    • args: El campo args de un paso de compilación toma una lista de argumentos y los pasa a la imagen a la que se hace referencia en el campo name. En el siguiente ejemplo, el campo args toma los argumentos para lo siguiente:

      • Ejecuta el formateador del registro de prueba para descargar el resultado del registro.
      • Imprime el resultado del registro.
      • Guardando los resultados de la prueba en sponge.log
      • Salida de los resultados de sponge.log a un archivo XML JUNIT El nombre del archivo XML JJ se construye con la versión corta del ID de confirmación asociado con tu compilación. En un paso de compilación posterior, se guardarán los registros de este archivo en Cloud Storage.
      steps:
        # Run tests and save to file
        - name: golang
          entrypoint: /bin/bash
          args:
            - -c
            - |
              go get -u github.com/jstemmer/go-junit-report
              2>&1 go test -timeout 1m -v ./... | tee sponge.log
              /go/bin/go-junit-report -set-exit-code < sponge.log > ${SHORT_SHA}_test_log.xml
  3. Crea contenedores para la app: Después de agregar el paso de compilación a fin de asegurarte de que las pruebas se aprobaron, puedes compilar la aplicación. Cloud Build proporciona una imagen de Docker compilada con anterioridad que puedes usar para crear contenedores en la aplicación de Go. Para crear contenedores en tu app, agrega los siguientes campos en un paso de compilación:

    • name: configura el valor de este campo en gcr.io/cloud-builders/docker para usar la imagen de Docker compilada previamente desde Container Registry en tu tarea.
    • args: Agrega los argumentos para el comando docker build como valores de este campo.

    En el siguiente paso de compilación, se compila la imagen myimage y se etiqueta con la versión corta del ID de confirmación. El paso de compilación usa substitutions para el ID del proyecto, el nombre del repositorio y los valores SHA cortos, por lo que estos valores se sustituyen de forma automática en el momento de la compilación. Ten en cuenta que deberás crear o tener un repositorio de Docker existente en Artifact Registry para almacenar la imagen.

    # Docker Build
    - name: 'gcr.io/cloud-builders/docker'
      args: ['build', '-t',
             'us-central1-docker.pkg.dev/$PROJECT_ID/$_REPO_NAME/myimage:$SHORT_SHA', '.']
  4. Envía el contenedor a Artifact Registry: Puedes almacenar el contenedor compilado en Artifact Registry, que es un servicio de Google Cloud que puedes usar para almacenar, administrar y proteger artefactos de compilación. Para hacer esto, necesitarás tener un repositorio de Docker existente en Artifact Registry. Para configurar Cloud Build a fin de almacenar la imagen en un repositorio de Docker de Artifact Registry, agrega un paso de compilación con los siguientes campos:

    • name: configura el valor de este campo en gcr.io/cloud-builders/docker para usar la imagen oficial del compilador docker desde Container Registry para tu tarea.
    • args: Agrega los argumentos para el comando docker push como valores de este campo. Para la URL de destino, ingresa el repositorio de Docker de Artifact Registry en el que deseas almacenar la imagen.

    En el siguiente paso de compilación, se envía la imagen que compilaste en el paso anterior a Artifact Registry:

    # Docker push to Google Artifact Registry
    - name: 'gcr.io/cloud-builders/docker'
      args: ['push', 'us-central1-docker.pkg.dev/$PROJECT_ID/$_REPO_NAME/myimage:$SHORT_SHA']
  5. Implementa el contenedor en Cloud Run: Para implementar la imagen en Cloud Run, agrega un paso de compilación con los siguientes campos:

    • name: establece el valor de este campo en google/cloud-sdk para usar la imagen del SDK de Cloud a fin de invocar el comando gcloud a fin de implementar la imagen en Cloud Run.
    • args: Agrega los argumentos para el comando gcloud run deploy como valores de este campo.

    En el siguiente paso de compilación, se implementa la imagen compilada con anterioridad en Cloud Run:

    # Deploy to Cloud Run
    - name: 'gcr.io/cloud-builders/gcloud'
      args: ['run', 'deploy', 'helloworld',
             '--image=us-central1-docker.pkg.dev/$PROJECT_ID/$_REPO_NAME/myimage:$SHORT_SHA',
             '--region', 'us-central1', '--platform', 'managed']
  6. Guardar registros de prueba en Cloud Storage: Puedes configurar Cloud Build para almacenar registros de prueba en Cloud Storage si especificas una ubicación de depósito existente y una ruta a los registros de prueba.

    En el siguiente paso de compilación, se almacenan los registros de prueba que guardaste en el archivo XML de JUNIT en un depósito de Cloud Storage:

    # Save test logs to Google Cloud Storage
    artifacts:
      objects:
        location: gs://$_BUCKET_NAME/
        paths:
          - ${SHORT_SHA}_test_log.xml

    En el siguiente fragmento, se muestra el archivo de configuración de compilación completo para todos los pasos descritos anteriormente:

    steps:
      # Run tests and save to file
      - name: golang
        entrypoint: /bin/bash
        args:
          - -c
          - |
            go get -u github.com/jstemmer/go-junit-report
            2>&1 go test -timeout 1m -v ./... | tee sponge.log
            /go/bin/go-junit-report -set-exit-code < sponge.log > ${SHORT_SHA}_test_log.xml
    
      # Docker Build
      - name: 'gcr.io/cloud-builders/docker'
        args: ['build', '-t',
               'us-central1-docker.pkg.dev/$PROJECT_ID/$_REPO_NAME/myimage:$SHORT_SHA', '.']
    
      # Docker push to Google Artifact Registry
      - name: 'gcr.io/cloud-builders/docker'
        args: ['push', 'us-central1-docker.pkg.dev/$PROJECT_ID/$_REPO_NAME/myimage:$SHORT_SHA']
    
      # Deploy to Cloud Run
      - name: 'gcr.io/cloud-builders/gcloud'
        args: ['run', 'deploy', 'helloworld',
               '--image=us-central1-docker.pkg.dev/$PROJECT_ID/$_REPO_NAME/myimage:$SHORT_SHA',
               '--region', 'us-central1', '--platform', 'managed']
    
    # Save test logs to Google Cloud Storage
    artifacts:
      objects:
        location: gs://$_BUCKET_NAME/
        paths:
          - ${SHORT_SHA}_test_log.xml
    # Store images in Google Artifact Registry
    images:
      - us-central1-docker.pkg.dev/$PROJECT_ID/$_REPO_NAME/myimage:$SHORT_SHA
  7. Comienza la compilación con la herramienta de gcloud o los activadores de compilación. Debes especificar el nombre del repositorio de Artifact Registry cuando inicias la compilación.

    Para especificar el repositorio de Artifact Registry cuando inicias la compilación con la herramienta gcloud, haz lo siguiente:

    gcloud builds submit --config=cloudbuild.yaml \
        --substitutions=_REPO_NAME="REPO_NAME"
    

    Reemplaza REPO_NAME por el nombre de tu repositorio de Artifact Registry.

    Para especificar el repositorio Artifact Registry cuando compilas con activadores de compilación, especifica el nombre de tu repositorio de Artifact Registry en el campo Variables de sustitución cuando crees el activador de compilación.

¿Qué sigue?