Jenkins构建参数化可选择Nexus工件版本(所有GAV)

时间:2015-06-13 20:52:33

标签: maven jenkins nexus parameterized

是否有Jenkins插件可以对我的Nexus仓库进行群组工件版本(GAV)搜索并列出结果?我希望结果可以在参数化构建中作为选项(下拉列表)。

3 个答案:

答案 0 :(得分:3)

我在Dynamic Choice Parameter添加了一个groovy脚本(参见Jenkins Plugins

一些障碍是:

  1. 我们的Nexus服务器发出了基本的身份验证挑战,因此我无法简单地使用常规" http://blah" .toURL()。text
  2. 我不想装载像httpbuilder这样的缺少groovy的jar,所以我只使用了Java URLConnection类和编码的用户:传递作为标题。
  3. 使用REST api到Nexus获取版本,但必须区分版本和快照。我添加了基于组的身份验证,以便只有开发人员才能访问快照。
  4. GAV排序不是直截了当的。有一种更好的GAV排序方式(使用org.apache.maven.artifact.versioning.ComparableVersion),但我还没有实现它,所以现在,我只是排序,所以较小的字符串排在第一位。
  5. import hudson.model.*
    import jenkins.model.*
    
    def versions=[ ]
    def snapshots=[ ]
    
    // The artifactName could be passed in from another parameter (eg. Extended Choice Parameter) linked to this 'dynamic choice' parameter.
    def address = "https://xyzcompany.com/nexus/service/local/lucene/search?r=releases&g=com.xyzcompany&a=artifactName&c=features&p=xml"
    def urlInfo = address.toURL()
    
    // Consider using tokenstring technique instead of basic auth if pro version of Nexus.
    def authString = "user:pass"; // replace 'user' with username, 'pass' with password.  
    def authStr="Basic " + authString.bytes.encodeBase64().toString()
    
    // Using URLConnection instead of HTTPBuilder et al.
    def connection = urlInfo.openConnection()
    connection.setRequestProperty( "Authorization" , authStr)
    
    def xml="${connection.content.text}"
    def root = new XmlParser().parseText( xml )
    root.data.artifact.each {
     if (it.artifactHits.artifactHit.repositoryId.text() == "releases")
          versions.add("${it.version.text()}");
     else
        snapshots.add("${it.version.text()}");
    }
    
    // There is a better way to GAV sort (using org.apache.maven.artifact.versioning.ComparableVersion) but I have not implemented it yet so for now, I'm simply sorting so the smaller strings line up first.
    versions.sort { -it.size() }
    Collections.reverse(versions)
    
    // Only certain users should be able to see the SNAPSHOT versions
    def userid = User.current().id
    def auths = Jenkins.instance.securityRealm.loadUserByUsername(userid).authorities.collect{a -> a.authority}
    if (["OffShoreDevGroup", "DevGroup"].intersect(auths))
    {
      snapshots.sort { -it.size() }
      Collections.reverse(snapshots)
      versions+=snapshots
    }
    
    versions.add(" "); // My build uses a blank version string to simply report what is already deployed to the container.
    return versions;
    

答案 1 :(得分:3)

无需自定义Ruby脚本。现在有一个专门的插件可以满足您的需求: Maven Metadata Plugin for Jenkins CI server

只需标记“List Maven工件版本”类型的“参数化构建”和“添加参数”:

  • 姓名DATA Step
  • 存储库基本网址(这个很棘手)JOIN

然后向wget / scp / etc添加一个shell命令,你可以使用插件解析的以下变量:

PROC SQL

不幸的是,您无法在同一下拉列表中询问快照和发布。一种可能的解决方法是为MY_RELEASE_JAR添加另一个参数(因此另一个下拉列表,对用户来说有点混乱)。另一种解决方法是为发布部署提供单独的作业。

答案 2 :(得分:0)

选择“动态选择参数”插件,并将以下代码与您自己的主机groupId,artifactId一起放置。

我们可以使用元数据API,您可以同时使用快照repo或release repo或public,仅限制最后5个版本。

def host="https://msnexus.xxx.com"
def groupId="com.xxx.cd".replaceAll("\\.", "/")
def artifactId="common-log"
def nexus_url="${host}/repository/public/${groupId}/${artifactId}/maven-metadata.xml"
def response=nexus_url.toURL().text
def metadata = new XmlParser().parseText(response)

metadata.versioning.versions.version.takeRight(5).collect({it.text()}).reverse()

答案相同,快照中有https://stackoverflow.com/a/64831485/11411638