Análisis detallado de Artifact Registry

1. Descripción general

Como la evolución de Container Registry, Artifact Registry permite que tu organización administre imágenes de contenedor y paquetes de lenguajes (como Maven y npm) en un solo lugar. Está completamente integrado a las herramientas y entornos de ejecución de Google Cloud y, además, incluye compatibilidad con la administración de dependencias basada en lenguajes para usarla con herramientas como npm y Maven. Esto facilita la integración con tus herramientas de CI/CD para configurar canalizaciones automatizadas.

En este lab, conocerás algunas funciones disponibles en Artifact Registry.

Qué aprenderás

¿Cuáles son los objetivos de aprendizaje de este lab?

  • Crear repositorios para contenedores y paquetes de lenguajes
  • Administra imágenes de contenedor con Artifact Registry
  • Integra Artifact Registry en Cloud Code
  • Configura Maven a fin de usar Artifact Registry para las dependencias de Java

2. Configuración y requisitos

Cómo configurar el entorno a tu propio ritmo

  1. Accede a Google Cloud Console y crea un proyecto nuevo o reutiliza uno existente. Si aún no tienes una cuenta de Gmail o de Google Workspace, debes crear una.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • El Nombre del proyecto es el nombre visible de los participantes de este proyecto. Es una string de caracteres que no se utiliza en las API de Google y se puede actualizar en cualquier momento.
  • El ID del proyecto debe ser único en todos los proyectos de Google Cloud y es inmutable (no se puede cambiar después de configurarlo). Cloud Console genera automáticamente una string única, que, por lo general, no importa cuál sea. En la mayoría de los codelabs, debes hacer referencia al ID del proyecto (suele ser PROJECT_ID). Por lo tanto, si no te gusta, genera otro aleatorio o prueba con uno propio y comprueba si está disponible. Después de crear el proyecto, este ID se “congela” y no se puede cambiar.
  • Además, hay un tercer valor, el Número de proyecto, que usan algunas API. Obtén más información sobre estos tres valores en la documentación.
  1. A continuación, deberás habilitar la facturación en Cloud Console para usar las API o los recursos de Cloud. Ejecutar este codelab no debería costar mucho, tal vez nada. Si quieres cerrar los recursos para no se te facture más allá de este instructivo, sigue las instrucciones de “limpieza” que se encuentran al final del codelab. Los usuarios nuevos de Google Cloud son aptos para participar en el programa Prueba gratuita de USD 300.

Configura gcloud

Establece el ID y número del proyecto en Cloud Shell. Guárdalos como variables PROJECT_ID y PROJECT_NUMBER.

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')

Habilitar los servicios de Google

gcloud services enable \
  cloudresourcemanager.googleapis.com \
  container.googleapis.com \
  artifactregistry.googleapis.com \
  containerregistry.googleapis.com \
  containerscanning.googleapis.com

Obtén el código fuente

El código fuente de este lab se encuentra en la organización GoogleCloudPlatform, en GitHub. Clónalo con el comando que aparece a continuación y, luego, cambia al directorio.

git clone https://github.com/GoogleCloudPlatform/cloud-code-samples/

Aprovisiona la infraestructura que se usa en este lab

En este lab, implementarás código en GKE. La siguiente secuencia de comandos de configuración prepara esta infraestructura por ti.

gcloud container clusters create container-dev-cluster --zone=us-central1-b

3. Trabaja con imágenes de contenedor

Crear un repositorio de Docker en Artifact Registry

Artifact Registry admite la administración de imágenes de contenedor y paquetes de lenguajes. Los distintos tipos de artefactos requieren diferentes especificaciones. Por ejemplo, las solicitudes para dependencias de Maven son diferentes de las solicitudes para dependencias de nodo.

Para admitir las diferentes especificaciones de la API, Artifact Registry necesita saber qué formato quieres que tengan las respuestas de la API. Para ello, crearás un repositorio y pasarás la marca --repository-format que indica el tipo de repositorio deseado

En Cloud Shell, ejecuta el siguiente comando para crear un repositorio de imágenes de Docker:

gcloud artifacts repositories create container-dev-repo --repository-format=docker \
--location=us-central1 --description="Docker repository for Container Dev Workshop"

