groovy上传jar到nexus

时间:2013-06-05 07:01:37

标签: http groovy upload ivy nexus

我有一些jar文件(自定义),我需要从Groovy脚本发布到Sonatype Nexus存储库。

我的jar位于Groovy脚本工作的机器上的某个路径中(例如:c:\ temp \ module.jar)。

我的Nexus repo网址是http://:/ nexus / content / repositories /

在这个回购中我有文件夹结构,如:folder1-> folder2-> folder3

在发布我的jar时,我需要在folder3中创建:

  1. 包含模块修订版的新目录(我的Groovy脚本知道此版本)
  2. 将jar上传到此目录
  3. 为jar上传
  4. 创建pom,md5和sha1文件

    经过几天的调查后,我仍然不知道如何创建这样的脚本,但这种方式看起来非常清晰,而不是直接上传。

    我找到了http://groovy.codehaus.org/Using+Ant+Libraries+with+AntBuilder和其他一些东西(stackoverflow non script solution)。

    我知道如何在我的Groovy脚本中创建ivy.xml,但我不明白如何动态创建build.xml和ivysetting.xml并设置整个系统。

    你能帮助理解Groovy的方式吗?

    更新 我发现以下命令对我来说很好:

    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 file=@module.jar -u admin:admin123 http://<my_nexusServer>:8081/nexus/service/local/repositories
    

    据我所知,curl对Nexus服务执行POST请求。我是对的吗?

    现在我正在尝试使用Groovy HTTPBuilder构建HTTP POST请求。

    我应该如何将curl命令参数转换为Groovy的HTTPBuilder请求?

2 个答案:

答案 0 :(得分:3)

找到了一种使用常规HttpBuilder执行此操作的方法。

基于来自sonatype的信息以及其他一些来源。

这适用于http-builder版本0.7.2(不适用于早期版本) 并且还需要一个额外的依赖:&#39; org.apache.httpcomponents:httpmime:4.2.1&#39;

该示例还使用针对nexus的基本身份验证。

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()
    }
  }
}

`

答案 1 :(得分: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任务以在上传到Nexus之前生成Maven POM文件。
  • Nexus的REST API运行良好。我发现它们有点神秘,当然使用它们的解决方案不能支持多个存储库管理器(Nexus不是唯一可用的存储库管理器技术)。
  • “deleteOnExit”文件方法调用可确保正确清理工作文件。