如何从Artifactory存储库下载最新的工件?

use*_*413 58 shell artifactory continuous-deployment

我需要来自Artifactory中的存储库的最新工件(例如,快照).需要通过脚本将此工件复制到服务器(Linux).

我有什么选择?像Wget/SCP这样的东西?我如何获得工件的路径?

我找到了一些需要Artifactory Pro的解决方案.但我只有Artifactory,而不是Artifactory Pro.

是否有可能在没有用户界面的情况下从Artifactory下载而没有Pro-Version?有什么经历?

如果重要的话,我正在使用OpenSUSE 12.1(x86_64).

bti*_*nay 65

像以下bash脚本之类的东西com.company:artifact将从snapshotrepo中检索最新的快照:

# 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
Run Code Online (Sandbox Code Playgroud)

感觉有点脏,是的,但它完成了工作.

  • 使用maven-metadata中的"最新"值并不是一个好主意.它似乎可以正常工作,直到它没有,因为在切换到新的发行版本后它不是可靠性更新.见:http://articles.javatalks.ru/articles/32 (3认同)
  • 这与问题无关,但可能有助于某人.如果证书有问题,请使用*-k*和curl. (2认同)

noa*_*amt 32

Artifactory有一个很好的扩展REST-API,几乎任何可以在UI中完成的事情(可能甚至更多)也可以使用简单的HTTP请求来完成.

你提到的功能 - 检索最新的工件,确实需要专业版; 但也可以通过一些工作和一些基本脚本来实现.

选项1 - 搜索:

一组组 ID和工件ID坐标执行GAVC搜索,以检索该组的所有现有版本; 然后您可以使用任何版本字符串比较算法来确定最新版本.

选项2 - Maven方式:

Artifactory生成一个由Maven使用的标准XML元数据,因为Maven面临同样的问题 - 确定最新版本; 元数据列出了工件的所有可用版本,并为每个工件级文件夹生成; 通过简单的GET请求和一些XML解析,您可以发现最新版本.


小智 11

使用shell/unix工具

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

上面的命令用一个带有两个元素的JSON响应 - "uri"和"lastModified"

  1. 获取uri中的链接会返回另一个具有工件"downloadUri"的JSON.

  2. 获取"downloadUri"中的链接,您就拥有了最新的人工制品.

使用Jenkins Artifactory插件

(需要Pro)解析并下载最新工件,如果使用Jenkins Artifactory插件在另一个工作中发布到artifactory:

  1. 选择Generic Artifactory Integration
  2. 使用已解决的工件作为 ${repokey}:**/${component}*.jar;status=${STATUS}@${PUBLISH_BUILDJOB}#LATEST=>${targetDir}

  • 第一个解决方案也需要Pro,我得到""这个REST API仅在Artifactory Pro中可用(参见:http://www.jfrog.com/addons.php)" (2认同)

Kri*_*ris 6

您还可以使用Artifactory 查询语言来获取最新的工件。

以下 shell 脚本只是一个示例。它使用“items.find()”(在非专业版中可用),例如items.find({ "repo": {"$eq":"my-repo"}, "name": {"$match" : "my-file*"}})搜索存储库名称等于“my-repo”的文件并匹配所有以“my-file”开头的文件. 然后它使用shell 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
Run Code Online (Sandbox Code Playgroud)


spu*_*der 5

使用最新版本的 artifactory,您可以通过 api 进行查询。

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

如果您有一个带有 2 个快照的 Maven 工件

名称 => 'com.acme.derp'
版本 => 0.1.0 存储
库名称 => '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
Run Code Online (Sandbox Code Playgroud)


djh*_*987 5

您可以使用 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
}
Run Code Online (Sandbox Code Playgroud)

例子:

# 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}"
Run Code Online (Sandbox Code Playgroud)

  • 问题是,lastModified 并不一定意味着最新版本 (3认同)