项目版本从maven到使用hudson的声纳

时间:2013-02-04 17:13:53

标签: maven sonarqube

我正在使用maven2,hudson和声纳 在进行声纳分析时 - 我想用某种方法将Hudson build#附加到项目的maven版本

项目版本每两周更换一次 - 所以在前两周举个例子:

<version>abc-SNAPSHOT</version>

两周后,下一个版本可能是这样的:

<version>xyz-SNAPSHOT</version>

我想要的是将构建#附加到已经存在于pom中的版本 - 它被拾取并传递给声纳

注:

-Dsonar.projectVersion=xyz-SNAPSHOT-${BUILD_NUMBER}

这里 - 我正在硬编码版本并动态传递构建#

我想要的是能够从maven动态获取版本(无需更改)并简单地追加构建#动态

有关如何实现这一目标的任何想法? 谢谢, 萨蒂什南比亚

5 个答案:

答案 0 :(得分:2)

您可以使用Groovy脚本来读取版本并放置环境变量: Getting Maven Version in Jenkins

我按时使用这个脚本来解析版本:

def project = new XmlParser().parse("/pom.xml")
def artifactId =  project.artifactId.text().trim()
def version = project.version.text().trim()
println "ArtifactId: [" + artifactId + "]"
println "Version: [" + version + "]"

将“其他属性”字段设置为: -Dsonar.projectVersion = $ {MAVEN_VERSION} - $ {BUILD_NUMBER}

如果Jenkins没有获得变量,请尝试安装: https://wiki.jenkins-ci.org/display/JENKINS/EnvInject+Plugin

答案 1 :(得分:1)

您可以使用此Jenkins功能:https://github.com/jenkinsci/jenkins/pull/933/files

基本上你可以在构建时访问env变量,由Jenkins从Maven GAV info

映射
  • POM_DISPLAYNAME
  • POM_DISPLAYNAME
  • POM_VERSION
  • POM_GROUPID
  • POM_ARTIFACTID
  • POM_PACKAGING
  • POM_RELATIVEPATH

答案 2 :(得分:0)

这不是真正的声纳问题。这是Maven项目的版本控制。

Snaphots设计为动态的。你会发现Maven在你的Maven存储库中保存带有时间戳的版本(我不知道这些时间戳如何传递到Sonar,这可能是你想要的)。快照构建是CI作业的理想选择。非开发人员从未使用的软件。

我建议的是停止使用快照(每次都建立一个“发布”),或者只是接受Maven中有两种构建的事实。我的规则是,如果代码被其他人使用,则它不再是快照,应该被视为发布。这为诸如持续部署之类的新兴方法带来了挑战......如果每个构建都进入生产(或生产副本),那么快照就变得无关紧要了。

每次构建版本都不是那么糟糕。首先是命名约定,我建议:

<major>.<minor>.<patch>.<hudson build num>

Maven's release plugin将自动化管理发布细节的大部分痛苦(更新POM,标记SCM系统)。最后还有一个有用的M2_Release plugin,它使您能够从Hudson GUI触发发布。

答案 3 :(得分:0)

感谢Andre指出我的另一个链接 我确实尝试过但是遇到了一些问题,如评论中所述 假设我所做的只是一种解决方法而且有更好的解决方案? (我正在使用Hudson) 所以我在Hudson中定义了一个新的Job(构建Maven 2/3项目(Legacy)) 在这里我定义了一个“Groovy PostBuild” 复制了Andre指出的链接中的代码:

import hudson.model.*;
import hudson.util.*;

def thr = Thread.currentThread();
def currentBuild = thr?.executable;
def mavenVer = currentBuild.getParent().getModules().toArray()[0].getVersion();
def newParamAction = new hudson.model.ParametersAction(new           
hudson.model.StringParameterValue("MAVEN_VERSION", mavenVer));
currentBuild.addAction(newParamAction);

然后我“在其他项目上触发参数化构建”并提到了我希望maven版本作为pom中的mentioend的工作

定义了一个参数 - $ {MAVEN_VERSION}

然后我可以在“其他”作业

中获取此参数的值

首先感谢安德烈 - 他为我提供了一个解决方案 我很想知道这是不是一个好方法 我的另一个问题是(也许我会开始一个新的主题)是 - 哈德森“自由风格”的工作与“Maven 2/3遗产项目”有什么不同

我问的原因是同样的Groovy脚本在“自由风格”中失败了,而它在“Maven遗产”中起作用

谢谢, 萨蒂什南比亚

答案 4 :(得分:0)

有同样的需求并解决了Groovy解析pom的建议。

import jenkins.util.*;
import jenkins.model.*;

def thr = Thread.currentThread();
def currentBuild = thr?.executable;
def workspace = currentBuild.getModuleRoot().absolutize().toString();

def project = new XmlSlurper().parse(new File("$workspace/pom.xml"))

def param = new hudson.model.StringParameterValue("project.version", project.version.toString())
currentBuild.addAction(new hudson.model.ParametersAction(param));

将此脚本添加为“执行系统Groovy脚本”类型的后续步骤(因此不需要安装Groovy)并将代码粘贴到“Groovy命令”中。

相关问题