2017-12-08 24 views
0

yarn-test이 github을 가리키는 VCS repository을 만들었습니다. 주요 목표는 이것을 github에 대한 원격 저장소로 사용하는 것입니다.Artifactory의 원격 저장소가 캐시에 없을 때 이슈를 다운로드 할 수 없습니다.

https://repo-url/artifactory/api/vcs/downloadRelease/yarn-test/yarnpkg/yarn/v0.23.4?ext=tar.gz 

모든 미세 :

다음 URL은 우리가 릴리스를 다운로드 할 수 있습니다. 이 릴리즈는 yarn-test 레지스트리의 캐시에 다운로드됩니다. 내가 사용하는 캐시에서 자료를 다운로드 할 수 있습니다 : 그래서

https://repo-url/artifactory/xx/xx/v0.23.4/yarn-v0.23.4.tar.gz 

:

https://repo-url/artifactory/yarn-test/yarnpkg/yarn/releases/v0.23.4/yarn-v0.23.4.tar.gz 

이것은 우리가 artifactory의 URL의 형식이 될 것으로 예상 플러그인을 사용하기 때문에 우리에게 좋은 것 같다 우리 릴리스가 저장소의 캐시에있을 때 제대로 작동합니다. 그러나 우리 플러그인 구성에서 원사 릴리즈를 업그레이드 할 때 캐시에서 새 버전 (예 : v1.3.2)을 찾고 있습니다. 그것은이 찾고있어

:

https://repo-url/artifactory/yarn-test/yarnpkg/yarn/releases/v1.3.2/yarn-v1.3.2.tar.gz 

의 URL 형식은 좋지만, v1.3.2 버전은 정상입니다 우리의 캐시에 없습니다. 그러나 여기에 우리 문제가 나타납니다. 우리는 이것을 우리의 실제 원격 저장소의 레이아웃으로 '번역'할 것이라고 기대할 것입니다. 그러나 이것은 효과가없는 것 같습니다. 404 오류가 표시됩니다.

왜 이것이 작동하지 않습니까? 우리는 캐시에서 릴리즈를 얻을 수 있지만 릴리즈가 존재하지 않으면 Artifactory 저장소가 레이아웃이 다르기 때문에 github에서 그것을 다운로드 할 수 없습니까?

레이아웃 변경 사항이 영향을 미치지 않습니다. 우리는 영감이 예제를 사용하고 을 (우리가 정말 삭제하고 새로운 레이아웃을 원격 REPO을 다시) : 예를 들어

, 원격 저장소 http://download.java.net/maven/1 상점에게 그것의 유물을 메이븐 (1) 규칙에 따라. 은 Maven 2 레이아웃을 사용하도록이 저장소의 캐시를 구성 할 수 있지만 은 원격 레이아웃 매핑을 Maven 1로 설정합니다. 이렇게하면 저장소 캐시가 Maven 2 요청 및 아티팩트 저장소를 처리하고 원격 저장소에 대한 전송은 Maven 1 대회로 번역됩니다.

source.

답변

1

Artifactory를 통해 VCS 저장소에 액세스 할 때 경로에 api/vcs 접두사가 있어야합니다.
예를 들어, 다음 URL을 사용하여 VCS 저장소를 사용하면 Artifactory의 독립을 사용 또는 로컬 서비스로, 사용자가 액세스 할 경우 : 저장소 이름 가정

http://localhost:8081/artifactory/api/vcs/<repository key> 

것은 실 테스트, 당신은 다음과 같은 요청을 사용해야입니다 v1.3을 얻기 위해서.2 태그 : 특정 태그를 다운로드하는 REST API에 대한 문서가 here를 찾을 수 있습니다

GET https://repo-url/artifactory/api/vcs/downloadTag/yarn-test/yarnpkg/yarn/v1.3.2 

. VCS 리포지토리에 대한 자세한 내용은 documentation을 참조하십시오.

+0

이해가 않습니다하지만 난 정말 내 GET에서 /v0.23.4/yarn-v0.23.4.tar.gz 부분이 필요합니다, 그래서 5 월 artifactory의 환매 특약의 layour을 변환하고 매핑해야 가능한 경우 VCS 레이아웃에서 – lvthillo

+0

캐시를 채우기 위해 한 번 API URL을 호출하는 옵션이있는 경우 바로 뒤에서 tar.gx를 다운로드 할 수 있습니다. 그렇지 않다면, @ uriah-l의 답변을 살펴보면 몇 가지 고급 옵션을 제안합니다. –

1

Artifactory의 저장소 레이아웃은 주로 검색의 이슈 경로를 구문 분석/토큰 화하거나 아티팩트 경로 등에서 이슈 메타 데이터를 유도하는 데 사용됩니다. 저장소 레이아웃은 여기에서 어떤 역할도하지 않습니다.

Artifactory VCS Repo API를 활용하려는 경우 (즉, 릴리스 아카이브를 검색하기 위해 Github REST API에 적절한 요청을 보내면) 요청은 해당 저장소의 API 경로를 통과해야합니다/api/vcs/..)가 아니라 repo의 직접 "정적"다운로드 엔드 포인트를 통과하는 것이 아닙니다. Artifactory는 정적 다운로드 URI를 API URI로 자동 번역하지 않습니다.

  1. 이 가능한 경우 URL의 적절한 구조에 강요하는 플러그인을 수정

    나는이를 볼 수있는 방법

    , 당신은 몇 가지 옵션이 있습니다.

  2. 설정 요청이 Artifactory에 중계된다 URI를하기 전에 적절한 API에 "정적 다운로드"URI를 수정하는 Artifactory 잘난척 리버스 프록시 에 요청 URI의 재 작성의 일종.

  3. "afterDownloadError"이벤트와 같은 이벤트를 가로 채고 "올바른 URL 및 다시 보내기"논리를 구현하는 사용자 플러그인을 작성하십시오. 이 특정 이벤트를 사용하면 응답 페이로드의 상태 코드와 InputStream을 모두 설정할 수 있으므로 본질적으로 적절한 응답으로 404를 무시할 수 있습니다.
download { 
    afterDownloadError { request -> 
     log.warn("Intercepting afterDownloadError event...") 
     def requestRepoKey = request.getRepoPath().getRepoKey() 
     def requestRepoPath = request.getRepoPath().getPath() 
     if (requestRepoKey == "my-repo" && requestRepoPath.endsWith(".tar.gz")) { 
      // Do something with requestRepoPath to turn it into a proper request URI to the VCS REPO 
      // ... 
      // Fetch 
      def http = new HTTPBuilder(ARTIFACTORY_URL + requestRepoPath) 
      log.warn("Directly sending a GET request to: " + ARTIFACTORY_URL + requestRepoPath) 
      http.request(Method.GET, BINARY) { req -> 
       response.success = { resp, binary -> 
        log.info "Got response: ${resp.statusLine}" 
        if (binary != null) { 
         // Set successful status 
         status = 200 
         // Set context-bound inputStream to return this content to the client 
         inputStream = repositories.getContent(deployRepoPath).inputStream 
         log.warn("Successfully intercepted an error on repo my-repo" + 
           " returning content from: " + ARTIFACTORY_URL + requestRepoPath) 

        } else { 
         log.warn("Received 200 response with null response content, returning 404") 
        } 
       } 
       response.failure = { resp -> 
        log.error "Request failed with the following status code: " + resp.statusLine.statusCode 
       } 
      } 
     } 
    } 
} 

our Wiki에 사용자의 플러그인에 대한 자세한 내용을 읽어 여기에 작업을 기반으로 할 수있는 비슷한의 예입니다.

HTH,