2013-06-05 94 views
1

我有一些jar文件(自定義),我需要從Groovy腳本發佈到Sonatype Nexus存儲庫。groovy上傳jar到nexus

我有位於Groovy腳本工作的機器上某個路徑的jar(例如:c:\ temp \ module.jar)。

我的Nexus回購網址是http://:/關係/內容/庫/

在此回購我的文件夾結構,如:folder1-> folder2-> folder3

在出版我的罐子我需要folder3創建:

  1. 與模塊的版本,新的目錄(我的Groovy腳本知道這次修訂)
  2. 上傳JAR到這個目錄
  3. 創建POM,對罈子MD5和SHA1文件上傳

經過幾天的調查我仍然不知道如何創建這樣的腳本,但這種方式看上去很清晰,而不是使用直接上傳。

我發現http://groovy.codehaus.org/Using+Ant+Libraries+with+AntBuilder和其他一些東西(stackoverflow non script solution)。

我得到了如何在我的Groovy腳本中創建ivy.xml,但我不明白如何在運行中創建build.xml和ivysetting.xml並設置整個系統工作。

您能否幫忙瞭解Groovy的方式?

UPDATE: 我發現下面的命令正常工作對我來說:

curl -v -F r=thirdparty -F hasPom=false -F e=jar -F g=<my_groupId> -F a=<my_artifactId> -F v=<my_artifactVersion> -F p=jar -F [email protected] -u admin:admin123 http://<my_nexusServer>:8081/nexus/service/local/repositories 

據我瞭解捲曲執行POST請求的Nexus服務。我對麼?

現在我正在嘗試使用Groovy HTTPBuilder構建HTTP POST請求。

我該如何將curl命令參數轉換爲Groovy的HTTPBuilder請求?

回答

1

Ivy是一個開源庫,所以,一種方法是直接調用這些類。該方法的問題在於如何爲invoke ivy programmatically提供幾個示例。

由於groovy對生成XML有很好的支持,我傾向於創建我理解爲常青藤用戶的文件。

下面的例子被設計爲發佈文件到Nexus產生兩個常春藤和ivysettings文件:

import groovy.xml.NamespaceBuilder 
import groovy.xml.MarkupBuilder 

// Methods 
// ======= 
def generateIvyFile(String fileName) { 
    def file = new File(fileName) 

    file.withWriter { writer -> 
     xml = new MarkupBuilder(writer) 

     xml."ivy-module"(version:"2.0") { 
      info(organisation:"org.dummy", module:"dummy") 
      publications() { 
       artifact(name:"dummy", type:"pom") 
       artifact(name:"dummy", type:"jar") 
      } 
     } 
    } 

    return file 
} 

def generateSettingsFile(String fileName) { 
    def file = new File(fileName) 

    file.withWriter { writer -> 
     xml = new MarkupBuilder(writer) 

     xml.ivysettings() { 
      settings(defaultResolver:"central") 
      credentials(host:"myrepo.com" ,realm:"Sonatype Nexus Repository Manager", username:"deployment", passwd:"deployment123") 
      resolvers() { 
       ibiblio(name:"central", m2compatible:true) 
       ibiblio(name:"myrepo", root:"http://myrepo.com/nexus", m2compatible:true) 
      } 
     } 
    } 

    return file 
} 

// Main program 
// ============ 
def ant = new AntBuilder() 
def ivy = NamespaceBuilder.newInstance(ant, 'antlib:org.apache.ivy.ant') 

generateSettingsFile("ivysettings.xml").deleteOnExit() 
generateIvyFile("ivy.xml").deleteOnExit() 

ivy.resolve() 
ivy.publish(resolver:"myrepo", pubrevision:"1.0", publishivy:false) { 
    artifacts(pattern:"build/poms/[artifact].[ext]") 
    artifacts(pattern:"build/jars/[artifact].[ext]") 
} 

注:

  • 更復雜?也許...但是,如果您不生成常青藤文件(使用它來管理您的依賴項),您可以輕鬆調用makepom任務來生成Maven POM文件,然後再上傳到Nexus中。
  • Nexus的REST API可以正常工作。我發現他們有點神祕,當然一個使用它們的解決方案不能支持多個存儲庫管理器(Nexus不是唯一可用的存儲庫管理器技術)。
  • 「deleteOnExit」文件方法調用可確保正常清理工作文件。
+0

馬克,你能不能請給我HTTPBuilder上傳文物的樣本?它對我來說看起來很輕,因爲我只需要上傳一個文件。 – zubactik

+0

doco很不錯。 http://groovy.codehaus.org/HTTP+Builder爲「POST」取代「GET」方法,你應該是金。我認爲唯一的問題是POM文件生成。我不認爲Nexus爲你做這件事嗎? –

3

找到了一種方法來做到這一點與groovy HttpBuilder。

根據來自sonatype的信息,以及其他一些來源。

這適用於HTTP建設者版本0.7.2(與早期版本) 並且還需要額外的依賴:「org.apache.httpcomponents:httpmime:4.2.1」

該示例還使用基本對聯繫進行認證。

import groovyx.net.http.Method 
import groovyx.net.http.ContentType; 
import org.apache.http.HttpRequest 
import org.apache.http.HttpRequestInterceptor 
import org.apache.http.entity.mime.MultipartEntity 
import org.apache.http.entity.mime.content.FileBody 
import org.apache.http.entity.mime.content.StringBody 
import org.apache.http.protocol.HttpContext 
import groovyx.net.http.HttpResponseException; 

class NexusUpload { 
    def uploadArtifact(Map artifact, File fileToUpload, String user, String password) { 
    def path = "/service/local/artifact/maven/content" 
    HTTPBuilder http = new HTTPBuilder("http://my-nexus.org/") 
    String basicAuthString = "Basic " + "$user:$password".bytes.encodeBase64().toString() 

    http.client.addRequestInterceptor(new HttpRequestInterceptor() { 
     void process(HttpRequest httpRequest, HttpContext httpContext) { 
     httpRequest.addHeader('Authorization', basicAuthString) 
     } 
    }) 
    try { 
     http.request(Method.POST, ContentType.ANY) { req -> 
     uri.path = path 

     MultipartEntity entity = new MultipartEntity() 
     entity.addPart("hasPom", new StringBody("false")) 
     entity.addPart("file", new FileBody(fileToUpload)) 
     entity.addPart("a", new StringBody("my-artifact-id")) 
     entity.addPart("g", new StringBody("my-group-id")) 
     entity.addPart("r", new StringBody("my-repository")) 
     entity.addPart("v", new StringBody("my-version")) 
     req.entity = entity 

     response.success = { resp, reader -> 
     if(resp.status == 201) { 
      println "success!" 
     } 
     } 
    } 

    } catch (HttpResponseException e) { 
     e.printStackTrace() 
    } 
    } 
} 

`