如何从 ArtiFactory 仓库下载最新的工件?

我需要 伪造的中存储库中的最新工件(例如,快照)。这个构件需要通过脚本复制到服务器(Linux)上。

我的选择是什么? 类似 Wget/SCP的东西? 我如何得到工件的路径?

我找到了一些需要伪造专业的解决方案。但是我只有伪造的,没有伪造专业的。

有没有可能在没有用户界面和专业版本的情况下从 Artifactory 下载呢?有什么经验?

如果有必要的话,我使用的是 OpenSUSE 12.1(x86 _ 64)。

195110 次浏览

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

您提到的特性——检索最新的工件,确实需要专业版本; 但它也可以通过您自己的一些工作和一些基本脚本来实现。

选项一-搜寻:

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

选项2-玛文方式:

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

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

像下面这样的 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

感觉有点脏,是的,但它可以完成任务。

您可以使用 wget --user=USER --password=PASSWORD ..命令,但是在此之前,必须允许伪造强制身份验证,这可以通过 不检查人工管理面板人工管理面板保安/一般事务选项卡上的“ < em > 隐藏未经授权资源的存在”框来完成。否则,artiFactory 将发送一个404页面,wget 无法验证伪造。

使用 shell/unix 工具

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

上面的命令使用带有两个元素的 JSON 进行响应——“ uri”和“ lastAmendment”

  1. 获取 uri 中的链接将返回另一个 JSON,它具有工件的“ downloadUri”。

  2. 获取“ downloadUri”中的链接,您就拥有了最新的工件。

使用詹金斯工艺品插件

(需要专业)解决和下载最新的工件,如果詹金斯工厂插件被用来发布到工厂在另一个工作:

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

使用最新版本的伪工厂,您可以通过 API 查询这一点。

Https://www.jfrog.com/confluence/display/rtf/artifactory+rest+api#artifactoryrestapi-retrievelatestartifact

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

Name = > ‘ com.acme.derp’
Version = > 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

您可以使用 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}"

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

下面的 shell 脚本只是一个示例。它使用‘ items.find ()’(在非专业版本中可用) ,例如 items.find({ "repo": {"$eq":"my-repo"}, "name": {"$match" : "my-file*"}})搜索存储库名称等于“ my-repo”的文件,并匹配所有以“ my-file”开头的文件。然后,它使用 Shell JSON 解析器./jq通过按日期字段‘ update’排序来提取最新的文件。最后,它使用 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。[发布]/foo-1.0. [发布] . tgz

用于从 example.com 加载模块 foo。一字不差地保留[发布]部分。文档中提到了这一点,但是没有明确说明是否可以将[ RELEASE ]放到 URL 中(与开发人员的替换模式相反)。

对我来说,最简单的方法是阅读项目的最后版本,并结合使用 curl、 grep、 sort 和 tail。

我的格式: service-(版本: 1.9.23)-(build number)156.tar. gz

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

如果想在两个存储库之间下载最新的 jar,可以使用这个解决方案。实际上我在我的 Jenkins 管道中使用它,它工作得很完美。假设您有一个 plugins-release-local 和 plugins-fast-local,并且您希望在这两个插件之间下载最新的 jar。您的 shell 脚本应该如下所示

注意: 我使用 JFrog Cli,它配置了我的 ArtiFactory 服务器。

用例: Shell 脚本

# 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 管道

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 编写的管道信息,请访问 詹金斯医生

用 awk:

     curl  -sS http://the_repo/com/stackoverflow/the_artifact/maven-metadata.xml | grep latest | awk -F'<latest>' '{print $2}' | awk -F'</latest>' '{print $1}'

与 sed 合作:

    curl  -sS http://the_repo/com/stackoverflow/the_artifact/maven-metadata.xml | grep latest | sed 's:<latest>::' | sed 's:</latest>::'

如果您需要在 Dockerfile 中下载工件,您可以简单地使用“ ADD”指令,而不是使用 wget 或 curl 或类似的命令:

添加 ${ ARTIFACT _ URL }/opt/app/app.jar

当然,棘手的部分是确定 ARTIFACT _ URL,但是在所有其他答案中都有足够的内容。

但是,码头最佳实践强烈反对为此目的使用 ADD,建议使用 wget 或 curl。

没有人提到 Xmllint也就是正确的 xml 解析器,安装时使用:

sudo apt-get update -qq
sudo apt-get install -y libxml2-utils

使用它:

ART_URL="https://artifactory.internal.babycorp.com/artifactory/api-snapshot/com/babycorp/baby-app/CD-684-my-branch-SNAPSHOT"
ART_VERSION=`curl -s $ART_URL/maven-metadata.xml | xmllint --xpath '//snapshotVersion[1]/value/text()' -`

最后:

curl -s -o baby-app.jar ${ART_URL}/baby-app-${ART_VERSION}.jar

或者

wget ${ART_URL}/baby-app-${ART_VERSION}.jar

保留文件名