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

时间:2016-04-27 08:22:57

标签: maven jenkins continuous-integration sonarqube sonarqube-scan

情况:

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

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

  1. 构建后操作“使用maven进行SonarQube分析”但已弃用,因此我不想使用它
  2. 建议后步骤“执行SonarQube扫描仪”,是推荐的方式。
  3. 问题:

    如果我使用弃用的Post Build Action,声纳项目配置的属性将从项目pom中自动导出。

    我使用推荐的Post Build Step,我收到了Exception

      

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

    不受欢迎的解决方案

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

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

    我想要什么

    我想在Jenkins中使用推荐的Post Build Step,而不重新定义我所有项目的所有项目属性,以使声纳高兴。相反,sonar / jenkins / plugin /应该从我的maven pom文件中获取属性。我可以使用额外的插件吗?我可以重新配置我的Jenkins-Sonar-Plugin吗?

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

2 个答案:

答案 0 :(得分:17)

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

  • 在Jenkins安装最新的SonarQube插件(截至目前为v2.4)
  • 在SonarQube服务器下的System Config中
  • :选中var keysJustInFirst = dict1.Keys.Except(dict2.Keys); var keysJustInSecond = dict2.Keys.Except(dict1.Keys); var commonKeys = dict1.Keys.Intersect(dict2.Keys);
  • 在Maven项目的配置中:
    • 检查var scores = [ {person_id: "1", score_math: 9, score_biology: 9, score_chemistry: 9}, {person_id: "2", score_math: 9, score_biology: 8, score_chemistry: 9} ]; var persons = [ {person_id: "1", person_name: "Bob", home_country: "Wakerly", age: 12}, {person_id: "2", person_name: "Arnie", home_country: "Templeton", age: 15}, {person_id: "3", person_name: "Steve", home_country: "Elberon", age: 10} ]; //Function used in the .filter method. 'this' object is actually the person_id function getScoreByPersonId(score){ return score.person_id == this; } //Basic students implementations. You can enrich the structure of the 'item' object depending on your requirements. var students = persons.map(function(p){ var item = {}; item['person'] = p; item['score'] = scores.filter(getScoreByPersonId, p.person_id)[0] || {}; return item; });
    • 添加构建后步骤Enable injection of SonarQube server configuration as build environment variables并利用Prepare SonarQube Scanner environment字段中注入的环境变量,例如:
        

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

修改:当the documentationInvoke top-level Maven targets时,它指的是旧的构建后操作,不再记录。该警告之后的段落(在本回答中总结)确实是推荐的程序。插图here如果仍然不清楚。

答案 1 :(得分:2)

使用SonarQube扫描仪作为后期构建步骤,您可以在Analysis属性中至少使用此属性对其进行配置:

What is an average duck’s shoe size?
 6
6? How do you know?
I know
I know? Ineresting!

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