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

我需要从Artifactory中的仓库获取最新的工件(例如快照)。 这个工件需要通过脚本复制到服务器(Linux)。

我有什么select? 像Wget / SCP的东西? 而我怎么得到神器的path?

我发现了一些需要Artifactory Pro的解决scheme。 但我只有Artifactory,而不是Artifactory Pro。

是否有可能从Artifactory下载没有用户界面,也没有Pro版本? 什么是经验?

如果有问题,我在OpenSUSE 12.1(x86_64)上。

Artifactory有一个很好的广泛的REST-API ,几乎所有可以在UI中完成的事情(甚至更多)也可以使用简单的HTTP请求来完成。

你提到的function – 检索最新的神器,确实需要Pro版本; 但是也可以通过在你身边的一些工作和一些基本的脚本来实现。

选项1 – search:

在一组组 ID和工件ID坐标上执行GAVCsearch以检索该组的所有现有版本; 那么你可以使用任何版本string比较algorithm来确定最新版本。

选项2 – Maven的方式:

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

像下面的bash脚本将从snapshot回购中检索最新的com.company:artifact快照:

 # 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 

这感觉有点肮脏,是的,但它完成了工作。

使用shell / unix工具:

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

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

  1. 获取uri中的链接返回另一个JSON,其中包含artefact的“downloadUri”。

  2. 取得“downloadUri”链接,你有最新的artefact。

使用Jenkins Artifactory插件 (需要专业版)来parsing和下载最新的工件,如果使用Jenkins Artifactory插件在其他工作中发布到artifactory:

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

您可以使用wget --user=USER --password=PASSWORD ..命令,但在执行此操作之前,必须允许artifactory强制进行身份validation,可以通过取消选中隐藏非授权资源的存在 ”框artifactorypipe理面板中的 安全/常规选项卡。 否则,artifactory发送一个404页面,而wget不能对artifactory进行authentication。

Artifactory的作用是为Maven提供文件(以及其他构build工具,如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即可进行复制。

我使用Nexus,这个代码适用于我 – 可以检索releaselast snaphsot ,具体取决于存储库types:

 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 

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

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

如果你有一个有2个快照的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

那么完整的path将是

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 

您可以使用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查询语言获取最新的工件。

下面的shell脚本就是一个例子。 它使用'items.find()'(在非Pro版本中可用),例如items.find({ "repo": {"$eq":"my-repo"}, "name": {"$match" : "my-file*"}})search存储库名称等于”my-repo“的文件,并匹配所有以”my-file“开头的文件。 然后,它使用shell JSONparsing器./jq通过按“更新”date字段进行sorting来提取最新的文件。 然后使用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