Как загрузить последний артефакт из репозитория Artifactory?
Мне нужен последний артефакт (например, снимок) из репозитория в Artifactory. Этот артефакт необходимо скопировать на сервер (Linux) с помощью скрипта.
Каковы мои варианты? Что-то вроде команды wget / SCP? И как я получу путь артефакта?
Я нашел некоторые решения, которые требуют Artifactory Pro. Но у меня просто есть Artifactory, а не Artifactory Pro.
можно ли вообще скачать из Artifactory без пользовательского интерфейса и не имея про-версии? Какой опыт?
Я на OpenSUSE 12.1 (x86_64), если это имеет значение.
10 ответов
Artifactory имеет хороший большой REST-API и почти все, что можно сделать в пользовательском интерфейсе (возможно, даже больше), Также можно сделать с помощью простых HTTP-запросов.
функция, которую вы упомянули - получение последнего артефакта, действительно требует Pro edition; но это также может быть достигнуто с помощью небольшой работы на вашей стороне и нескольких основных скриптов.
Вариант 1-Поиск:
выполнить GAVC поиск по набор координат идентификатора группы и идентификатора артефакта для извлечения всех существующих версий этого набора; затем можно использовать любой алгоритм сравнения строк версий для определения последней версии.
Вариант 2-путь Maven:
Artifactory генерирует стандарт метаданных XML это должно потребляться Maven, потому что Maven сталкивается с той же проблемой-определение последней версии; метаданные перечисляют все доступные версии артефакта и генерируется для каждой папки уровня артефакта; с помощью простого запроса GET и некоторого синтаксического анализа XML вы можете обнаружить последнюю версию.
что-то вроде следующего скрипта bash получит самый последний 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>.*//")
build=$(curl -s $path/$version/maven-metadata.xml | grep '<value>' | head -1 | sed "s/.*<value>\([^<]*\)<\/value>.*//")
jar=$name-$build.jar
url=$path/$version/$jar
# Download
echo $url
wget -q -N $url
он чувствует себя немного грязным, да, но он выполняет свою работу.
использование Shell / unix tools
curl 'http://$artiserver/artifactory/api/storage/$repokey/$path/$version/?lastModified'
вышеуказанная команда отвечает JSON с двумя элементами - "uri"и " lastModified"
получение ссылки в uri возвращает другой JSON, который имеет "downloadUri" артефакта.
получить ссылку в" downloadUri", и у вас есть последний артефакт.
Использование Дженкинса Artifactory плагин
(требуется Pro) для разрешения и загрузки последнего артефакта, если плагин Jenkins Artifactory использовался для публикации в artifactory в другом задании:
- Выберите Универсальную Искусственную Интеграцию
- использовать разрешенные артефакты как
${repokey}:**/${component}*.jar;status=${STATUS}@${PUBLISH_BUILDJOB}#LATEST=>${targetDir}
можно использовать wget --user=USER --password=PASSWORD ..
команда, но прежде чем вы сможете это сделать, вы должны разрешить artifactory принудительно аутентифицировать, что может быть сделано сняв в "скрыть наличие несанкционированных ресурсов" box at Безопасность/Общие на панель администратора artifactory. В противном случае artifactory отправляет страницу 404, и wget не может аутентифицироваться в artifactory.
роль Artifactory-предоставить файлы для Maven (а также другие инструменты сборки, такие как Ivy, Gradle или sbt). Вы можете просто использовать Maven вместе с в Maven-зависимость-плагин чтобы скопировать артефакты. Вот пом план, чтобы вы начали...
<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
для копирования.
вы можете использовать REST-API "пункт последней модификации". Из документов он повторяет что-то вроде этого:
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}"
С последними версиями artifactory вы можете запросить это через api.
если у вас есть артефакт maven с 2 снимками
name = > ' com.вершина.derp'
версия => 0.1.0
имя РЕПО = > 'foo'
снимок 1 => derp-0.1.0-20161121.183847-3 - ... Джар
снимок 2 => derp-0.1.0-20161122.00000-0 - ... сосуд
тогда полные пути будут
и
вы бы получить последние, как так:
curl https://artifactory.example.com/artifactory/foo/com/acme/derp/0.1.0-SNAPSHOT/derp-0.1.0-SNAPSHOT.jar
вы также можете использовать Язык Запросов Artifactory чтобы получить последний артефакт.
следующий сценарий оболочки-это всего лишь пример. Он использует предметы.find ()' (который доступен в версии non-Pro), например items.find({ "repo": {"$eq":"my-repo"}, "name": {"$match" : "my-file*"}})
который ищет файлы с именем репозитория, равным "my-repo", и соответствует всем файлам, начинающимся с"my-file". Затем он использует shell JSON parser ./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
Это может быть новая:
https://artifactory.example.com/artifactory/repo/com/example/foo/1.0.[RELEASE]/foo-1.0.[RELEASE].tgz
для модуля загрузки foo от example.com - ... Держите части [RELEASE] дословно. Это упоминается в документах, но не совсем ясно, что вы можете поместить [RELEASE] в URL (в отличие от шаблона подстановки для разработчика).
Я использую Nexus, и этот код работает для меня-может повторить оба релиз и последний 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