2013-02-04 62 views
0

我使用maven2,这是哈德森和声纳 而做声纳分析声纳 - 我想一些方法来追加哈德森打造#到项目项目版本使用哈德森

的项目版本的Maven版本更改每2周 - 所以要在第2周的例子:

<version>abc-SNAPSHOT</version> 

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

<version>xyz-SNAPSHOT</version> 

我要的是生成#追加到版本已经出现在POM - 这是被拾起,并通过声纳

注:

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

这里 - 我硬编码的版本和动态传递构建#

我想要的是能够动态地拿起从行家的版本(不改变的话),只是附加构建#动态

如何可以做到这一点任何想法? 谢谢, 萨蒂什南比亚

回答

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}

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

+0

感谢安德烈 - 但是当我使用的脚本 - 我得到这样的例外:错误:无法评估Groovy脚本。 groovy.lang.MissingMethodException:没有方法的签名:hudson.model.FreeStyleProject.getModules()适用于参数类型:()值:{} \t at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter。 java:53) –

+0

试试我在post上添加的脚本。 –

+0

您可以添加 import hudson.model。* def POM_LOCATION = build.parent.builds [0] .properties.get(“envVars”)['WORKSPACE'] +“/pom.xml”;到你的系统groovy脚本来找到你的pom.xml的正确位置。 – despot

0

这不是一个真正的Sonar问题。这是Maven项目版本控制。

Snaphots被设计成动态的。你会发现引擎盖下Maven正在你的Maven仓库中保存时间戳记的版本(我不知道这些时间戳是如何传递给Sonar的,这可能是你想要的)。快照构建是CI作业的理想选择。非开发人员不会使用的软件。

我推荐的是停止使用快照(每次构建一个“发布”),或者只是接受Maven中有两种构建的事实。我的规则是,如果代码被其他人使用,那么它不再是快照,应该被视为发布。这对新兴方法如持续部署造成了挑战.....如果每个构建都转到生产(或生产拷贝),那么快照变得不相关。

每次构建发布并不是那么糟糕。首先命名约定的,我建议:

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

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

+0

马克感谢您的详细信息 - 但快照的使用或不使用不在我的控制之内 - 但您的意见是赞赏的 –

0

感谢安德烈指着我的其他链接 我做了尝试,但也陷入了作为评论 指出的一些问题假设我所做的仅仅是一个解决办法,有一个更好的解决办法? (我正在使用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); 

我则“触发参数其他项目建设”,并提到在我的POM

定义的参数希望行家版本mentioend工作 - $ {MAVEN_VERSION}

我然后能够得到这个参数i的值n中的“其他”工作

所以首先感谢安德烈 - 他为我提供了一个解决方案 我很好奇,想知道这是否是一个好方法 另一个问题我已经是(这或许我将开始一个新的线程)是 - 哈德森“自由风格”工作与“Maven 2/3传统项目”有什么不同?

我问的原因是相同的Groovy脚本在“自由风格”中失败,而在“Maven遗留”

感谢, 萨蒂什南比亚

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是没有必要的),并粘贴在“常规命令”的代码。

0

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

基本上你可以在制作的访问ENV变量,从Maven的GAV信息詹金斯映射

  • POM_DISPLAYNAME
  • POM_DISPLAYNAME
  • POM_VERSION
  • POM_GROUPID
  • POM_ARTIFACTID
  • POM_PACKAGING
  • POM_RELATIVEPATH