Uso de instantáneas de Maven - CodeArtifact

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Uso de instantáneas de Maven

Una instantánea de Maven es una versión especial de un paquete de Maven que hace referencia al código de rama de producción más reciente. Es una versión de desarrollo que precede a la versión de lanzamiento final. Puede identificar una versión instantánea de un paquete de Maven por el sufijo SNAPSHOT que se adjunta a la versión del paquete. Por ejemplo, la instantánea de la versión 1.1 es 1.1-SNAPSHOT. Para obtener más información, consulte What is a SNAPSHOT version? en el sitio web del Proyecto Apache Maven.

AWS CodeArtifact admite la publicación y el consumo de instantáneas de Maven. Las instantáneas únicas que utilizan un número de versión basado en el tiempo son las únicas instantáneas compatibles. CodeArtifact no admite instantáneas no únicas generadas por los clientes de Maven 2. Puede publicar una instantánea de Maven compatible en cualquier repositorio de CodeArtifact.

Publicación de instantáneas en CodeArtifact

AWS CodeArtifact admite los patrones de solicitud que los clientes, por ejemplo mvn, utilizan al publicar instantáneas. Por eso, puede seguir la documentación de su herramienta de compilación o administrador de paquetes sin tener una comprensión detallada de cómo se publican las instantáneas de Maven. Si está haciendo algo más complejo, en esta sección se describe en detalle cómo CodeArtifact gestiona las instantáneas.

Cuando se publica una instantánea de Maven en un repositorio de CodeArtifact, su versión anterior se conserva en una nueva versión llamada compilación. Cada vez que se publica una instantánea de Maven, se crea una nueva versión de compilación. Todas las versiones anteriores de una instantánea se mantienen en sus versiones de compilación. Cuando se publica una instantánea de Maven, el estado de la versión del paquete se establece en Published y el estado de la compilación que contiene la versión anterior se establece en Unlisted. Este comportamiento solo se aplica a las versiones del paquete de Maven en las que la versión del paquete tiene un sufijo -SNAPSHOT.

Por ejemplo, las versiones instantáneas de un paquete Maven denominado com.mycompany.myapp:pkg-1 se cargan en un repositorio de CodeArtifact denominado my-maven-repo. La versión de instantánea es 1.0-SNAPSHOT. Hasta el momento, no se ha publicado ninguna versión de com.mycompany.myapp:pkg-1. En primer lugar, los activos de la versión inicial se publican en las siguientes rutas:

PUT maven/my-maven-repo/com/mycompany/myapp/pkg-1/1.0-SNAPSHOT/pkg-1-1.0-20210728.194552-1.jar PUT maven/my-maven-repo/com/mycompany/myapp/pkg-1/1.0-SNAPSHOT/pkg-1-1.0-20210728.194552-1.pom

Tenga en cuenta que la marca de tiempo 20210728.194552-1 la genera el cliente que publica las compilaciones instantáneas.

Una vez cargados los archivos .pom y .jar, la única versión de com.mycompany.myapp:pkg-1 que existe en el repositorio es 1.0-20210728.194552-1. Esto ocurre aunque lo sea la versión especificada en la ruta anterior sea 1.0-SNAPSHOT. El estado de la versión del paquete en este momento es Unfinished.

aws codeartifact list-package-versions --domain my-domain --repository \ my-maven-repo --package pkg-1 --namespace com.mycompany.myapp --format maven { "versions": [ { "version": "1.0-20210728.194552-1", "revision": "GipMW+599JmwTcTLaXo9YvDsVQ2bcrrk/02rWJhoKUU=", "status": "Unfinished" } ], "defaultDisplayVersion": null, "format": "maven", "package": "pkg-1", "namespace": "com.mycompany.myapp" }

A continuación, el cliente carga el archivo maven-metadata.xml de la versión del paquete:

PUT my-maven-repo/com/mycompany/myapp/pkg-1/1.0-SNAPSHOT/maven-metadata.xml

Cuando el archivo maven-metadata.xml se carga correctamente, CodeArtifact crea la versión del paquete 1.0-SNAPSHOT y establece la versión 1.0-20210728.194552-1 en Unlisted.

aws codeartifact list-package-versions --domain my-domain --repository \ my-maven-repo --package pkg-1 --namespace com.mycompany.myapp --format maven { "versions": [ { "version": "1.0-20210728.194552-1", "revision": "GipMW+599JmwTcTLaXo9YvDsVQ2bcrrk/02rWJhoKUU=", "status": "Unlisted" }, { "version": "1.0-SNAPSHOT", "revision": "tWu8n3IX5HR82vzVZQAxlwcvvA4U/+S80edWNAkil24=", "status": "Published" } ], "defaultDisplayVersion": "1.0-SNAPSHOT", "format": "maven", "package": "pkg-1", "namespace": "com.mycompany.myapp" }

