Almacenar artefactos en Artifact Registry

En esta página se describe cómo configurar Cloud Build para almacenar artefactos compilados en un repositorio de Artifact Registry.

Antes de empezar

  1. Si el repositorio de destino no existe en Artifact Registry, cree un repositorio.
  2. Si Cloud Build y tu repositorio están en proyectos diferentes o si usas una cuenta de servicio especificada por el usuario para ejecutar compilaciones, concede el rol Escritor de Artifact Registry a la cuenta de servicio de compilación en el proyecto que contenga los repositorios.

    La cuenta de servicio predeterminada de Cloud Build tiene acceso para realizar las siguientes acciones con un repositorio del mismo proyecto: Google Cloud

Configurar una compilación de Docker

Una vez que hayas concedido permisos al repositorio de destino, podrás configurar la compilación.

Para configurar la compilación, sigue estos pasos:

  1. En el archivo de configuración de compilación, añade el paso para compilar y etiquetar la imagen.

    steps:
    - name: 'gcr.io/cloud-builders/docker'
      args: [ 'build', '-t', '${_LOCATION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY}/${_IMAGE}', '.' ]
    images:
    - '${_LOCATION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY}/${_IMAGE}'
    

    Este fragmento usa sustituciones de Cloud Build. Este método es útil si quieres usar el mismo archivo de configuración de compilación para enviar imágenes a repositorios de diferentes entornos, como pruebas, staging o producción.

    • ${_LOCATION}, ${_REPOSITORY} y ${_IMAGE} son sustituciones definidas por el usuario para la ubicación del repositorio, el nombre del repositorio y la imagen. Los valores de estas variables se especifican en tiempo de compilación.
    • $PROJECT_ID es una sustitución predeterminada que Cloud Build resuelve con el Google Cloud ID de proyecto de la compilación.

      • Si ejecutas el comando gcloud builds submit, Cloud Build usará el ID del proyecto activo en la sesión de gcloud.
      • Si usas un activador de compilación, Cloud Build utiliza el ID del proyecto en el que se está ejecutando.

      También puedes usar una sustitución definida por el usuario en lugar de $PROJECT_ID para especificar un ID de proyecto en tiempo de compilación.

  2. Cuando estés listo para ejecutar la compilación, especifica los valores de las sustituciones definidas por el usuario. Por ejemplo, este comando sustituye lo siguiente:

    • us-east1 para la ubicación del repositorio
    • my-repo para el nombre del repositorio
    • my-image para el nombre de la imagen
    gcloud builds submit --config=cloudbuild.yaml \
      --substitutions=_LOCATION="us-east1",_REPOSITORY="my-repo",_IMAGE="my-image" .
    

Configurar una compilación de Go

Una vez que hayas concedido permisos al repositorio de destino, podrás configurar la compilación. En las siguientes instrucciones se describe cómo configurar tu compilación para subir un módulo de Go a un repositorio de Go.

