Protección del suministro de software

1. Descripción general

Artifact Registry te permite almacenar diferentes tipos de artefactos, crear varios repositorios en un solo proyecto y asociar una región o multirregión específica con cada repositorio. Hay varios modos de repositorio. Cada modo tiene un propósito diferente. En el siguiente diagrama, se muestra una de las muchas formas posibles en las que puedes usar los repositorios en diferentes modos juntos. En el diagrama, se muestra un flujo de trabajo en dos proyectos de Google Cloud. En un proyecto de desarrollo, los desarrolladores compilan una aplicación de Java. En un proyecto de entorno de ejecución independiente, otra compilación crea una imagen de contenedor con la aplicación para implementarla en Google Kubernetes Engine.

5af5e4da3ccfdff3.png

En este lab, aprenderás a realizar las siguientes tareas.

  • Usa Standard Repositories para implementar tus paquetes privados
  • Usa repositorios remotos para almacenar en caché paquetes de Maven Central.
  • Usar repositorios virtuales para combinar varios repositorios ascendentes en una configuración

Configuración del entorno de autoaprendizaje

  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 cadena de caracteres que no se utiliza en las APIs de Google. Puedes actualizarla en cualquier momento.
  • El ID del proyecto es único en todos los proyectos de Google Cloud y es inmutable (no se puede cambiar después de configurarlo). La consola de Cloud genera automáticamente una cadena única. por lo general, no te importa qué es. En la mayoría de los codelabs, deberás hacer referencia al ID del proyecto (por lo general, se identifica como PROJECT_ID). Si no te gusta el ID generado, puedes generar otro aleatorio. También puedes probar el tuyo propio y ver si está disponible. No se puede cambiar después de este paso y se mantendrá mientras dure el proyecto.
  • Para tu información, hay un tercer valor, un número de proyecto, que usan algunas APIs. 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 la consola de Cloud para usar las APIs o los recursos de Cloud. Ejecutar este codelab no debería costar mucho, tal vez nada. Para cerrar recursos y evitar que se te facture más allá de este instructivo, puedes borrar los recursos que creaste o borrar todo el proyecto. Los usuarios nuevos de Google Cloud son aptos para participar en el programa Prueba gratuita de USD 300.

Configuración de Workspace

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)')

Habilita las APIs

gcloud services enable artifactregistry.googleapis.com

Clone el repositorio

git clone https://github.com/GoogleCloudPlatform/java-docs-samples
cd java-docs-samples/container-registry/container-analysis

2. Repositorios estándar

Los repositorios estándar proporcionan una manera de almacenar tus paquetes privados y compartirlos con tus otras aplicaciones.

Crea un repositorio estándar de Maven

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 - Repositories y observa el repositorio de Maven recién creado, llamado container-dev-java-repo. Si haces clic en él, podrás ver que está vacío en este momento.

gcloud artifacts repositories describe container-dev-java-repo \
    --location=us-central1

Se debería mostrar una respuesta similar a la siguiente

Encryption: Google-managed key
Repository Size: 0.000MB
createTime: '2023-03-21T19:01:45.461589Z'
description: Java package repository for Container Dev Workshop
format: MAVEN
mavenConfig: {}
mode: STANDARD_REPOSITORY
name: projects/qwiklabs-gcp-03-4304110dc461/locations/us-central1/repositories/container-dev-java-repo
updateTime: '2023-03-21T19:01:45.461589Z'

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

El comando anterior muestra xml que se agregará a tus proyectos pom.xml.

  • En la sección repositories, se especifica el lugar en el que Maven puede descargar artefactos remotos para que los use el proyecto actual.
  • En la sección distributionManagement, especifica a qué repositorio remoto enviará el proyecto cuando se implemente.
  • La sección extensions (extensiones) agrega artifactregistry-maven-wagon, que habilita la capa de autenticación y transporte necesaria para conectarse a Artifact Registry
  • Nota: Las extensiones pueden existir en pom.xml o extensions.xml. En los casos en que el proyecto depende de un proyecto superior, se accede a esas dependencias antes de que se cargue el resto de las entradas en el archivo pom.xml. Para garantizar que el elemento superior tenga acceso a la extensión, se puede colocar en un archivo extensions.xml que se carga antes que el archivo pom.xml, de modo que esté disponible para las dependencias superiores.

Copia las tres secciones y, luego, abre pom.xml en el editor de Cloud Shell y agrega la configuración que se muestra al final del archivo, justo dentro de la etiqueta de cierre project.

Sugerencia: En cloudshell, ejecuta el siguiente comando en la terminal para abrir el editor en el directorio actual.

cloudshell workspace .

Ejemplo: (los nombres de tus proyectos serán diferentes en las URLs)

  ...

  <distributionManagement>
    <snapshotRepository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
    </snapshotRepository>
    <repository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
    </repository>
  </distributionManagement>

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

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

</project>

Sube tu paquete de Java a Artifact Registry

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

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

mvn deploy -DskipTests

Si quieres volver a ejecutar este comando, asegúrate de aumentar la versión en el archivo pom.xml.

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í:

147eac5168648db1.png

3. Repositorios remotos

Los repositorios remotos proporcionan la capacidad de almacenar en caché paquetes de terceros para aumentar la confiabilidad y la seguridad.

Crea un repositorio remoto

Nota: Para obtener detalles sobre la autenticación y la configuración, consulta la documentación del producto.

En Cloud Shell, ejecuta el siguiente comando para crear un repositorio remoto para los artefactos de Maven Central:

gcloud artifacts repositories create maven-central-cache \
    --project=$PROJECT_ID \
    --repository-format=maven \
    --location=us-central1 \
    --description="Remote repository for Maven Central caching" \
    --mode=remote-repository \
    --remote-repo-config-desc="Maven Central" \
    --remote-mvn-repo=MAVEN-CENTRAL

