72

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

我有哪些选择?像Wget / SCP之类的东西?以及如何获得工件的路径?

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

是否可以在没有 UI 且没有 Pro-Version 的情况下从 Artifactory 下载?体验如何?

如果这很重要,我在 OpenSUSE 12.1 (x86_64) 上。

4

14 回答 14

75

类似于以下 bash 脚本的内容将从repo中检索最新的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

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

于 2013-07-21T14:33:37.850 回答
35

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

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

选项 1 - 搜索:

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

选项 2 - Maven 方式:

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

于 2012-12-22T07:20:53.170 回答
18

使用 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}
于 2015-10-09T03:33:20.670 回答
8

您还可以使用Artifactory Query Language来获取最新的工件。

以下 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
于 2017-10-27T15:59:20.180 回答
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
于 2016-11-22T20:09:13.963 回答
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
}

例子:

# 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}"
于 2017-08-02T23:00:36.210 回答
3

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做副本。

于 2013-06-21T20:03:56.547 回答
2

您可以使用该wget --user=USER --password=PASSWORD ..命令,但在执行此操作之前,您必须允许 artifactory 强制身份验证,这可以通过在artifactory 管理面板的Security/General选项卡中取消选中Hide Existence of Unauthorized Resources ”框来完成。否则 artifactory 发送一个 404 页面并且 wget 无法向 artifactory 进行身份验证。

于 2014-05-26T08:38:15.617 回答
2

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

我的格式:service-(version: 1.9.23)-(buildnumber)156.tar.gz

versionToDownload=$(curl -u$user:$password 'https://$artifactory/artifactory/$project/' | grep -o 'service-[^"]*.tar.gz' | sort | tail -1)
于 2019-01-31T13:41:24.207 回答
1

如果要在 2 个存储库之间下载最新的 jar,可以使用此解决方案。我实际上在我的 Jenkins 管道中使用它,它运行良好。假设您有一个 plugins-release-local 和 plugins-snapshot-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

用例:詹金斯管道

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 个或多个 repos 之间获取最新包时,这很有帮助。希望对你也有帮助!有关 Jenkins 脚本化管道的更多信息,请访问Jenkins 文档

于 2019-05-20T11:25:06.593 回答
1

这可能是新的:

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

从 example.com 加载模块 foo 。逐字保留 [RELEASE] 部分。文档中提到了这一点,但并不清楚您实际上可以将 [RELEASE] 放入 URL 中(而不是开发人员的替换模式)。

于 2018-06-14T17:12:06.167 回答
1

使用 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>::'
于 2019-11-13T12:30:36.190 回答
0

没有人提到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

保留文件名

于 2022-03-04T12:31:19.227 回答
0

如果您需要在 Dockerfile 中下载工件,而不是使用 wget 或 curl 等,您可以简单地使用 'ADD' 指令:

添加 ${ARTIFACT_URL} /opt/app/app.jar

当然,棘手的部分是确定 ARTIFACT_URL,但在所有其他答案中已经足够了。

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

于 2020-02-19T13:43:27.167 回答