Compilar y probar aplicaciones de Go

En esta página se explica cómo usar Cloud Build para compilar y probar tus aplicaciones Go, subir tus artefactos a Artifact Registry, generar información de procedencia y guardar tus registros de pruebas en Cloud Storage.

Antes de empezar

En las instrucciones de esta página se presupone que tienes conocimientos de Go. Además:

  • Enable the Cloud Build, Cloud Run, and Artifact Registry APIs.

    Enable the APIs

  • Para ejecutar los comandos gcloud de esta página, instala Google Cloud CLI.
  • Ten a mano tu proyecto de Go.
  • Tener un repositorio de Go en Artifact Registry. Si no tienes uno, crea un repositorio.
  • Si quieres almacenar los registros de pruebas en Cloud Storage, crea un segmento en Cloud Storage.

Configurar la cuenta de servicio

En los ejemplos de este documento se usa una cuenta de servicio especificada por el usuario. Para crear la cuenta de servicio que usa Cloud Build, ejecuta el siguiente comando en la CLI de Google Cloud:

gcloud iam service-accounts create cloud-build-go \
--description="Build and test Go applications" \
--display-name="Cloud Build Go" \
--project="PROJECT_ID"

La cuenta de servicio de Compute predeterminada (que usa Cloud Run) necesita permiso para actuar como la nueva cuenta de servicio. Primero, determina el nombre de la cuenta de servicio de Compute de tu proyecto:

gcloud iam service-accounts list --filter="email:-compute@developer.gserviceaccount.com"

A continuación, asigna el rol Usuario de cuenta de servicio (roles/iam.serviceAccountUser)

gcloud iam service-accounts add-iam-policy-binding \
COMPUTE_SERVICE_ACCOUNT_EMAIL  \
--member="serviceAccount:cloud-build-go@PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/iam.serviceAccountUser"

Sustituye COMPUTE_SERVICE_ACCOUNT_EMAIL por la dirección de correo de la cuenta de servicio de computación predeterminada que ha impreso el comando anterior.

Configurar permisos de gestión de identidades y accesos

Asegúrate de que tienes los permisos necesarios:

Para obtener los permisos que necesitas para realizar compilaciones en Cloud Build, pide a tu administrador que te conceda el rol de IAM Cuenta de servicio de Cloud Build (roles/cloudbuild.builds.builder) en tu cuenta de servicio de compilación. Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar el acceso a proyectos, carpetas y organizaciones.

También puedes conseguir los permisos necesarios a través de roles personalizados u otros roles predefinidos.

Para obtener los permisos que necesitas para almacenar artefactos compilados en Artifact Registry, pide a tu administrador que te conceda el rol de gestión de identidades y accesos Escritor de Artifact Registry (roles/artifactregistry.writer) en tu cuenta de servicio de compilación.

Para obtener los permisos que necesitas para almacenar registros de pruebas en Logging, pide a tu administrador que te conceda el rol de gestión de identidades y accesos Creador de objetos de almacenamiento (roles/storage.objectCreator) en tu cuenta de servicio de compilación.

Para obtener los permisos que necesitas para desplegar la aplicación en Cloud Run, pide a tu administrador que te conceda el rol de gestión de identidades y accesos Desarrollador de Cloud Run (roles/run.developer) en tu cuenta de servicio de compilación.

Configurar compilaciones de Go

La imagen pública golangde Docker Hub admite la compilación con módulos Go. Si usas esta imagen como paso de compilación en tu archivo de configuración de Cloud Build, podrás invocar comandos de go en la imagen. Los argumentos transferidos a este paso de compilación se transfieren directamente a la herramienta golang, lo que te permite ejecutar cualquier comando go en esta imagen.

En esta sección se muestra cómo crear un archivo de configuración de compilación de ejemplo para una aplicación Go desde el repositorio de Git cloud-build-samples. El archivo de configuración de compilación incluye los pasos para compilar la aplicación, añadir pruebas unitarias y, una vez que se hayan superado las pruebas, implementar la aplicación.