En este punto, la versión de instantánea 1.0-SNAPSHOT se puede consumir en una compilación. Si bien hay dos versiones de com.mycompany.myapp:pkg-1 en el repositorio my-maven-repo, ambas contienen los mismos activos.

aws codeartifact list-package-version-assets --domain my-domain --repository \ my-maven-repo --format maven --namespace com.mycompany.myapp \ --package pkg-1 --package-version 1.0-SNAPSHOT--query 'assets[*].name' [ "pkg-1-1.0-20210728.194552-1.jar", "pkg-1-1.0-20210728.194552-1.pom" ]

Ejecutar el mismo comando list-package-version-assets como se mostró anteriormente con el parámetro --package-version cambiado a 1.0-20210728.194552-1 da como resultado una salida idéntica.

A medida que se añaden compilaciones adicionales de 1.0-SNAPSHOT al repositorio, se crea una nueva versión del paquete Unlisted para cada nueva compilación. Los activos de la versión 1.0-SNAPSHOT se actualizan cada vez para que la versión siempre haga referencia a la última compilación de esa versión. La actualización de 1.0-SNAPSHOT con los activos más recientes se inicia cargando el archivo maven-metadata.xml de la nueva compilación.

Consumo de versiones de instantánea

Si solicita una instantánea, se devuelve la versión con el estado Published. Esta es siempre la versión más reciente de la instantánea de Maven. También puede solicitar una compilación concreta de una instantánea utilizando el número de versión de la compilación (por ejemplo, 1.0-20210728.194552-1) en lugar de la versión de la instantánea (por ejemplo, 1.0-SNAPSHOT) en la ruta URL. Para ver las versiones de compilación de una instantánea de Maven, use la API ListPackageVersions en la Guía de la API CodeArtifact y establezca el parámetro de estado en Unlisted.

Eliminación de versiones de instantánea

Para eliminar todas las versiones compiladas de una instantánea de Maven, utilice la API DeletePackageVersions y especifique las versiones que desea eliminar.

Publicación de instantáneas con curl

Si tiene versiones de instantánea existentes almacenadas en Amazon Simple Storage Service (Amazon S3) u otro producto de repositorio de artefactos, puede que desee volver a publicarlas en AWS CodeArtifact. Debido a la forma en que CodeArtifact admite instantáneas de Maven (consulte Publicación de instantáneas en CodeArtifact), publicar instantáneas con un cliente HTTP genérico como curl es más complejo que publicar versiones de lanzamiento de Maven como se describe en Publicación con curl. Tenga en cuenta que esta sección no es relevante si está creando e implementando versiones instantáneas con un cliente Maven como mvn o gradle. Debe seguir la documentación de ese cliente.

La publicación de una versión instantánea implica publicar una o más compilaciones de una versión instantánea. En CodeArtifact, si hay n compilaciones de una versión de instantánea, habrá n + 1 versiones de CodeArtifact: n versiones de compilación, todas con un estado de Unlisted, y una versión instantánea (la última compilación publicada) con un estado de Published. La versión instantánea (es decir, la versión con una cadena de versión que contiene «-SNAPSHOT») contiene un conjunto de activos idéntico al de la última compilación publicada. La forma más sencilla de crear esta estructura usando curl es la siguiente:

  1. Publique todos los activos de todas las compilaciones utilizando curl.

  2. Publique el archivo maven-metadata.xml de la última compilación (es decir, la compilación con la marca de fecha y hora más reciente) con curl. Esto creará una versión con «-SNAPSHOT» en la cadena de la versión y con el conjunto correcto de activos.

  3. Use la API UpdatePackageVersionsStatus para establecer el estado de todas las versiones de compilación que no sean las más recientes en Unlisted.

Use los siguientes comandos curl para publicar activos de instantáneas (como archivos.jar y .pom) para la versión 1.0-SNAPSHOT de instantánea de un paquete com.mycompany.app:pkg-1:

curl --user "aws:$CODEARTIFACT_AUTH_TOKEN" -H "Content-Type: application/octet-stream" \ -X PUT https://my_domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/maven/my_maven_repo/com/mycompany/app/pkg-1/1.0-SNAPSHOT/pkg-1-1.0-20210729.171330-2.jar \ --data-binary @pkg-1-1.0-20210728.194552-1.jar
curl --user "aws:$CODEARTIFACT_AUTH_TOKEN" -H "Content-Type: application/octet-stream" \ -X PUT https://my_domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/maven/my_maven_repo/com/mycompany/app/pkg-1/1.0-SNAPSHOT/pkg-1-1.0-20210729.171330-2.pom \ --data-binary @pkg-1-1.0-20210728.194552-1.pom