Haz clic en Autorizar si aparece el mensaje de autorización de Cloud Shell.

Ve a la consola de Google Cloud - Artifact Registry - Repositorios y observa el repositorio de Docker que acabas de crear llamado container-dev-repo. Si haces clic en él, podrás ver que está vacío en este momento.

Configura la autenticación de Docker en Artifact Registry

Cuando te conectas a Artifact Registry, se requieren credenciales para proporcionar acceso. En lugar de configurar credenciales separadas, Docker puede configurarse para que use tus credenciales de gcloud sin problemas.

En Cloud Shell, ejecuta el siguiente comando para configurar Docker de modo que use Google Cloud CLI para autenticar las solicitudes a Artifact Registry en la región us-central1.

gcloud auth configure-docker us-central1-docker.pkg.dev

El comando solicitará una confirmación para cambiar la configuración de Docker de Cloud Shell. Presiona Intro.

Explora la aplicación de ejemplo

Se proporciona una aplicación de ejemplo en el repositorio de Git que clonaste en un paso anterior. Cambia al directorio de Java y revisa el código de la aplicación.

cd cloud-code-samples/java/java-hello-world

La carpeta contiene una aplicación de Java de ejemplo que procesa una página web simple. Además de varios archivos que no son relevantes para este lab específico, contiene el código fuente en la carpeta src y un Dockerfile que usaremos para compilar una imagen de contenedor de forma local.

Compila la imagen del contenedor

Para poder almacenar imágenes de contenedor en Artifact Registry, deberás crear una.

Ejecuta el siguiente comando para compilar la imagen del contenedor y etiquétala correctamente para enviarla a tu repositorio en el siguiente paso:

docker build -t us-central1-docker.pkg.dev/$PROJECT_ID/container-dev-repo/java-hello-world:tag1 .

Envía la imagen de contenedor a Artifact Registry

Ejecuta el siguiente comando para enviar la imagen de contenedor al repositorio creado anteriormente:

docker push us-central1-docker.pkg.dev/$PROJECT_ID/container-dev-repo/java-hello-world:tag1

Revisa la imagen en Artifact Registry

Ve a la consola de Google Cloud - Artifact Registry - Repositorios. Haz clic en container-dev-repo y verifica que la imagen java-hello-world esté allí. Haz clic en la imagen y observa la imagen etiquetada tag1. Puedes ver que el análisis de vulnerabilidades está en ejecución o ya se completó y que la cantidad de vulnerabilidades detectadas es visible.

9cb46d3689b3ed2.png

Haz clic en la cantidad de vulnerabilidades y verás la lista de vulnerabilidades detectadas en la imagen, con el nombre del boletín de CVE y la gravedad. Puedes hacer clic en VER en cada vulnerabilidad de la lista para obtener más detalles:

2b17e9d26d9dd7ea.png

4. Integración en Cloud Code

En esta sección, verás cómo usar el repositorio de imágenes de Docker de Artifact Registry con Cloud Code.

Implementa la aplicación en un clúster de GKE desde Cloud Code

Ejecuta el siguiente comando desde la carpeta java-hello-world para abrir el Editor de Cloud Shell y agregar la carpeta de la aplicación a su lugar de trabajo:

cloudshell workspace .

Se abrirá el editor de Cloud Shell con el explorador en la carpeta de la aplicación.

Si aparece una ventana emergente en la que se te solicita excluir del espacio de trabajo los archivos de configuración del proyecto de Java, haz clic en Exclude in workspace.

Para los siguientes pasos, deberás ingresar la ubicación de tu repositorio de Artifact Registry. El formato de la ubicación es el siguiente:

us-central1-docker.pkg.dev/<PROJECT_ID>/container-dev-repo

Para encontrar tu PROJECT_ID, ejecuta el siguiente comando en la terminal.

gcloud config get project

Haz clic en la barra de estado de Cloud Code (en la esquina inferior izquierda) y, luego, selecciona Run on Kubernetes.

e6e2b06467228e18.png

Cuando se te solicite, elige Yes para usar el contexto actual en kubeconfig que apunte al clúster de GKE container-dev-cluster aprovisionado para el lab

En la solicitud del registro de imágenes, ingresa la ubicación de la dirección que encontraste antes de asegurarte de reemplazar <PROJECT_ID> por su valor real

