如何下载Artifactory的库中的最新神器?(How to download the lates

2019-07-17 11:59发布

我需要最新的假象(例如快照)从一个仓库Artifactory的 。 这神器需要通过一个脚本复制到服务器(Linux)的。

我有哪些选择? 类似的Wget / SCP ? 我如何获得神器的路径?

我找到了一些解决方案,需要Artifactory的专业版。 但我一直Artifactory的,不artifactory的专业版。

是否有可能在所有从Artifactory的下载而无需用户界面和不具有亲版本? 什么是经验?

我在openSUSE 12.1(x86_64的),如果该事项。

Answer 1:

Artifactory的具有良好广泛的REST的API ,几乎任何可以在UI使用简单的HTTP请求来完成(甚至更多),也可以做。

你提到的功能 - 检索最新的神器,确实需要专业版; 但它也可以用在你身边一些工作和一些基本的脚本来实现。

选项1 -搜索:

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

选项2 - Maven的方式:

artifactory的生成标准的XML元数据要由Maven的消耗,因为Maven的面临着同样的问题: -确定最新版本; 元数据列出了工件的所有可用的版本,并为每一个神器级的文件夹中生成; 用一个简单的GET请求和一些XML解析,你可以发现最新版本。



Answer 2:

像下面的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>.*/\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

这感觉有点脏,是的,但它能够完成任务。



Answer 3:

使用shell / Unix工具

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

上述命令与响应JSON具有两个元素 - “URI”和“上次更改时间”

  1. 获取URI中的链接将返回其拥有的神器“downloadUri”另一个JSON。

  2. 取在“downloadUri”的链接,你有最新的假象。

使用詹金斯Artifactory的插件

(需要专业版)来解决,并下载最新的神器,如果詹金斯Artifactory的插件是用来发布的另一份工作artifactory的:

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


Answer 4:

您可以使用REST的API的“ 项目上次修改 ”。 从文档,它retuns是这样的:

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}"


Answer 5:

您可以使用wget --user=USER --password=PASSWORD ..命令,但在此之前,你可以做到这一点,你必须允许artifactory的强制认证,这可以通过在取消选中隐藏未经授权的资源存在 ”窗口内完成在artifactory的管理面板 安全/常规选项卡。 否则artifactory的发送404页和wget无法验证到artifactory的。



Answer 6:

Artifactory的的作用是提供对文件的Maven (以及其他的构建工具,如常春藤,摇篮或SBT)。 你可以只使用Maven连同Maven的依赖,插件的文物复制出来。 这里有一个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做副本。



Answer 7:

随着最新版本artifactory的,你可以通过API查询此。

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

如果你有2个快照行家神器

名>“com.acme.derp”
版本=> 0.1.0
回购名=>“富”
快照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


Answer 8:

你也可以使用Artifactory的查询语言 ,以获取最新神器。

下面的脚本仅仅是一个例子。 它使用“items.find()”(它可在非专业版),例如items.find({ "repo": {"$eq":"my-repo"}, "name": {"$match" : "my-file*"}})搜索是有一个库名称相同的文件‘我回购’,并匹配以开头的文件‘我的文件’。 然后,它使用的外壳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


Answer 9:

这可能是新的:

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

对于来自example.com加载模块foo中。 按住[RELEASE]部分一字不差。 这是在文档中提到,但它不是非常清楚,你实际上可以把[执行]到URL(而不是一个替代模式的开发者)。



Answer 10:

对我来说,最简单的方法是用卷曲,grep的,排序和尾部的组合来读取项目的最后一个版本。

我的格式:服务 - (版本:23年9月1日) - (buildnumber)156.tar.gz

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


Answer 11:

如果你想下载2个repositores之间最新的罐子,你可以使用此解决方案。 实际上我用它在我的詹金斯管道中,它完美的作品。 比方说,你有一个插件释放本地和插件快照本地,你要下载这些之间最新的罐子。 你的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和或多个回购之间最新的软件包很多。 希望它可以帮助吴太! 欲了解更多詹金斯脚本管线信息,请访问詹金斯文档 。



Answer 12:

我使用Nexus和此代码的工作对我来说,能retrive都释放最后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


文章来源: How to download the latest artifact from Artifactory repository?