Al usar estos ejemplos:

  • Sustituya my_domain por su nombre de dominio de CodeArtifact.

  • Sustituya 111122223333 por el ID Cuenta de AWS del propietario de su dominio CodeArtifact.

  • Sustituya us-west-2 por la Región de AWS en la que reside su dominio de CodeArtifact.

  • Sustituya my_maven_repo por el nombre de su repositorio de CodeArtifact.

importante

Debe anteponer el valor del parámetro --data-binary con el carácter @. Al escribir el valor entre comillas, @ debe incluirse dentro de las comillas.

Es posible que tenga que cargar más de dos recursos para cada compilación. Por ejemplo, puede haber archivos Javadoc y JAR de origen además del JAR principal y pom.xml. No es necesario publicar archivos de suma de verificación para los activos de la versión del paquete porque CodeArtifact genera automáticamente sumas de verificación para cada activo cargado. Para verificar que los activos se cargaron correctamente, busque las sumas de verificación generadas mediante el comando list-package-version-assets y compárelas con las sumas de verificación originales. Para obtener más información acerca de cómo administra CodeArtifact las sumas de verificación de Maven, consulte Uso de sumas de comprobación de Maven.

Utilice el siguiente comando curl para publicar el archivo maven-metadata.xml de la última versión de compilación:

curl --user "aws:$CODEARTIFACT_AUTH_TOKEN" -H "Content-Type: application/octet-stream" \ -X PUT https://my_domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/maven/my_maven_repo/com/mycompany/app/pkg-1/1.0-SNAPSHOT/maven-metadata.xml \ --data-binary @maven-metadata.xml

El archivo maven-metadata.xml debe hacer referencia al menos a uno de los activos de la última versión de compilación del elemento <snapshotVersions>. Además, el valor <timestamp> debe estar presente y debe coincidir con la marca de tiempo de los nombres de los archivos de los activos. Por ejemplo, para la compilación 20210729.171330-2 publicada anteriormente, el contenido de maven-metadata.xml sería:

<?xml version="1.0" encoding="UTF-8"?> <metadata> <groupId>com.mycompany.app</groupId> <artifactId>pkg-1</artifactId> <version>1.0-SNAPSHOT</version> <versioning> <snapshot> <timestamp>20210729.171330</timestamp> <buildNumber>2</buildNumber> </snapshot> <lastUpdated>20210729171330</lastUpdated> <snapshotVersions> <snapshotVersion> <extension>jar</extension> <value>1.0-20210729.171330-2</value> <updated>20210729171330</updated> </snapshotVersion> <snapshotVersion> <extension>pom</extension> <value>1.0-20210729.171330-2</value> <updated>20210729171330</updated> </snapshotVersion> </snapshotVersions> </versioning> </metadata>

Una vez publicada maven-metadata.xml, el último paso consiste en configurar todas las demás versiones de compilación (es decir, todas las versiones de compilación excepto la última) para que tengan un estado de versión de paquete de Unlisted. Por ejemplo, si la versión 1.0-SNAPSHOT tiene dos compilaciones, siendo la primera compilación 20210728.194552-1, el comando para configurar esa compilación en Unlisted es:

aws codeartifact update-package-versions-status --domain my-domain --domain-owner 111122223333 \ --repository my-maven-repo --format maven --namespace com.mycompany.app --package pkg-1 \ --versions 1.0-20210728.194552-1 --target-status Unlisted

Instantáneas y conexiones externas

Las instantáneas de Maven no se pueden obtener de un repositorio público de Maven a través de una conexión externa AWS. CodeArtifact solo admite la importación de versiones de Maven.

Instantáneas y repositorios originales

En general, las instantáneas de Maven funcionan de la misma manera que las versiones de lanzamiento de Maven cuando se utilizan con repositorios originales, pero existe una limitación si planea publicar instantáneas de la misma versión de paquete en dos repositorios que tienen una relación ascendente. Por ejemplo, supongamos que hay dos repositorios en un dominio de AWS CodeArtifact (R y U), donde U es un ascendente de R. Si publica una compilación nueva en R, cuando un cliente de Maven solicita la última compilación de esa versión de instantánea, CodeArtifact devuelve la última versión desde U. Esto puede chocar, porque la última versión ya está disponible en R, no en U. Hay dos formas de evitar esto:

  1. No publique compilaciones de una versión de instantánea como, por ejemplo, 1.0-SNAPSHOT en R si existe 1.0-SNAPSHOT en U.

  2. Utilice los controles de origen de paquetes de CodeArtifact para desactivar las secuencias ascendentes de ese paquete en R. Esto último le va a permitir publicar compilaciones propias de 1.0-SNAPSHOT en R, pero también evitará que R obtenga otras versiones de dicho paquete desde U que ya no se conserven.