us-central1-docker.pkg.dev/<PROJECT_ID>/container-dev-repo

Cuando ejecutas Run en Kubernetes por primera vez, Cloud Code te solicita la ubicación del repositorio de la imagen de destino. Una vez proporcionada, la URL del repositorio se almacena en el archivo .vscode/launch.json, que se crea en la carpeta de la aplicación.

En el panel de resultados, verás que comienza la compilación de la imagen de la aplicación java-hello-world, la imagen se subió al repositorio de Artifact Registry configurado previamente.

Ve a Cloud Console: Artifact Registry - Repositorios. Haz clic en container-dev-repo, verifica que la imagen java-hello-world y anota una imagen nueva etiquetada como latest.

Revisa la aplicación implementada

Regresa al editor de Cloud Shell. Cuando se complete la implementación, Skaffold/Cloud Code imprimirá la URL expuesta a la que se reenvió el servicio. Haz clic en el vínculo Abrir la vista previa en la Web:

33257a43826b88ff.png

En la nueva ventana del navegador, verás la página de la app de Hello World.

d3e49693b0383a5d.png

Actualiza el código de la aplicación

Ahora, actualiza la aplicación para ver el cambio implementado de inmediato en la implementación en el clúster:

Abre HelloWorldController.java en la carpeta src/main/java/cloudcode/helloworld/web en el editor de Cloud Shell.

Cambia el texto en la fila 20 de “It's running!”. “It's updated!””, deberías ver que el proceso de compilación y de implementación comienza de inmediato.

Al final de la implementación, vuelve a hacer clic en la URL reenviada o actualiza la ventana del navegador con la aplicación para ver el cambio implementado:

41787b1da54ff137.png

Una vez más, ve a Cloud Console: Artifact Registry - Repositorios. Haz clic en container-dev-repo, verifica la imagen java-hello-world y anota la imagen nueva.

5. Cómo trabajar con paquetes de lenguaje

En esta sección, verás cómo configurar un repositorio Java de Artifact Registry y subir paquetes a él para aprovecharlos en diferentes aplicaciones.

Crea un repositorio de paquetes de Java

En Cloud Shell, ejecuta el siguiente comando para crear un repositorio de artefactos de Java:

gcloud artifacts repositories create container-dev-java-repo \
    --repository-format=maven \
    --location=us-central1 \
    --description="Java package repository for Container Dev Workshop"

Haz clic en Autorizar si aparece el mensaje de autorización de Cloud Shell.

Ve a la consola de Google Cloud - Artifact Registry - Repositorios y observa el repositorio de Maven que acabas de crear llamado container-dev-java-repo. Si haces clic en él, podrás ver que está vacío en este momento.

Configurar la autenticación del repositorio de artefactos

Usa el siguiente comando para actualizar la ubicación conocida de las credenciales predeterminadas de la aplicación (ADC) con las credenciales de tu cuenta de usuario, de modo que el auxiliar de credenciales de Artifact Registry pueda autenticarse con ellas cuando se conecte con los repositorios:

gcloud auth login --update-adc

Configura Maven para Artifact Registry

Ejecuta el siguiente comando para imprimir la configuración del repositorio que se agregará a tu proyecto de Java:

gcloud artifacts print-settings mvn \
    --repository=container-dev-java-repo \
    --location=us-central1

Abre el archivo pom.xml en el Editor de Cloud Shell y agrega la configuración que se muestra a las secciones correspondientes del archivo.

Actualiza la sección distributionManagement.

<distributionManagement>
   <snapshotRepository>
     <id>artifact-registry</id>
     <url>artifactregistry://us-central1-maven.pkg.dev/<PROJECT>/container-dev-java-repo</url>
   </snapshotRepository>
   <repository>
     <id>artifact-registry</id>
     <url>artifactregistry://us-central1-maven.pkg.dev/<PROJECT>/container-dev-java-repo</url>
   </repository>
</distributionManagement>

Actualiza la sección repositories.

 <repositories>
   <repository>
     <id>artifact-registry</id>
     <url>artifactregistry://us-central1-maven.pkg.dev/<PROJECT>/container-dev-java-repo</url>
     <releases>
       <enabled>true</enabled>
     </releases>
     <snapshots>
       <enabled>true</enabled>
     </snapshots>
   </repository>
 </repositories>