Revisa el repo en la consola

Ve a Cloud Console: Artifact Registry - Repositorios. Haz clic en maven-central-cache y observa que se creó y que actualmente está vacía

Revisa el repositorio en la terminal

gcloud artifacts repositories describe maven-central-cache \
    --location=us-central1

Integra el repo en tu proyecto

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=maven-central-cache \
    --location=us-central1

Agrega la sección del repositorio a tu pom.xml. Asegúrate de no copiar los <repositories> externos. etiqueta del resultado.

Cambia el ID del repositorio recién agregado a “central”. para garantizar que cada entrada del repositorio tenga un ID único.

Ejemplo: (los nombres de tus proyectos serán diferentes en las URLs)

  ...

  <distributionManagement>
    <snapshotRepository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
    </snapshotRepository>
    <repository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
    </repository>
  </distributionManagement>

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

    <repository>
      <id>central</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/maven-central-cache</url>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
    </repository>


  </repositories>

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

</project>

Ejecuta los siguientes comandos en la terminal a fin de crear un extensions.xml para tu proyecto. Para usar el mecanismo de extensiones principales, asegúrate de que Maven pueda resolver dependencias superiores o de complementos de Artifact Registry.

mkdir .mvn 
cat > .mvn/extensions.xml << EOF
<extensions xmlns="http://maven.apache.org/EXTENSIONS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/EXTENSIONS/1.0.0 http://maven.apache.org/xsd/core-extensions-1.0.0.xsd">
  <extension>
    <groupId>com.google.cloud.artifactregistry</groupId>
    <artifactId>artifactregistry-maven-wagon</artifactId>
    <version>2.2.0</version>
  </extension>
</extensions>
EOF

Extrae dependencias del repositorio remoto

Ejecuta el siguiente comando para compilar tu aplicación usando el repositorio remoto:

rm -rf ~/.m2/repository 
mvn compile

Revisa los paquetes en la consola

Ve a Cloud Console: Artifact Registry - Repositorios Haz clic en maven-central-cache y verifica que los artefactos binarios estén almacenados en caché allí:

9deea93caa5fefd7.png

4. Repositorios virtuales

Los repositorios virtuales actúan como una interfaz para que se pueda acceder a múltiples repositorios a través de una sola configuración. Esto simplifica la configuración del cliente para los consumidores de tus artefactos y aumenta la seguridad, ya que mitiga los ataques de confusión de dependencias.

Crea un archivo de política

cat > ./policy.json << EOF
[
  {
    "id": "private",
    "repository": "projects/${PROJECT_ID}/locations/us-central1/repositories/container-dev-java-repo",
    "priority": 100
  },
  {
    "id": "central",
    "repository": "projects/${PROJECT_ID}/locations/us-central1/repositories/maven-central-cache",
    "priority": 80
  }
]

EOF

Crea el repositorio virtual

gcloud artifacts repositories create virtual-maven-repo \
    --project=${PROJECT_ID} \
    --repository-format=maven \
    --mode=virtual-repository \
    --location=us-central1 \
    --description="Virtual Maven Repo" \
    --upstream-policy-file=./policy.json

Integra el repo en tu proyecto

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=virtual-maven-repo \
    --location=us-central1

Reemplaza toda la sección de repositorios en tu pom con la sección de repositorios virtuales de la salida.

Ejemplo: (los nombres de tus proyectos serán diferentes en las URLs)

  ...


  <distributionManagement>
    <snapshotRepository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
    </snapshotRepository>
    <repository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
    </repository>
  </distributionManagement>

  <repositories>
    <repository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/virtual-maven-repo</url>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
    </repository>
  </repositories>

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

</project>


Extrae dependencias del repositorio virtual

Dado que el repositorio virtual es una transferencia y no almacenará paquetes reales, para demostrar claramente el proceso, deberás borrar el repositorio maven-central-cache que creaste anteriormente y volver a crearlo para comenzar de nuevo con un repositorio vacío.

Ejecuta los siguientes comandos para volver a crear el repositorio de caché

gcloud artifacts repositories delete maven-central-cache \
    --project=$PROJECT_ID \
    --location=us-central1 \
    --quiet

gcloud artifacts repositories create maven-central-cache \
    --project=$PROJECT_ID \
    --repository-format=maven \
    --location=us-central1 \
    --description="Remote repository for Maven Central caching" \
    --mode=remote-repository \
    --remote-repo-config-desc="Maven Central" \
    --remote-mvn-repo=MAVEN-CENTRAL

Puedes revisar el repositorio vacío en la consola. Ve a Cloud Console: Artifact Registry - Repositorios

Ahora ejecuta el repositorio virtual compilando tu proyecto con el siguiente comando

rm -rf ~/.m2/repository 
mvn compile

Revisa los paquetes en la consola

Ve a Cloud Console: Artifact Registry - Repositorios Haz clic en maven-central-cache y verifica que los artefactos binarios se hayan configurado para extraerse del repositorio virtual, pero que, en última instancia, se extrajeron de maven-central-cache:

9deea93caa5fefd7.png

5. ¡Felicitaciones!

¡Felicitaciones! Completaste el codelab.

Temas abordados

  • Usaste Standard Repositories para implementar tus paquetes privados
  • Se usaron repositorios remotos para almacenar en caché paquetes de Maven Central.
  • Usó repositorios virtuales para combinar varios repositorios ascendentes en un archivo de configuración.

Limpieza

Ejecuta el siguiente comando para borrar el proyecto

gcloud projects delete ${PROJECT_ID}

Última actualización: 22 de marzo de 2023