Artifactory のリポジトリから最新のアーティファクト(スナップショットなど)が必要です。このアーティファクトは、スクリプトを介してサーバー(Linux)にコピーする必要があります。
私のオプションは何ですか? Wget / SCP ?のようなものそして、アーティファクトのパスを取得するにはどうすればよいですか?
Artifactory Proを必要とするソリューションをいくつか見つけました。しかし、Artifactory ProではなくArtifactoryを持っています。
UIがなく、Pro-VersionがないArtifactoryからダウンロードすることはまったく可能ですか?経験は何ですか?
問題があれば、OpenSUSE 12.1(x86_64)を使用しています。
Artifactoryには非常に広範な REST-API があり、UIで実行できるほとんどすべて(おそらくそれ以上)を単純なHTTP要求を使用して実行することもできます。
あなたが言及した機能-最新のアーティファクトを取得するには、確かにPro版が必要です。しかし、あなたの側での少しの作業といくつかの基本的なスクリプトで達成することもできます。
オプション1-検索:
グループIDおよび成果物ID座標のセットで GAVC 検索を実行して、そのセットのすべての既存バージョンを取得します。その後、任意のバージョン文字列比較アルゴリズムを使用して、最新バージョンを判断できます。
オプション2-Mavenの方法:
Artifactoryは、標準 XMLメタデータ を生成します。これは、Mavenが同じ問題(最新バージョンの判別)に直面しているためです。メタデータは、アーティファクトの使用可能なすべてのバージョンをリストし、すべてのアーティファクトレベルフォルダーに対して生成されます。簡単なGETリクエストといくつかのXML解析により、最新バージョンを発見できます。
次の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
はい、少し汚い感じがしますが、仕事は完了です。
curl 'http://$artiserver/artifactory/api/storage/$repokey/$path/$version/?lastModified'
上記のコマンドは、「uri」と「lastModified」の2つの要素を持つJSONで応答します
Uriでリンクを取得すると、アーティファクトの「downloadUri」を持つ別のJSONが返されます。
「downloadUri」のリンクを取得すると、最新のアーティファクトが手に入ります。
(Proが必要)Jenkins Artifactoryプラグインを使用して別のジョブの成果物に公開する場合、最新の成果物を解決およびダウンロードするには:
${repokey}:**/${component}*.jar;status=${STATUS}@${PUBLISH_BUILDJOB}#LATEST=>${targetDir}
として使用する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}"
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
を実行してコピーを実行します。
Artifactory Query Language を使用して最新のアーティファクトを取得することもできます。
次のシェルスクリプトは単なる例です。 'items.find()'(非Proバージョンで利用可能)を使用します。 items.find({ "repo": {"$eq":"my-repo"}, "name": {"$match" : "my-file*"}})
「my-repo」に等しいリポジトリ名を持つファイルを検索し、「my-file」で始まるすべてのファイルに一致します。次に、 Shell JSON parser ./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
アーティファクトの最新バージョンでは、APIを介してこれをクエリできます。
2つのスナップショットを持つMavenアーティファクトがある場合
名前=> 'com.acme.derp'
version => 0.1.0
レポ名=> 'foo'
snapshot 1 => derp-0.1.0-20161121.183847-3.jar
snapshot 2 => 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
wget --user=USER --password=PASSWORD ..
コマンドを使用できますが、それを行う前に、アーティファクトが認証を強制することを許可する必要があります。これはnchecking the "許可されていないリソースの存在を隠す "セキュリティ/一般artifactory admin panelのタブそうでない場合、アーティファクトは404ページを送信し、wgetはアーティファクトを認証できません。
これは新しいかもしれません:
Example.comからモジュールfooをロードするため。 [RELEASE]パーツは逐語的に保管してください。これはドキュメントで言及されていますが、(開発者の置換パターンとは対照的に)URLに実際に[RELEASE]を入れることができるかどうかについては明確にされていません。
私にとって最も簡単な方法は、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)
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
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 docs にアクセスしてください。