Подтвердить что ты не робот

Как загрузить последний артефакт из репозитория Artifactory?

Мне нужен последний артефакт (например, моментальный снимок) из репозитория в Artifactory. Этот артефакт необходимо скопировать на сервер (Linux) с помощью script.

Каковы мои варианты? Что-то вроде Wget/SCP? И как мне получить путь к артефакту?

Я нашел несколько решений, требующих Artifactory Pro. Но у меня просто есть Artifactory, а не Artifactory Pro.

Возможно ли вообще скачать с Artifactory без пользовательского интерфейса и не иметь Pro-Version? Каков опыт?

Я использую OpenSUSE 12.1 (x86_64), если это имеет значение.

4b9b3361

Ответ 1

Artifactory имеет хороший обширный REST-API, и почти все, что можно сделать в пользовательском интерфейсе (возможно, даже больше), также можно сделать с помощью простых HTTP-запросов.

Функция, о которой вы упомянули - получение последнего артефакта, действительно требует Pro версии; но это также может быть достигнуто с помощью небольшой работы на вашей стороне и нескольких основных сценариев.

Вариант 1 - Поиск:

Выполните поиск GAVC по набору координат идентификатора группы и идентификатора артефакта, чтобы получить все существующие версии этого набора; тогда вы можете использовать любой алгоритм сравнения строк версии, чтобы определить последнюю версию.

Вариант 2 - путь Maven:

Artifactory генерирует стандартные метаданные XML, которые должны использоваться Maven, потому что Maven сталкивается с той же проблемой - определение последней версии; Метаданные перечисляют все доступные версии артефакта и генерируются для каждой папки уровня артефакта; с помощью простого запроса GET и некоторого синтаксического анализа XML, вы можете обнаружить последнюю версию.

Ответ 2

Что - то вроде следующего сценария баш будет получать самую последнюю com.company:artifact снимок из 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

Да, он немного грязный, но он выполняет свою работу.

Ответ 3

Использование инструментов shell/unix

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

Приведенная выше команда отвечает JSON с двумя элементами - "uri" и "lastModified"

  1. Извлечение ссылки в URI возвращает другой JSON, который имеет "downloadUri" артефакта.

  2. Получить ссылку в "downloadUri", и у вас есть последний артефакт.

Использование плагина Jenkins Artifactory

(Требуется Pro) для разрешения и загрузки последнего артефакта, если плагин Jenkins Artifactory использовался для публикации в артефакте в другом задании:

  1. Выберите общую артефактную интеграцию
  2. Используйте разрешенные артефакты как ${repokey}:**/${component}*.jar;status=${STATUS}@${PUBLISH_BUILDJOB}#LATEST=>${targetDir}

Ответ 4

Вы можете использовать REST-API " Item last modified". Из документов он перенастраивает что-то вроде этого:

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
}

Пример:

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

Ответ 5

Роль Artifactory заключается в предоставлении файлов для Maven (а также других инструментов сборки, таких как Ivy, Gradle или sbt). Вы можете просто использовать Maven вместе с maven-dependency-plugin, чтобы скопировать артефакты. Здесь pom набросок, чтобы начать...

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

Просто запустите mvn install, чтобы сделать копию.

Ответ 6

Вы можете использовать команду wget --user=USER --password=PASSWORD .., но прежде чем вы сможете это сделать, вы должны разрешить artifactory принудительно выполнять аутентификацию, что может быть сделано с помощью снятия отметки с Скрыть существование несанкционированных ресурсов "на вкладке Безопасность/Общие в панели artifactory admin. В противном случае artifactory отправляет страницу 404, а wget не может аутентифицироваться в artifactory.

Ответ 7

С последними версиями artifactory вы можете запросить это через api.

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

Если у вас есть артефакт maven с двумя моментальными снимками

name = > 'com.acme.derp'
версия = > 0.1.0
repo name = > 'foo'
моментальный снимок 1 = > derp-0.1.0-20161121.183847-3.jar
моментальный снимок 2 = > derp-0.1.0-20161122.00000-0.jar

Тогда полные пути будут

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

и

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

Вы получите последнюю версию:

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

Ответ 8

Вы также можете использовать Artifactory Query Language, чтобы получить последний артефакт.

