Domanda Come scaricare l'ultimo artefatto dal repository Artifactory?


Ho bisogno dell'ultimo artefatto (ad esempio, un'istantanea) da un repository in Artifactory. Questo artefatto deve essere copiato su un server (Linux) tramite uno script.

Quali sono le mie opzioni? Qualcosa di simile a wget / SCP? E come ottengo il percorso del manufatto?

Ho trovato alcune soluzioni che richiedono Artifactory Pro. Ma ho solo Artifactory, non Artifactory Pro.

È possibile scaricare da Artifactory senza l'interfaccia utente e non avere la versione Pro? Qual è l'esperienza?

Sono su OpenSUSE 12.1 (x86_64) se questo è importante.


44
2017-12-21 11:10


origine


risposte:


L'artefatto ha una buona estensione REST API e quasi tutto ciò che può essere fatto nell'interfaccia utente (forse anche di più) può anche essere fatto usando semplici richieste HTTP.

La funzione che hai menzionato - il recupero dell'ultimo artefatto, richiede in effetti l'edizione Pro; ma può anche essere ottenuto con un po 'di lavoro dalla tua parte e alcuni script di base.

Opzione 1 - Ricerca: 

Esegui a GAVC cercare su un set di ID di gruppo e coordinate ID di un manufatto per recuperare tutte le versioni esistenti di quel set; quindi è possibile utilizzare qualsiasi algoritmo di confronto delle stringhe di versione per determinare l'ultima versione.

Opzione 2: il modo Maven: 

L'artefatto genera uno standard Metadati XML che deve essere consumato da Maven, perché Maven si trova di fronte allo stesso problema: determinare l'ultima versione; I metadati elencano tutte le versioni disponibili di un artefatto e vengono generati per ogni cartella di livello artefatto; con una semplice richiesta GET e qualche analisi XML, è possibile scoprire la versione più recente.


26
2017-12-22 07:20



Qualcosa come il seguente script bash recupererà l'ultimo com.company:artifact istantanea dal snapshot pronti contro termine:

# 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

Sembra un po 'sporco, sì, ma ha fatto il lavoro.


52
2017-07-21 14:33



Utilizzo degli strumenti shell / unix

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

Il comando precedente risponde con un JSON con due elementi: "uri" e "lastModified"

  1. Recuperare il link in uri restituisce un altro JSON che ha il "downloadUri" del manufatto.

  2. Scarica il link nel "downloadUri" e hai l'ultimo artefatto.

Utilizzo del plugin Artifactory di Jenkins

(Richiede Pro) per risolvere e scaricare l'artefatto più recente, se è stato utilizzato il plug-in Jenkins Artifactory per pubblicare su artifactory in un altro lavoro:

  1. Seleziona Integrazione generica artificiale
  2. Utilizzare gli artefatti risolti come ${repokey}:**/${component}*.jar;status=${STATUS}@${PUBLISH_BUILDJOB}#LATEST=>${targetDir}

10
2017-10-09 03:33



Il ruolo di Artifactory è fornire file per Maven (così come altri strumenti di costruzione come Ivy, Gradle o sbt). Puoi semplicemente usare Maven insieme al Maven-dependency-plugin per copiare gli artefatti. Ecco un pom contorni per iniziare fuori ...

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

Corri mvn install fare la copia.


4
2018-06-21 20:03



Puoi utilizzare le API REST "Articolo modificato l'ultima volta"Dai documenti, si ripete qualcosa del genere:

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
}

Esempio:

# 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}"

4
2017-08-02 23:00



Puoi usare il wget --user=USER --password=PASSWORD ..comando, ma prima che tu possa farlo, devi consentire a artifactory di forzare l'autenticazione, cosa che può essere eseguita da deselezionando il "Nascondi l'esistenza di risorse non autorizzate"scatola a Sicurezza / Generale scheda in pannello di amministrazione artificioso. In caso contrario, l'artefice invia una pagina 404 e wget non può autenticarsi con l'artefatto.


3
2018-05-26 08:38



Con le versioni recenti di artifactory, puoi eseguire una query tramite l'API.

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

Se hai un artefatto di Maven con 2 istantanee

name => 'com.acme.derp'
versione => 0.1.0
repo name => 'foo'
snapshot 1 => derp-0.1.0-20161121.183847-3.jar
snapshot 2 => derp-0.1.0-20161122.00000-0.jar

Allora i percorsi completi sarebbero

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

e

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

Dovresti recuperare l'ultima in questo modo:

curl https://artifactory.example.com/artifactory/foo/com/acme/derp/0.1.0-SNAPSHOT/derp-0.1.0-SNAPSHOT.jar

2
2017-11-22 20:09



Puoi anche usare Lingua di interrogazione artificiale per ottenere l'ultimo artefatto.

Il seguente script di shell è solo un esempio. Utilizza 'items.find ()' (che è disponibile nella versione non Pro), ad es. items.find({ "repo": {"$eq":"my-repo"}, "name": {"$match" : "my-file*"}}) che cerca file con un nome di repository uguale a "my-repo" e corrisponde a tutti i file che iniziano con "my-file". Quindi usa il parser JSON shell ./jq per estrarre il file più recente ordinando per il campo della data 'aggiornato'. Quindi usa wget per scaricare l'artefatto.

#!/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
2017-10-27 15:59



Questo potrebbe essere nuovo:

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

Per il caricamento del modulo foo da example.com. Mantenere verbalmente le parti [RELEASE]. Questo è menzionato nei documenti, ma non è reso esplicitamente chiaro che puoi effettivamente inserire [RELEASE] nell'URL (al contrario di un pattern di sostituzione per lo sviluppatore).


0
2018-06-14 17:12