Para compilar la aplicación de Go de ejemplo, haz lo siguiente:

  1. Configurar pruebas unitarias: si has definido pruebas unitarias en tu aplicación, puedes configurar Cloud Build para que las ejecute añadiendo los siguientes campos en un paso de compilación:

    • name: asigna el valor golang a este campo para usar la imagen de Go de Docker Hub en tu tarea.
    • entrypoint: asigna el valor /bin/bash a este campo. Esto te permite ejecutar comandos 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 transfiere a la imagen a la que hace referencia el campo name. En el siguiente ejemplo, el campo args toma los argumentos de:

      • Ejecutar el formateador de registros de prueba para descargar los resultados de los registros de prueba.
      • Imprimir la salida del registro.
      • Guardando los resultados de la prueba en sponge.log.
      • Genera los resultados en sponge.log en un archivo XML de JUNIT. El nombre del archivo XML de JUNIT se crea con la versión corta del ID de la confirmación asociada a tu compilación. En un paso de compilación posterior, los registros de este archivo se guardarán en Cloud Storage.

        steps:
          # Run tests and save to file
          - name: golang:1.23
            entrypoint: /bin/bash
            args:
              - -c
              - |
                go install github.com/jstemmer/go-junit-report/v2@latest
                2>&1 go test -timeout 1m -v ./... | /go/bin/go-junit-report -set-exit-code -iocopy -out ${SHORT_SHA}_test_log.xml
        
  2. Subir a Artifact Registry: en el archivo de configuración, usa el campo goModules para especificar la ruta de tu aplicación y tu repositorio de Go en Artifact Registry:

    # Upload Go module to artifact registry
    artifacts:
      goModules:
        - repositoryName: 'repositoryName'
          repositoryLocation: 'location'
          repositoryProjectId: 'projectId'
          sourcePath: 'sourcePath'
          modulePath: 'appPath'
          moduleVersion: 'version'
    

    Sustituye los siguientes valores:

    • repositoryName: el nombre de tu repositorio de Go en Artifact Registry.
    • location: la ubicación de tu repositorio en Artifact Registry.
    • projectId: el ID del Google Cloud proyecto que contiene tu repositorio de Artifact Registry.
    • sourcePath: la ruta al archivo go.mod en el espacio de trabajo de la compilación.
    • appPath: la ruta a la aplicación empaquetada.
    • version: el número de versión de tu aplicación, con el formato de números y puntos, como v1.0.1.
  3. Opcional: Habilitar la generación de procedencia

    Cloud Build puede generar metadatos de procedencia de compilación verificables de niveles de la cadena de suministro para artefactos de software (SLSA) para proteger tu flujo de integración continua.

    Para habilitar la generación de procedencia, añade requestedVerifyOption: VERIFIED a la sección options de tu archivo de configuración.

    Una vez que se haya completado la compilación, puedes ver los detalles del repositorio en Artifact Registry.

    También puedes ver los metadatos de procedencia de la compilación y validar la procedencia.

  4. Guardar registros de pruebas en Cloud Storage: puedes configurar Cloud Build para que almacene los registros de pruebas en Cloud Storage. Para ello, especifica la ubicación de un segmento y la ruta a los registros de pruebas.

    El siguiente paso de compilación almacena los registros de prueba que has guardado en el archivo XML de JUNIT en un segmento 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 de los pasos anteriores:

      steps:
        # Run tests and save to file
        - name: golang:1.23
          entrypoint: /bin/bash
          args:
            - -c
            - |
              go install github.com/jstemmer/go-junit-report/v2@latest
              2>&1 go test -timeout 1m -v ./... | /go/bin/go-junit-report -set-exit-code -iocopy -out ${SHORT_SHA}_test_log.xml
    
      # Store golang modules in Google Artifact Registry
      artifacts:
        goModules:
          - repositoryName: 'repositoryName'
            repositoryLocation: 'location'
            repositoryProjectId: 'projectId'
            sourcePath: 'sourcePath'
            modulePath: 'appPath'
            moduleVersion: 'version'
    
  5. Inicia la compilación con la CLI de gcloud o crea un activador de compilación:

Google Cloud CLI

 gcloud builds submit --region=us-west2 --config=cloudbuild.yaml \
     --substitutions=_AR_REPO_NAME="AR_REPO_NAME"

Activadores de compilación

Sigue los pasos que se indican en Crear un activador de compilación. En el campo Variables de sustitución, también debe proporcionar el nombre de su repositorio de Artifact Registry y el nombre de su segmento de Cloud Storage para los registros de prueba.

Siguientes pasos