¿Cómo descargar el último artefacto del repositorio Artifactory?


Necesito el último artefacto (por ejemplo, una instantánea de un repositorio en Artifactory. Este artefacto necesita ser copiado a un servidor (Linux) a través de un script.

¿cuáles son mis opciones? Algo como Wget / SCP? ¿Y cómo obtengo el camino del artefacto?

He encontrado algunas soluciones que requieren Artifactory Pro. Pero sólo tengo Artifactory, no Artifactory Pro.

¿Es posible descargar desde Artifactory sin la interfaz de usuario y no ¿tienes la Versión Pro? ¿Qué es la experiencia?

Estoy en openSUSE 12.1 (x86_64) si eso importa.

Author: slm, 2012-12-21

10 answers

Artifactory tiene una buena extensión REST-API y casi todo lo que se puede hacer en la interfaz de usuario (quizás incluso más) también se puede hacer usando simples peticiones HTTP.

La característica que menciona - recuperar el último artefacto, de hecho requiere la edición Pro; pero también se puede lograr con un poco de trabajo de su lado y algunos scripts básicos.

Opción 1-Búsqueda:

Realice una búsqueda GAVC en un conjunto de ID de grupo e ID de artefacto coordenadas para recuperar todas las versiones existentes de ese conjunto; luego puede usar cualquier algoritmo de comparación de cadenas de versión para determinar la versión más reciente.

Opción 2 - el camino Maven:

Artifactory genera un estándar metadatos XML que debe ser consumido por Maven, porque Maven se enfrenta al mismo problema: determinar la última versión; Los metadatos enumeran todas las versiones disponibles de un artefacto y se generan para cada carpeta de nivel de artefacto; con un simple OBTENER solicitud y algunos análisis XML, se puede descubrir la última versión.

 26
Author: noamt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-26 18:00:55

Algo como el siguiente script bash recuperará la última com.company:artifact instantánea del repositorio snapshot:

# Artifactory location
server=http://artifactory.company.com/artifactory
repo=snapshot

# Maven artifact location
name=artifact
artifact=com/company/$name
path=$server/$repo/$artifact
version=$(curl -s $path/maven-metadata.xml | grep latest | sed "s/.*<latest>\([^<]*\)<\/latest>.*/\1/")
build=$(curl -s $path/$version/maven-metadata.xml | grep '<value>' | head -1 | sed "s/.*<value>\([^<]*\)<\/value>.*/\1/")
jar=$name-$build.jar
url=$path/$version/$jar

# Download
echo $url
wget -q -N $url

Se siente un poco sucio, sí, pero hace el trabajo.

 55
Author: btiernay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-31 22:05:42

Usando herramientas shell / unix

  1. curl 'http://$artiserver/artifactory/api/storage/$repokey/$path/$version/?lastModified'

El comando anterior responde con un JSON con dos elementos:" uri "y"lastModified"

  1. Al obtener el enlace en el uri, se devuelve otro JSON que tiene el "downloadUri" del artefacto.

  2. Obtenga el enlace en el "downloadUri" y tendrá el último artefacto.

Usando el plugin de Jenkins Artifactory

(Requiere Pro) para resolver y descargar el último artefacto, si Jenkins El complemento Artifactory se usó para publicar en artifactory en otro trabajo:

  1. Seleccione la Integración Genérica de Artifactory
  2. Utilice Artefactos resueltos como ${repokey}:**/${component}*.jar;status=${STATUS}@${PUBLISH_BUILDJOB}#LATEST=>${targetDir}
 11
Author: Sateesh Potturu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-13 12:29:31

Puede usar el comando wget --user=USER --password=PASSWORD .., pero antes de que pueda hacerlo, debe permitir que artifactory fuerce la autenticación, lo que se puede hacer al desmarcar el "Ocultar la Existencia de Recursos No Autorizados" caja en la pestaña Seguridad / General en el panel de administración de artifactory. De lo contrario artifactory envía una página 404 y wget no puede autenticarse en artifactory.

 3
Author: ruhsuzbaykus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-26 08:38:15

La función de Artifactory es proporcionar archivos para Maven (así como otras herramientas de compilación como Ivy, Gradle o sbt). Puede usar Maven junto con el complemento maven-dependency-plugin para copiar los artefactos. Aquí hay un pom esquema para comenzar...

<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>
    <groupId>A group id</groupId>
    <artifactId>An artifact id</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.3</version>
                <executions>
                    <execution>
                        <id>copy</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy</goal>
                        </goals>
                        <configuration>
                            <artifactItems>
                                <artifactItem>
                                    <groupId>The group id of your artifact</groupId>
                                    <artifactId>The artifact id</artifactId>
                                    <version>The snapshot version</version>
                                    <type>Whatever the type is, for example, JAR</type>
                                    <outputDirectory>Where you want the file to go</outputDirectory>
                                </artifactItem>
                            </artifactItems>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

Simplemente ejecute mvn install para hacer la copia.

 3
Author: Robert Longson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-10 13:57:20

Puede usar el elemento " last modified"de la API REST. De los documentos, repite algo como esto:

GET /api/storage/libs-release-local/org/acme?lastModified
{
"uri": "http://localhost:8081/artifactory/api/storage/libs-release-local/org/acme/foo/1.0-SNAPSHOT/foo-1.0-SNAPSHOT.pom",
"lastModified": ISO8601
}

Ejemplo:

# Figure out the URL of the last item modified in a given folder/repo combination
url=$(curl \
    -H 'X-JFrog-Art-Api: XXXXXXXXXXXXXXXXXXXX' \
    'http://<artifactory-base-url>/api/storage/<repo>/<folder>?lastModified'  | jq -r '.uri')
# Figure out the name of the downloaded file
downloaded_filename=$(echo "${url}" | sed -e 's|[^/]*/||g')
# Download the file
curl -L -O "${url}"
 3
Author: djhaskin987,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-02 23:00:36

Con las versiones recientes de artifactory, puede consultar esto a través de la api.

Https://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API#ArtifactoryRESTAPI-RetrieveLatestArtifact

Si tiene un artefacto maven con 2 instantáneas

Name = > ' com.acme.derp "
version = > 0.1.0
nombre del repositorio = > " foo "
instantánea 1 = > derp-0.1.0-20161121.183847-3.jar
instantánea 2 = > derp-0.1.0-20161122.00000-0.jar

Entonces los caminos completos serían be

Https://artifactory.example.com/artifactory/foo/com/acme/derp/0.1.0-SNAPSHOT/derp-0.1.0-20161121.183847-3.jar

Y

Https://artifactory.example.com/artifactory/foo/com/acme/derp/0.1.0-SNAPSHOT/derp-0.1.0-20161122.00000-0.jar

Obtendrías la última de esta manera:

curl https://artifactory.example.com/artifactory/foo/com/acme/derp/0.1.0-SNAPSHOT/derp-0.1.0-SNAPSHOT.jar
 2
Author: spuder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-22 20:09:13

También puedes usar El lenguaje de consulta de Artifactory para obtener el último artefacto.

El siguiente script de shell es solo un ejemplo. Utiliza elementos.find ()' (que está disponible en la versión no Pro), por ejemplo, items.find({ "repo": {"$eq":"my-repo"}, "name": {"$match" : "my-file*"}}) que busca archivos que tienen un nombre de repositorio igual a "my-repo" y coincide con todos los archivos que comienzan con "my-file". Luego utiliza el analizador JSON de shell ./ jq para extraer el último archivo ordenándolo por el campo de fecha 'actualizado'. A continuación, utilice wget para descargar el artefacto.

#!/bin/bash

# Artifactory settings
host="127.0.0.1"
username="downloader"
password="my-artifactory-token"

# Use Artifactory Query Language to get the latest scraper script (https://www.jfrog.com/confluence/display/RTF/Artifactory+Query+Language)
resultAsJson=$(curl -u$username:"$password" -X POST  http://$host/artifactory/api/search/aql -H "content-type: text/plain" -d 'items.find({ "repo": {"$eq":"my-repo"}, "name": {"$match" : "my-file*"}})')

# Use ./jq to pars JSON
latestFile=$(echo ${resultAsJson} |  jq -r '.results | sort_by(.updated) [-1].name'))

# Download the latest scraper script
wget -N -P ./libs/ --user $username --password $password http://$host/artifactory/my-repo/$latestFile
 2
Author: Kris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-27 15:59:20

Esto puede ser nuevo:

Https://artifactory.example.com/artifactory/repo/com/example/foo/1.0.[RELEASE]/foo-1.0.[RELEASE].tgz

Para cargar el módulo foo desde example.com . Mantenga las partes [RELEASE] textualmente. Esto se menciona en los documentos, pero no está muy claro que realmente se puede poner [RELEASE] en la URL (a diferencia de un patrón de sustitución para el desarrollador).

 0
Author: Jason,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-14 17:12:06

Uso Nexus y este código funciona para mí-puede recuperar tanto release como last snaphsot , dependiendo del tipo de repositorio:

server="http://example.com/nexus/content/repositories"
repo="snapshots"
name="com.exmple.server"
artifact="com/example/$name"
path=$server/$repo/$artifact
mvnMetadata=$(curl -s "$path/maven-metadata.xml")
echo "Metadata: $mvnMetadata"
jar=""
version=$( echo "$mvnMetadata" | xpath -e "//versioning/release/text()" 2> /dev/null)
if [[ $version = *[!\ ]* ]]; then
  jar=$name-$version.jar
else
  version=$(echo "$mvnMetadata" | xpath -e "//versioning/versions/version[last()]/text()")
  snapshotMetadata=$(curl -s "$path/$version/maven-metadata.xml")
  timestamp=$(echo "$snapshotMetadata" | xpath -e "//snapshot/timestamp/text()")
  buildNumber=$(echo "$snapshotMetadata" | xpath -e "//snapshot/buildNumber/text()")
  snapshotVersion=$(echo "$version" | sed 's/\(-SNAPSHOT\)*$//g')
  jar=$name-$snapshotVersion-$timestamp-$buildNumber.jar
fi
jarUrl=$path/$version/$jar
echo $jarUrl
mkdir -p /opt/server/
wget -O /opt/server/server.jar -q -N $jarUrl
 -1
Author: Denis Kalinin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-02 15:17:07