code

Artifactory 저장소에서 최신 아티팩트를 다운로드하는 방법은 무엇입니까?

codestyles 2020. 12. 15. 19:21
반응형

Artifactory 저장소에서 최신 아티팩트를 다운로드하는 방법은 무엇입니까?


Artifactory 의 저장소에서 최신 아티팩트 (예 : 스냅 샷)가 필요합니다 . 이 아티팩트는 스크립트를 통해 서버 (Linux)에 복사해야합니다.

내 옵션은 무엇입니까? Wget / SCP 와 같은 것 ? 그리고 유물의 경로는 어떻게 얻습니까?

Artifactory Pro가 필요한 몇 가지 솔루션을 찾았습니다. 하지만 저는 Artifactory Pro가 아닌 Artifactory 만 있습니다.

UI없이 Pro 버전이없는 Artifactory에서 다운로드 할 수 있습니까? 경험은 무엇입니까?

중요한 경우 OpenSUSE 12.1 (x86_64)을 사용하고 있습니다.


Artifactory는 광범위한 REST-API 를 가지고 있으며 UI에서 수행 할 수있는 거의 모든 작업을 간단한 HTTP 요청을 사용하여 수행 할 수도 있습니다.

여러분이 언급 한 기능인 최신 아티팩트를 검색하려면 실제로 Pro 에디션이 필요합니다. 그러나 약간의 작업과 몇 가지 기본 스크립트로도 달성 할 수 있습니다.

옵션 1-검색 :

그룹 ID 및 아티팩트 ID 좌표 세트 에서 GAVC 검색을 수행하여 해당 세트의 모든 기존 버전을 검색합니다. 그런 다음 모든 버전 문자열 비교 알고리즘을 사용하여 최신 버전을 확인할 수 있습니다.

옵션 2-Maven 방식 :

Artifactory는 Maven이 사용하는 표준 XML 메타 데이터생성합니다. Maven은 동일한 문제에 직면하기 때문에 최신 버전을 결정합니다. 메타 데이터는 사용 가능한 모든 버전의 이슈를 나열하며 모든 이슈 수준 폴더에 대해 생성됩니다. 간단한 GET 요청과 일부 XML 구문 분석을 통해 최신 버전을 찾을 수 있습니다.


다음 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

예, 약간 더러워진 느낌이 들지만 작업이 완료됩니다.


쉘 / 유닉스 도구 사용

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

위의 명령은 "uri"와 "lastModified"라는 두 가지 요소가있는 JSON으로 응답합니다.

  1. uri에서 링크를 가져 오면 아티팩트의 "downloadUri"가있는 다른 JSON이 반환됩니다.

  2. "downloadUri"에서 링크를 가져 오면 최신 아티팩트가 있습니다.

Jenkins Artifactory 플러그인 사용

(Pro 필요) Jenkins Artifactory 플러그인을 사용하여 다른 작업의 artifactory에 게시 한 경우 최신 아티팩트를 해결하고 다운로드하려면 :

  1. Generic Artifactory Integration 선택
  2. 해결 된 아티팩트 사용 ${repokey}:**/${component}*.jar;status=${STATUS}@${PUBLISH_BUILDJOB}#LATEST=>${targetDir}

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

wget --user=USER --password=PASSWORD ..명령을 사용할 수 있지만이를 수행하기 전에 아티 팩토리가 인증을 강제하도록 허용해야합니다. 이는 아티 팩토리 관리자 패널의 보안 / 일반 탭에서 " 권한없는 리소스의 존재 숨기기 "상자를 선택 취소 하여 수행 할 수 있습니다 . 그렇지 않으면 artifactory는 404 페이지를 보내고 wget은 artifactory에 인증 할 수 없습니다.


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복사하기 위해 실행 하십시오.


최신 버전의 아티팩트를 사용하면 API를 통해이를 쿼리 할 수 ​​있습니다.

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

2 개의 스냅 샷이있는 Maven 아티팩트가있는 경우

name => 'com.acme.derp'version
=> 0.1.0
repo name => '
foo'snapshot 1 => derp-0.1.0-20161121.183847-3.jar
snapshot 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

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

이것은 새로운 것일 수 있습니다.

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

example.com에서 foo 모듈을로드합니다. [RELEASE] 부품은 그대로 유지하십시오. 이것은 문서에 언급되어 있지만 실제로 [RELEASE]를 URL에 넣을 수 있다는 것은 명확하지 않습니다 (개발자를위한 대체 패턴이 아님).


For me the easiest way was to read the last versions of the project with a combination of curl, grep, sort and tail.

My format: 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)

If you want to download the latest jar between 2 repositores, you can use this solution. I actually use it within my Jenkins pipeline, it works perfectly. Let's say you have a plugins-release-local and plugins-snapshot-local and you want to download the latest jar between these. Your shell script should look like this

NOTE : I use jfrog cli and it's configured with my Artifactory server.

Use case : Shell script

# 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

Use case : Jenkins Pipeline

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

This helps alot when you want to get the latest package between 1 or more repos. Hope it helps u too! For more Jenkins scripted pipelines info, visit Jenkins docs.


I use Nexus and this code works for me—can retrive both release and last snaphsot, depending on repository type:

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

ReferenceURL : https://stackoverflow.com/questions/13989033/how-to-download-the-latest-artifact-from-artifactory-repository

반응형