从 Jenkins 的 pom 文件中自动派生强制性 SonarQube 属性

Posted

技术标签:

【中文标题】从 Jenkins 的 pom 文件中自动派生强制性 SonarQube 属性【英文标题】:Automatically derive mandatory SonarQube properties from pom file in Jenkins 【发布时间】:2016-08-21 10:06:21 【问题描述】:

情况:

我想用 Jenkins (1.642.4) 触发的 SonarQube (5.4) 分析我的项目。这是一个使用 maven 构建的 java 项目。

我看到了两种触发分析的方法:

    构建后操作“使用 maven 进行 SonarQube 分析”,但它已弃用,所以我不想使用它 构建后步骤“执行 SonarQube 扫描仪”是推荐的方式。

问题:

如果我使用已弃用的 Post Build Action,声纳项目配置的属性会自动从项目 pom 派生。

如果我使用推荐的后期构建步骤,我会收到异常

您必须为“未知”定义以下强制属性:sonar.projectKey、sonar.projectName、sonar.projectVersion、sonar.sources

不需要的解决方案

解决方案是通过 java 项目中的 sonar-project.properties 文件或通过 Jenkins 步骤中的参数提供所需的属性。

恕我直言:这是重复。所有相关信息都在 Maven pom 中定义:projectKey 可以从 artifactId 派生,projectName 和 projectVerstion 在 maven 中是相同的属性。特别是 projectVersion 至关重要。我不想在每次发布后更新项目版本(或者在发布插件中编写一些代码来自动更新)。

我想要什么

我想在 Jenkins 中使用推荐的构建后步骤,而不为我的所有项目重新定义所有项目属性以使声纳满意。相反 sonar/jenkins/plugin/whatever 应该从我的 maven pom 文件中派生属性。我可以使用其他插件吗?我可以重新配置我的 Jenkins-Sonar-Plugin 吗?

我不想在我的 pom/项目中提供任何声纳特定信息,因为该项目不应该关心声纳。它应该只包含构建项目所需的信息。

【问题讨论】:

【参考方案1】:

The documentation(虽然有点混乱,请参阅下面的编辑)解释了如何使用通用的构建后步骤(利用环境变量),而不是弃用的构建后操作。简而言之:

在 Jenkins 中安装最新的 SonarQube 插件(目前为 v2.4) 在 SonarQube 服务器下的系统配置中:检查 Enable injection of SonarQube server configuration as build environment variables 在您的 Maven 项目的配置中: 检查Prepare SonarQube Scanner environment 添加构建后步骤Invoke top-level Maven targets 并利用Goals 字段中注入的环境变量,例如:

$SONAR_MAVEN_GOAL -Dsonar.host.url=$SONAR_HOST_URL -Dsonar.login=$SONAR_AUTH_TOKEN

编辑:当 the documentation 说 The Post-build Action for Maven analysis is deprecated. 时,它指的是旧的构建后 action 不再记录。该警告之后的段落(在此答案中进行了总结)确实是推荐的程序。图here如果还不清楚的话。

【讨论】:

感谢您的回答,但在链接的文档中,您可以看到以下文本:“不推荐使用 Maven 分析的构建后操作。不推荐使用 Maven 分析的构建后操作。”很遗憾,这个解决方案不符合我的要求。 您误解了文档:不推荐使用的是 Post-Build Action。我的回答和文档(警告下方)中描述的是使用标准 Maven 构建步骤(和环境变量注入)的推荐方法。看到这个illustration。 你是对的。这个 maven 目标作为构建后的 STEP 执行。因此,弃用不涉及该解决方案。我将删除我的答案,因为正如您所说,由于不是自动化的项目结构使用,这是一个坏主意。非常感谢【参考方案2】:

使用 SonarQube Scanner 作为构建后步骤,您可以在分析属性中至少使用以下属性对其进行配置:

sonar.projectKey=$POM_ARTIFACTID
sonar.projectName=$POM_DISPLAYNAME
sonar.projectVersion=$POM_VERSION
sonar.sources=src
sonar.java.binaries=target
sonar.language=java
sonar.sourceEncoding=UTF-8

POM_* 变量由 Jenkins 从 Maven GAV 信息映射,看这里:https://github.com/jenkinsci/jenkins/pull/933/files

【讨论】:

以上是关于从 Jenkins 的 pom 文件中自动派生强制性 SonarQube 属性的主要内容,如果未能解决你的问题,请参考以下文章

jenkins参数化配置,pom.xml配置

利用Jenkins与profile管理自动集成中的配置文件

从Maven pom.xml更新sonar-project.properties文件中的特定属性?

jenkins读取pom.xml

Webdriver+testNG+ReportNG+Maven+SVN+Jenkins自动化测试框架的pom.xml配置

为啥可以从指向实例化基类对象的强制转换指针调用非静态派生类方法?