72

Artifactoryのリポジトリからの最新のアーティファクト(スナップショットなど)が必要です。このアーティファクトは、スクリプトを介してサーバー(Linux)にコピーする必要があります。

私のオプションは何ですか?Wget / SCPのようなもの?そして、アーティファクトのパスを取得するにはどうすればよいですか?

ArtifactoryProを必要とするいくつかのソリューションを見つけました。しかし、私はArtifactory Proではなく、Artifactoryを持っています。

UIがなく、Pro-VersionがないArtifactoryからダウンロードすることは可能ですか?経験は何ですか?

それが重要な場合、私はOpenSUSE 12.1(x86_64)を使用しています。

4

14 に答える 14

75

次のbashスクリプトのようなものは、リポジトリから最新のスナップショットを取得しますcom.company:artifactsnapshot

# 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リクエストを使用して実行することもできます。

あなたが言及する機能-最新のアーティファクトを取得することは、確かにProエディションを必要とします。しかし、それはあなたの側で少しの作業といくつかの基本的なスクリプトで達成することもできます。

オプション1-検索:

グループIDとアーティファクトIDの座標のセットに対してGAVC検索を実行して、そのセットの既存のバージョンをすべて取得します。次に、任意のバージョン文字列比較アルゴリズムを使用して、最新バージョンを判別できます。

オプション2-Mavenの方法:

Artifactoryは、Mavenが使用する標準のXMLメタデータを生成します。これは、Mavenが同じ問題に直面しているためです。つまり、最新バージョンを決定します。メタデータには、アーティファクトの使用可能なすべてのバージョンが一覧表示され、アーティファクトレベルのフォルダーごとに生成されます。単純なGETリクエストといくつかのXML解析で、最新バージョンを見つけることができます。

于 2012-12-22T07:20:53.170 に答える
18

shell/unixツールの使用

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

上記のコマンドは、「uri」と「lastModified」の2つの要素を持つJSONで応答します

  1. uriでリンクをフェッチすると、アーティファクトの「downloadUri」を持つ別のJSONが返されます。

  2. 「downloadUri」のリンクを取得すると、最新のアーティファクトが得られます。

JenkinsArtifactoryプラグインを使用する

(Proが必要)Jenkins Artifactoryプラグインを使用して別のジョブでアーティファクトに公開した場合は、最新のアーティファクトを解決してダウンロードします。

  1. GenericArtifactoryIntegrationを選択します
  2. 解決されたアーティファクトを次のように使用します ${repokey}:**/${component}*.jar;status=${STATUS}@${PUBLISH_BUILDJOB}#LATEST=>${targetDir}
于 2015-10-09T03:33:20.670 に答える
8

Artifactory Query Languageを使用して、最新のアーティファクトを取得することもできます。

次のシェルスクリプトは単なる例です。'items.find()'(Pro以外のバージョンで使用可能)を使用します。たとえばitems.find({ "repo": {"$eq":"my-repo"}, "name": {"$match" : "my-file*"}})、リポジトリ名が "my-repo"で、"my-file"で始まるすべてのファイルと一致するファイルを検索します。 。次に、シェルJSONパーサー./jqを使用して、日付フィールド「updated」で並べ替えて最新のファイルを抽出します。最後に、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

アーティファクトの最近のバージョンでは、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の「最終更新項目」を使用できます。ドキュメントから、次のように再調整します。

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は404ページを送信し、wgetはartifactoryに対して認証できません。

于 2014-05-26T08:38:15.617 に答える
2

私にとって最も簡単な方法は、curl、grep、sort、tailを組み合わせてプロジェクトの最新バージョンを読むことでした。

私のフォーマット:service-(バージョン: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

これは新しいかもしれません:

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

2つのリポジトリ間で最新のjarをダウンロードする場合は、このソリューションを使用できます。私は実際にJenkinsパイプライン内で使用していますが、完全に機能します。plugins-release-localとplugins-snapshot-localがあり、これらの間に最新のjarをダウンロードしたいとします。シェルスクリプトは次のようになります

注:私はjfrog cliを使用しており、Artifactoryサーバーで構成されています。

ユースケース:シェルスクリプト

# 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スクリプトパイプラインの詳細については、Jenkinsドキュメントにアクセスしてください。

于 2019-05-20T11:25:06.593 に答える
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

Dockerfileでアーティファクトをダウンロードする必要がある場合は、wgetやcurlなどを使用する代わりに、「ADD」ディレクティブを使用できます。

${ARTIFACT_URL}/opt/app/app.jarを追加します

もちろん、トリッキーな部分はARTIFACT_URLを決定することですが、他のすべての回答にはそれについて十分です。

ただし、Dockerのベストプラクティスでは、この目的でADDを使用することは強くお勧めしません。また、wgetまたはcurlの使用をお勧めします。

于 2020-02-19T13:43:27.167 に答える
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 に答える