Следующий скрипт оболочки является лишь примером. Он использует items.find() (который доступен в непрофессиональной версии), например items.find({ "repo": {"$eq":"my-repo"}, "name": {"$match": "my-file*"}}) который ищет файлы с именем репозитория, равным" my-repo ", и сопоставляет все файлы, начинающиеся с" my-file ". Затем он использует синтаксический анализатор оболочки JSON./jq для извлечения последнего файла путем сортировки по полю даты "обновлено". Наконец, он использует wget для загрузки артефакта.

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

Ответ 9

Это может быть новым:

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

Для загрузки модуля foo с сайта example.com. Сохраняйте дословно [RELEASE] части. Это упомянуто в документации, но это не дает полной ясности, что вы действительно можете поместить [RELEASE] в URL (в отличие от шаблона замещения для разработчика).

Ответ 10

Для меня проще всего было прочитать последние версии проекта с комбинацией curl, grep, sort и tail.

Мой формат: service- (версия: 1.9.23) - (номер сборки) 156.tar.gz

versionToDownload=$(curl -u$user:$password 'https://$artifactory/artifactory/$project/' | grep -o 'service-[^"]*.tar.gz' | sort | tail -1)

Ответ 11

Другой переносимый вариант - использовать командную строку maven:

mvn org.apache.maven.plugins:maven-dependency-plugin:2.4:get -DartifactId=[artifactId] -DgroupId=[groupId] -Dversion=[version] -Ddest=[dest file]

Ответ 12

Если вы хотите загрузить последнюю версию jar между двумя хранилищами, вы можете использовать это решение. Я на самом деле использую его в моем конвейере Jenkins, он отлично работает. Допустим, у вас есть plugins-release-local и plugins-snapshot-local, и вы хотите загрузить последнюю версию jar между ними. Ваш скрипт должен выглядеть так

ПРИМЕЧАНИЕ: я использую jfrog cli, и он настроен на моем сервере Artifactory.

Вариант использования: сценарий оболочки

# your repo, you can change it then or pass an argument to the script
# repo = $1 this get the first arg passed to the script
repo=plugins-snapshot-local
# change this by your artifact path, or pass an argument $2
artifact=kshuttle/ifrs16
path=$repo/$artifact
echo $path
~/jfrog rt download --flat $path/maven-metadata.xml version/
version=$(cat version/maven-metadata.xml | grep latest | sed "s/.*<latest>\([^<]*\)<\/latest>.*/\1/")
echo "VERSION $version"
~/jfrog rt download --flat $path/$version/maven-metadata.xml build/
build=$(cat  build/maven-metadata.xml | grep '<value>' | head -1 | sed "s/.*<value>\([^<]*\)<\/value>.*/\1/")
echo "BUILD $build"
# change this by your app name, or pass an argument $3
name=ifrs16
jar=$name-$build.jar
url=$path/$version/$jar

# Download
echo $url
~/jfrog rt download --flat $url

Случай использования: Jenkins Pipeline

def getLatestArtifact(repo, pkg, appName, configDir){
    sh """
        ~/jfrog rt download --flat $repo/$pkg/maven-metadata.xml $configDir/version/
        version=\$(cat $configDir/version/maven-metadata.xml | grep latest | sed "s/.*<latest>\\([^<]*\\)<\\/latest>.*/\\1/")
        echo "VERSION \$version"
        ~/jfrog rt download --flat $repo/$pkg/\$version/maven-metadata.xml $configDir/build/
        build=\$(cat  $configDir/build/maven-metadata.xml | grep '<value>' | head -1 | sed "s/.*<value>\\([^<]*\\)<\\/value>.*/\\1/")
        echo "BUILD \$build"
        jar=$appName-\$build.jar
        url=$repo/$pkg/\$version/\$jar

        # Download
        echo \$url
        ~/jfrog rt download --flat \$url
    """
}

def clearDir(dir){
    sh """
        rm -rf $dir/*
    """

}

node('mynode'){
    stage('mysstage'){
        def repos =  ["plugins-snapshot-local","plugins-release-local"]

        for (String repo in repos) {
            getLatestArtifact(repo,"kshuttle/ifrs16","ifrs16","myConfigDir/")
        }
        //optional
        clearDir("myConfigDir/")
    }
}

Это очень помогает, когда вы хотите получить последний пакет между 1 или более репо. Надеюсь, тебе это тоже поможет! Для получения дополнительной информации о конвейерах в сценариях Jenkins посетите документацию Jenkins.

Ответ 13

Я использую Nexus, и этот код работает для меня: может извлекать как release, так и последний snaphsot, в зависимости от типа репозитория:

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