2012-12-21 2 views
41

Ich benötige das neueste Artefakt (z. B. einen Snapshot) aus einem Repository in Artifactory. Dieses Artefakt muss über ein Skript auf einen Server (Linux) kopiert werden.Wie lade ich das neueste Artefakt aus dem Artifactory-Repository herunter?

Was sind meine Optionen? So etwas wie Wget/SCP? Und wie bekomme ich den Weg des Artefakts?

Ich habe einige Lösungen gefunden, die Artifactory Pro erfordern. Aber ich habe nur Artefactory, nicht Artifactory Pro.

Ist es überhaupt möglich, von Artifactory ohne die Benutzeroberfläche herunterzuladen und die Pro-Version nicht zu haben? Was ist die Erfahrung?

Ich bin auf OpenSUSE 12.1 (x86_64), wenn das zählt.

+0

Siehe Artifactory Dokumentation zu diesem genauen Thema https://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API#ArtifactoryRESTAPI-RetrieveLatestArtifact – spuder

Antwort

24

Artifactory hat eine gute umfangreiche REST-API und fast alles, was in der UI (vielleicht sogar mehr) getan werden kann, kann auch mit einfachen HTTP-Anfragen erfolgen.

Die Funktion, die Sie erwähnen - das neueste Artefakt abrufen, erfordert in der Tat die Pro-Edition; aber es kann auch mit ein wenig Arbeit auf Ihrer Seite und ein paar grundlegenden Skripten erreicht werden.

Option 1 - Suche:

Führen Sie eine GAVC Suche auf einer Reihe von Gruppen-ID und Artefakt-ID koordiniert alle vorhandenen Versionen dieses Satzes abzurufen; Dann können Sie einen Versionsvergleichs-Algorithmus verwenden, um die neueste Version zu ermitteln.

Option 2 - der Maven Weg:

Artifactory erzeugt einen Standard XML metadata, die von Maven verbraucht werden soll, weil Maven mit dem gleichen Problem konfrontiert ist - die neueste Version zu bestimmen; Die Metadaten listet alle verfügbaren Versionen eines Artefakts auf und wird für jeden Artefaktstufenordner generiert. Mit einer einfachen GET-Anfrage und einigen XML-Parsern können Sie die neueste Version entdecken.

+1

die GAVC Suche ist leer. Im Einsatz von Jenkins. Es ist ein Free-Sytle-Job und ein "Generic-Artifactory Integration" Build. Muss es ein Maven 2/3 Job oder ein Maven-Artifactory Integration Build sein, um nach Maven Koordinaten suchen zu können? (Wenn ich nicht mit Jenkins arbeite, funktioniert die Suche) – user1338413

4

Die Rolle von Artifactory besteht darin, Dateien für Maven (sowie andere Build-Tools wie Ivy, Gradle oder sbt) bereitzustellen. Sie können Maven einfach zusammen mit dem maven-dependency-plugin verwenden, um die Artefakte zu kopieren. Hier ist ein pom Umriss Sie beginnt ...

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

Gerade mvn install läuft die Kopie zu tun.

50

So etwas wie der folgenden Bash-Skript wird den neuesten com.company:artifact Schnappschuss aus den snapshot Repo abrufen:

# 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 

Es fühlt sich ein bisschen schmutzig, ja, aber es wird die Arbeit getan.

+0

Ich musste die Zeile "version =" durch version = 'curl -s $ path/maven-metadata.xml | ersetzen grep "" | sed "s /.* \ ([^ <] * \) <\/version>. */\ 1 /" ' –

+2

Dies ist nicht mit der Frage verbunden, aber es könnte jemandem helfen. Verwenden Sie * -k * mit Curl, wenn Sie Probleme mit Zertifikaten haben. – danielnegri

+1

für die Authentifizierung habe ich verwendet: 'version = 'curl -u Benutzer: pwd -s $ Pfad/maven-metadata.xml | grep neuesten | sed "s /.* \ ([^ <] * \) <\/latest>. */\ 1 /" '' –

3

Sie können den wget --user=USER --password=PASSWORD .. Befehl, aber bevor Sie das tun können, müssen Sie erlauben artifactory Authentifizierung zu erzwingen, die von getan werden kann die „ausblenden Existenz von unberechtigten Ressourcen“ -Box bei Sicherheit unchecking/Allgemein Registerkarte in Artefakt Admin Panel.Andernfalls sendet artefactory eine 404-Seite und wget kann sich nicht bei Artefactory authentifizieren.

8

Mit Shell/Unix-Tools:

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

Der obige Befehl antwortet mit einem JSON mit zwei Elementen - uri und lastModified

  1. Das Abrufen des Links in der URL gibt einen weiteren JSON zurück, der das "DownloadUri" des Artefakts enthält.

  2. Holen Sie den Link in der "DownloadUri" und Sie haben das neueste Artefakt.

Mit Jenkins Artifactory Plugin (Erfordert Pro) neuesten Artefakt zu lösen und herunterladen, wenn Jenkins Artifactory Plugin in einem anderen Job zu veröffentlichen wurde verwendet, um Artifactory:

  1. Wählen Sie Allgemeine Artifactory Integration
  2. Verwenden gelöst Artefakte wie ${repokey}:**/${component}*.jar;status=${STATUS}@${PUBLISH_BUILDJOB}#LATEST=>${targetDir}
+1

Erste Lösung erfordert auch Pro, Ich bekomme "" Diese REST-API ist nur in Artifactory Pro verfügbar (siehe: http://www.jfrog.com/addons.php) " – hgrey

+1

Ich benutze die Pro-Version und sie funktioniert mit der Build-Nummer, aber wenn ich sie benutze die neueste Build-Nummer es kann das Artefakt nicht finden Haben Sie dieses Problem schon einmal gesehen? – CodyK

+0

@Sateesh Potturu Haben Sie einen Link zu Artefakte Dokumentation für die Syntax des zweiten Vorschlags? – therealjumbo

0

I verwenden Nexus und dieser Code funktioniert für mich — sowohlRelease und letzten snaphsot retrive kann je nach Repository-Typ:

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

Downvoted, weil das OP nach Artifactory gefragt. –

1

Mit den jüngsten Versionen von artifactory, können Sie dies durch die api abfragen.

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

Wenn Sie ein Maven-Artefakt mit 2 Schnappschüsse

name => 'com.acme.derp'
version => 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

Dann werden die vollständigen Pfade würden

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

und

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

Sie würden die neuesten wie so holen:

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

Sie können die REST-API "Item last modified" verwenden.Aus den Dokumenten, Retuns es so etwas wie diese:

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 
} 

Beispiel:

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

Sie auch Artifactory Query Language bekommen den neuesten Artefakt nutzen könnten.

Das folgende Shell-Skript ist nur ein Beispiel. Es verwendet 'items.find()' (das in der Nicht-Pro-Version verfügbar ist), z. items.find({ "repo": {"$eq":"my-repo"}, "name": {"$match" : "my-file*"}}) sucht nach Dateien mit einem Repository-Namen, der "my-repo" entspricht, und stimmt alle Dateien ab, die mit "my-file" beginnen. Dann verwendet es die shell JSON parser ./jq, um die neueste Datei zu extrahieren, indem nach dem Datumsfeld 'aktualisiert' sortiert wird. Dann benutze wget, um das Artefakt herunterzuladen.

#!/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 
Verwandte Themen