Actualiza las extensiones.

<extensions>
     <extension>
       <groupId>com.google.cloud.artifactregistry</groupId>
       <artifactId>artifactregistry-maven-wagon</artifactId>
       <version>2.1.0</version>
     </extension>
   </extensions>

Este es un ejemplo del archivo completo para que lo consultes. Asegúrate de reemplazar <PROJECT> con tu ID del proyecto.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 
 <artifactId>hello-world</artifactId>
 <packaging>jar</packaging>
 <name>Cloud Code Hello World</name>
 <description>Getting started with Cloud Code</description>
 <version>1.0.0</version>
<distributionManagement>
   <snapshotRepository>
     <id>artifact-registry</id>
     <url>artifactregistry://us-central1-maven.pkg.dev/<PROJECT>/container-dev-java-repo</url>
   </snapshotRepository>
   <repository>
     <id>artifact-registry</id>
     <url>artifactregistry://us-central1-maven.pkg.dev/<PROJECT>/container-dev-java-repo</url>
   </repository>
 </distributionManagement>
 
 <repositories>
   <repository>
     <id>artifact-registry</id>
     <url>artifactregistry://us-central1-maven.pkg.dev/<PROJECT>/container-dev-java-repo</url>
     <releases>
       <enabled>true</enabled>
     </releases>
     <snapshots>
       <enabled>true</enabled>
     </snapshots>
   </repository>
 </repositories>
 
 <parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId>
   <version>2.6.3</version>
 </parent>
 
 <properties>
   <java.version>1.8</java.version>
   <checkstyle.config.location>./checkstyle.xml</checkstyle.config.location>
 </properties>
 
 <build>
   <plugins>
     <plugin>
       <groupId>com.google.cloud.tools</groupId>
       <artifactId>jib-maven-plugin</artifactId>
       <version>3.2.0</version>
     </plugin>
     <plugin>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-maven-plugin</artifactId>
     </plugin>
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-checkstyle-plugin</artifactId>
       <version>3.1.2</version>
     </plugin>
   </plugins>
   <extensions>
     <extension>
       <groupId>com.google.cloud.artifactregistry</groupId>
       <artifactId>artifactregistry-maven-wagon</artifactId>
       <version>2.1.0</version>
     </extension>
   </extensions>
 </build>
 
 <!-- The Spring Cloud GCP BOM will manage spring-cloud-gcp version numbers for you. -->
 <dependencyManagement>
   <dependencies>
     <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-gcp-dependencies</artifactId>
       <version>1.2.8.RELEASE</version>
       <type>pom</type>
       <scope>import</scope>
     </dependency>
   </dependencies>
 </dependencyManagement>
  
 <dependencies>
 
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter</artifactId>
   </dependency>
 
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-jetty</artifactId>
   </dependency>
 
   <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-webmvc</artifactId>
   </dependency>
 
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-thymeleaf</artifactId>
   </dependency>
 
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-test</artifactId>
     <scope>test</scope>
   </dependency>
 
   <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-gcp-starter-logging</artifactId>
   </dependency>
      
 </dependencies>
 
</project>

Sube tu paquete de Java a Artifact Registry

Con Artifact Registry configurado en Maven, ahora puedes usar Artifact Registry para almacenar Java Jars y usarlo en otros proyectos de tu organización.

Ejecuta el siguiente comando para subir tu paquete de Java a Artifact Registry:

mvn deploy

Verifica el paquete de Java en Artifact Registry

Ve a Cloud Console: Artifact Registry - Repositorios Haz clic en container-dev-java-repo y verifica que el artefacto binario hello-world esté allí:

e348d976ac1ac107.png

6. ¡Felicitaciones!

¡Felicitaciones! Completaste el codelab.

Temas abordados

  • Repositorios creados para contenedores y paquetes de lenguajes
  • Imágenes de contenedor administradas con Artifact Registry
  • Integración de Artifact Registry con Cloud Code
  • Se configuró Maven a fin de usar Artifact Registry para las dependencias de Java

Limpieza

Ejecuta el siguiente comando para borrar el proyecto

gcloud projects delete $PROJECT_ID