Para configurar la compilación, sigue estos pasos:

  1. Para subir un módulo de Go a tu repositorio de Go en tu compilación, añade los siguientes pasos a tu archivo de configuración de compilación:

    steps:
    - name: gcr.io/cloud-builders/gcloud
    args:
    - 'artifacts'
    - 'go'
    - 'upload'
    - '--project=$PROJECT_ID'
    - '--location=${_LOCATION}'
    - '--repository=${_REPOSITORY}'
    - '--module-path=${_MODULE_PATH}'
    - '--version=$TAG_NAME'
    

    El archivo de configuración de compilación incluye sustituciones de Cloud Build. Este método es útil si quieres usar el mismo archivo de configuración de compilación para subir paquetes a repositorios de diferentes entornos, como pruebas, preproducción o producción.

    • ${_LOCATION}, ${_REPOSITORY} y ${_MODULE_PATH} son sustituciones definidas por el usuario para la ubicación del repositorio, el nombre del repositorio y la ruta del módulo. Los valores de estas variables se especifican en tiempo de compilación.
    • $PROJECT_ID y $TAG_NAME son sustituciones predeterminadas que Cloud Build sustituye por lo siguiente:

      • $PROJECT_ID se sustituye por el Google Cloud ID del proyecto de la compilación.

        • Si ejecutas el comando gcloud builds submit, Cloud Build usará el ID del proyecto activo en la sesión de gcloud.
        • Si usas un activador de compilación, Cloud Build utiliza el ID del proyecto en el que se está ejecutando.

        También puedes usar una sustitución definida por el usuario en lugar de $PROJECT_ID para especificar un ID de proyecto en tiempo de compilación.

      • $TAG_NAME se sustituye por el nombre de tu etiqueta para admitir la convención de Go de usar etiquetas de Git como números de versión.

  2. Para instalar el paquete desde el repositorio de Go, añade los siguientes pasos a tu archivo de configuración de compilación:

    • Añade un endpoint regional de Cloud Build en la ubicación de tu repositorio al archivo .netrc.
    • Ejecuta la herramienta de asistencia de credenciales para actualizar los tokens de OAuth.
    • Ejecuta el comando go run. También puedes cambiarlo a go build para compilar el módulo, go test para ejecutar pruebas o go mod tidy para descargar las dependencias.

    En el paso del comando go, GOPROXY se define en el repositorio de Cloud Build que aloja las dependencias privadas. Puedes añadir el proxy público a la lista GOPROXY separada por comas si el módulo tiene dependencias públicas.

    steps:
    - name: golang
      entrypoint: go
      args: ['run', 'github.com/GoogleCloudPlatform/artifact-registry-go-tools/cmd/auth@v0.1.0', 'add-locations', '--locations=${_LOCATION}']
      env:
      # Set GOPROXY to the public proxy to pull the credential helper tool
      - 'GOPROXY=https://proxy.golang.org'
    - name: golang
      entrypoint: go
      args: ['run', 'github.com/GoogleCloudPlatform/artifact-registry-go-tools/cmd/auth@v0.1.0', 'refresh']
      env:
      # Set GOPROXY to the public proxy to pull the credential helper tool
      - 'GOPROXY=https://proxy.golang.org'
    - name: golang
      entrypoint: go
      args: ['run', '.']
      env:
      - 'GOPROXY=https://${_LOCATION}-go.pkg.dev/${_PROJECT_ID}/${_REPOSITORY}'
    options:
      env:
      # Disable GO sumdb checks for private modules.
      - 'GONOSUMDB=${_MODULE_PATH}'
    
  3. Cuando estés listo para ejecutar la compilación, especifica los valores de las sustituciones definidas por el usuario. Por ejemplo, este comando sustituye lo siguiente:

    • us-east1 para la ubicación del repositorio
    • my-project para el ID del proyecto
    • my-repo para el nombre del repositorio
    • example.com/greetings para la ruta del módulo
    gcloud builds submit --config=cloudbuild.yaml \
      --substitutions=_LOCATION="us-east1",_PROJECT_ID="my-project",_REPOSITORY="my-repo",_MODULE_PATH="example.com/greetings" .
    

Configurar una compilación de Java

Una vez que hayas concedido permisos al repositorio de destino, podrás configurar la compilación. En las siguientes instrucciones se describe cómo configurar tu compilación para subir un paquete Java a un repositorio Maven.

Para configurar la compilación, sigue estos pasos:

  1. Configura la autenticación para Maven. Asegúrate de especificar el proyecto y el repositorio de destino correctos en el archivo pom.xml.

  2. En el archivo de configuración de compilación de Cloud Build, añade el paso para subir el paquete con Maven:

    steps:
    - name: gcr.io/cloud-builders/mvn
      args: ['deploy']
    
  3. Cuando tengas listo el archivo de configuración de compilación, inicia la compilación con el siguiente comando:

    gcloud builds submit
    

Configurar una compilación de Node.js

Una vez que hayas concedido permisos al repositorio de destino, podrás configurar la compilación. En las siguientes instrucciones se describe cómo configurar tu compilación para subir un paquete de Node.js a un repositorio de npm.

Para configurar la compilación, sigue estos pasos:

  1. Añade tu repositorio de Artifact Registry al archivo .npmrc de tu proyecto de Node.js. El archivo se encuentra en el directorio con el archivo package.json.

    @SCOPE:registry=https://LOCATION-npm.pkg.dev/PROJECT_ID/REPOSITORY
    //LOCATION-npm.pkg.dev/PROJECT_ID/REPOSITORY/:always-auth=true
    
    • SCOPE-NAME es el nombre del ámbito de npm que se va a asociar al repositorio. Al usar ámbitos, te aseguras de que siempre publicas e instalas paquetes desde el repositorio correcto.
    • PROJECT_ID es el ID de tu proyecto Google Cloud .
    • LOCATION es la ubicación regional o multirregional del repositorio.
    • REPOSITORY es el nombre del repositorio.
  2. Añade una secuencia de comandos al archivo package.json de tu proyecto que actualice el token de acceso para autenticarte en el repositorio.

    "scripts": {
     "artifactregistry-login": "npx google-artifactregistry-auth"
    }
    
  3. En el archivo de configuración de compilación, añade el paso para subir el paquete al repositorio.

    steps:
    - name: gcr.io/cloud-builders/npm
      args: ['run', 'artifactregistry-login']
    - name: gcr.io/cloud-builders/npm
      args: ['publish', '${_PACKAGE}']
    

    ${_PACKAGE} es una sustitución de Cloud Build que representa el directorio de tu proyecto de Node.js. Puedes especificar el directorio al ejecutar el comando para compilar.

    Por ejemplo, este comando sube el paquete desde un directorio llamado src:

    gcloud builds submit --config=cloudbuild.yaml \
        --substitutions=_PACKAGE="src" .
    

