Jak pobrać najnowszy artefakt z repozytorium Artifactory?

Potrzebuję najnowszego artefaktu (na przykład migawki) z repozytorium w Artifactory . Ten artefakt musi zostać skopiowany na serwer (Linux) za pomocą skryptu.

Jakie mam opcje? Coś jak Wget / SCP ? Jak zdobyć ścieżkę artefaktu?

Znalazłem kilka rozwiązań, które wymagają Artifactory Pro. Ale mam tylko Artifactory, nie Artifactory Pro.

Czy jest w ogóle możliwe pobieranie z Artifactory bez interfejsu użytkownika i nie masz wersję Pro? Jakie jest doświadczenie?

Jestem na OpenSUSE 12.1 (x86_64) jeśli to ma znaczenie.

Author: slm, 2012-12-21

10 answers

Artifactory ma rozbudowane REST-API i prawie wszystko, co można zrobić w interfejsie użytkownika (być może nawet więcej), można również zrobić za pomocą prostych żądań HTTP.

Funkcja, o której wspominasz - odzyskiwanie najnowszego artefaktu, rzeczywiście wymaga edycji Pro; ale można ją również osiągnąć przy odrobinie pracy po twojej stronie i kilku podstawowych skryptach.

Opcja 1-Szukaj:

Wykonaj GAVC wyszukiwanie na zestawie identyfikatorów grup i identyfikatorów artefaktów współrzędne, aby pobrać wszystkie istniejące wersje tego zestawu; następnie możesz użyć dowolnego algorytmu porównywania ciągów wersji, aby określić najnowszą wersję.

Opcja 2-Droga Mavena:

Artifactory generuje standardowe metadane XML , które mają być zużyte przez Mavena, ponieważ Maven ma do czynienia z tym samym problemem - określeniem najnowszej wersji; metadane zawierają listę wszystkich dostępnych wersji artefaktu i są generowane dla każdego folderu poziomu artefaktu; Pobierz żądanie i parsowanie XML, możesz odkryć najnowszą wersję.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-26 18:00:55

Coś takiego jak następujący skrypt bash pobierze ostatnią migawkę com.company:artifact z repo 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
To trochę brudne, tak, ale robi swoje.
 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/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-31 22:05:42

Using shell/unix tools

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

Powyższe polecenie odpowiada JSON z dwoma elementami - " uri "i"lastModified"

  1. Pobranie linku w uri zwraca inny JSON, który ma "downloadUri" artefaktu.

  2. Pobierz link w "downloadUri" i masz najnowszy artefakt.

Używanie wtyczki Jenkins Artifactory

(wymaga Pro), aby rozwiązać i pobrać najnowszy artefakt, jeśli Jenkins Wtyczka Artifactory została użyta do opublikowania w artifactory w innym zadaniu:

  1. Select Generic Artifactory Integration
  2. Użyj rozwiązanych artefaktów jako ${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/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-13 12:29:31

Możesz użyć komendy wget --user=USER --password=PASSWORD .., ale zanim to zrobisz, musisz zezwolić artifactory na wymuszenie uwierzytelniania, co można zrobić przez odznaczenie "Ukryj istnienie nieautoryzowanych zasobów" pole w zakładce bezpieczeństwo / ogólne w panelu administracyjnym artifactory. W przeciwnym razie artifactory wysyła stronę 404, a wget nie może uwierzytelnić się do 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/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-26 08:38:15

Rola Artifactory polega na dostarczaniu plików dla Mavena (jak również innych narzędzi do budowania, takich jak Ivy, Gradle czy sbt). Możesz po prostu użyć Mavena razem z Maven-dependency-plugin, Aby skopiować artefakty. Otopom zarys na początek...

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

Po prostu uruchom mvn install, Aby wykonać kopię.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-10 13:57:20

Możesz użyć REST-API ' s " Item last modified ". Z docs to powtarza coś takiego:

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
}

Przykład:

# 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/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-02 23:00:36

Z najnowszymi wersjami artifactory, możesz odpytywać to za pośrednictwem api.

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

Jeśli masz artefakt Mavena z 2 migawkami

Name = > ' com.acme.derp "
wersja = > 0.1.0
repo name = > 'foo'
migawka 1 = > derp-0.1.0-20161121.183847-3.jar
migawka 2 = > derp-0.1.0-20161122.00000-0.jar

Wtedy pełne ścieżki będą be

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

I

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

Pobrałbyś najnowsze tak:

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/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-22 20:09:13

Możesz również użyć Artifactory Query Language, Aby uzyskać najnowszy artefakt.

Poniższy skrypt powłoki jest tylko przykładem. Używa " przedmiotów.find () '(która jest dostępna w wersji non-Pro), np. items.find({ "repo": {"$eq":"my-repo"}, "name": {"$match" : "my-file*"}}), która wyszukuje pliki, które mają nazwę repozytorium równą "my-repo" i pasują do wszystkich plików zaczynających się od "my-file". Następnie używa parsera powłoki JSON ./jq Aby wyodrębnić najnowszy plik poprzez sortowanie według pola daty 'updated'. Następnie użyj wget, aby pobrać artefakt.

#!/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/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-27 15:59:20

To może być Nowe:

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

Do ładowania modułu foo z example.com . Zachowaj części [wydania] dosłownie. Jest to wspomniane w dokumentach, ale nie jest jasno określone, że można rzeczywiście umieścić [RELEASE] W URL (w przeciwieństwie do wzorca substytucji dla dewelopera).

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-14 17:12:06

Używam Nexusa i ten kod działa dla mnie - może pobierać zarówno release jak i last snaphsot , w zależności od typu repozytorium:

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/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-02 15:17:07