0

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

项目版本每 2 周更改一次 - 以前 2 周为例:

<version>abc-SNAPSHOT</version>

两周后,下一个版本可能类似于:

<version>xyz-SNAPSHOT</version>

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

笔记:

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

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

我想要的是能够从 maven 动态获取版本(不更改它)并简单地附加 build# 动态

关于如何实现这一点的任何想法?谢谢,萨蒂什

4

5 回答 5

3

您可以使用 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

于 2013-02-05T12:22:40.910 回答
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
于 2017-03-06T20:31:33.020 回答
0

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

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

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

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

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

Maven 的发布插件将自动化管理发布细节(更新 POM、标记 SCM 系统)中的大部分痛苦。最后还有一个有用的M2_Release 插件,可以让您从 Hudson GUI 触发发布。

于 2013-02-06T01:08:06.810 回答
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 遗产”中工作

谢谢,萨蒂什

于 2013-02-06T20:16:52.553 回答
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 命令”中。

于 2013-04-08T12:47:55.737 回答