Configurar una compilación de Python

Una vez que hayas concedido permisos al repositorio de destino, podrás configurar la compilación. En las siguientes instrucciones se describe cómo configurar tu compilación para subir un paquete de Python a un repositorio de Python e instalar el paquete con pip.

Para compilar y contenerizar una aplicación de Python y, a continuación, insertarla en un repositorio de Docker, consulta el artículo Desarrollar aplicaciones de Python en la documentación de Cloud Build.

Para configurar la compilación, sigue estos pasos:

  1. En el directorio que contiene el archivo de configuración de compilación de Cloud Build, crea un archivo llamado requirements.txt con las siguientes dependencias:

    twine
    keyrings.google-artifactregistry-auth
    
    • Twine se usa para subir paquetes a Artifact Registry.
    • keyrings.google-artifactregistry-auth es el backend del llavero de claves de Artifact Registry que gestiona la autenticación con Artifact Registry para pip y Twine.
  2. Para subir un paquete de Python a tu repositorio de Python en tu compilación, añade los siguientes pasos al archivo de configuración de la compilación:

    steps:
    - name: python
      entrypoint: pip
      args: ["install", "-r", "requirements.txt", "--user"]
    - name: python
      entrypoint: python
      args:
      - '-m'
      - 'twine'
      - 'upload'
      - '--repository-url'
      - 'https://${_LOCATION}-python.pkg.dev/$PROJECT_ID/${_REPOSITORY}/'
      - 'dist/*'
    

    En este fragmento, el primer paso instala Twine y el backend del llavero de Artifact Registry. En el segundo paso se suben los archivos de Python compilados en el subdirectorio dist. Ajusta las rutas de requirements.txt y tus archivos Python compilados si no coinciden con el fragmento.

    La ruta del repositorio incluye sustituciones de Cloud Build. Este método es útil si quieres usar el mismo archivo de configuración de compilación para subir paquetes a repositorios de diferentes entornos, como pruebas, preproducción o producción.

    • ${_LOCATION} y ${_REPOSITORY} son sustituciones definidas por el usuario para la ubicación del repositorio, el nombre del repositorio y el nombre del paquete. Los valores de estas variables se especifican en tiempo de compilación.
    • $PROJECT_ID es una sustitución predeterminada que Cloud Build resuelve con el Google Cloud ID de proyecto de la compilación.

      • Si ejecutas el comando gcloud builds submit, Cloud Build usará el ID del proyecto activo en la sesión de gcloud.
      • Si usas un activador de compilación, Cloud Build utiliza el ID del proyecto en el que se está ejecutando.

      También puedes usar una sustitución definida por el usuario en lugar de $PROJECT_ID para especificar un ID de proyecto en tiempo de compilación.

  3. Para instalar el paquete desde el repositorio de Python, añade un paso al archivo de configuración de compilación que ejecute el comando pip install.

      steps:
      - name: python
        entrypoint: pip
        args:
        - 'install'
        - '--index-url'
        - 'https://${_LOCATION}-python.pkg.dev/$PROJECT_ID/${_REPOSITORY}/simple/'
        - '${_PACKAGE}'
        - '--verbose'
    

    Este fragmento incluye una sustitución ${_PACKAGE} adicional para el nombre del paquete.

  4. Cuando estés listo para ejecutar la compilación, especifica los valores de las sustituciones definidas por el usuario. Por ejemplo, este comando sustituye lo siguiente:

    • us-east1 para la ubicación del repositorio
    • my-repo para el nombre del repositorio
    • my-package del nombre del paquete
    gcloud builds submit --config=cloudbuild.yaml \
      --substitutions=_LOCATION="us-east1",_REPOSITORY="my-repo",_PACKAGE="my-package" .
    

Almacenar artefactos en un registro privado con certificados autofirmados

Si tienes una autoridad de certificación privada y necesitas almacenar artefactos en un registro privado, puedes configurar tu archivo de configuración de compilación para que use certificados autofirmados. Para ello, añade un paso de compilación que envíe tu certificado al sistema host para que esté disponible en los pasos de compilación posteriores. Por ejemplo:

- name: gcr.io/cloud-builders/docker
  args:
    - run
    - --rm
    - --volume=/etc/docker/certs.d/:/etc/docker/certs.d/
    - --volume=certificates:/certificates
    - ubuntu
    - bash
    - -c
    - |
      cp /certificates/ca.crt /etc/docker/certs.d/quay.apps.cloud.inter
  volumes:
    - name: certificates
      path: /certificates

Siguientes pasos