使用MSBuild / SonarQube通过Jenkins

时间:2017-04-17 22:34:12

标签: unity3d jenkins sonarqube sonarqube-scan sonarqube-msbuild-runner

我继承了运行5.1版并分析数十个Unity C#项目的SonarQube Linux服务器的责任。在将其升级到SQ 6.1之后,我发现在5.5版本中删除了对非Windows系统上的C#项目进行分析的支持,因此我将其降级为5.4版本。

我随后将Windows系统设置为Jenkins节点和SonarQube服务器。但是,我希望用SonarQube评估的项目(主要)是在Unity上开发并且(总是)构建在macOS上,因此缺少MSbuild解决方案文件。我是否可以在这些约束中使用SonarQube,而不是在项目中添加特定于Visual Studio的代码?是否存在某种虚拟解决方案文件,我可以将其添加到项目中,以便在不期望生成工作二进制文件的情况下进行分析(沿着解析/标记化而不编译/链接)?感谢。

1 个答案:

答案 0 :(得分:1)

这是我为通过Jenkins分析SonarQube中的Unity项目而开发的程序。

  1. 面向用户的Jenkins作业,具有以下设置和选项,以及特定于我的环境的其他设置。

    1. 常规 - 此项目已参数化
      1. 字符串参数 PROJECTKEY
      2. 字符串参数 PROJECTNAME
      3. 字符串参数 PROJECTVERSION
    2. 常规 - 限制可以运行此项目的位置设置为您用于SonarQube服务器的Jenkins构建节点名称。
    3. 源代码管理
      1. 存储库网址设置为您要分析的存储库。
      2. 要构建的分支设置为主分支,即refs/heads/master
      3. 根据您的存储库选择的其他行为 - 递归更新子模块
    4. 构建触发器
      1. 轮询SCM 已选中,但未指定任何计划。
    5. 构建环境
      1. 在SCM运行之前运行buildstep - 注入环境变量设置为HOME=C:\Users\Jenkins(或适用于您的系统)。此环境变量使git可以找到与Git服务器一起使用的正确ssh凭据。你需要把你的git私钥放在%HOME%\.ssh;在其他地方记录下来并留给读者练习。
      2. 使用另一个项目的构建环境 - 模板项目指向第二个Jenkins作业。我叫做 SonarQube_Scanner (见下文)。
    6. <强>构建
      1. 使用其他项目的构建器 - 模板项目指向同一个Jenkins作业SonarQube_Scanner
    7. 制作后的操作
      1. 归档工件 - 要存档的文件设置为log.zip
  2. 非面向用户的Jenkins作业( SonarQube_Scanner ),具有以下设置和选项。

    1. 常规 - 禁用此项目已选中。
    2. 常规 - 限制可以运行此项目的位置选中并设置为SonarQube服务器。
    3. 源代码管理设置为无。
    4. 构建环境 - 将构建过程中的环境变量注入

      1. 属性内容包含

        `LANG=en_US.UTF-8`
        
    5. <强>构建

      1. 执行Windows批处理命令包含

        set FILENAME=%WORKSPACE%\client\Assets\Editor\SQMenuItems.cs
        REM Yes, this syntax works and is sooo much more readable
         > %FILENAME% ECHO using UnityEditor;
        >> %FILENAME% ECHO public static class SQMenuItems {
        >> %FILENAME% ECHO   static void AssetsOpenCSharpProject() {
        >> %FILENAME% ECHO #if UNITY_5
        >> %FILENAME% ECHO     EditorApplication.ExecuteMenuItem("Assets/Open C# Project");
        >> %FILENAME% ECHO #else
        >> %FILENAME% ECHO     EditorApplication.ExecuteMenuItem("Assets/Sync MonoDevelop Project");
        >> %FILENAME% ECHO #endif
        >> %FILENAME% ECHO     EditorApplication.Exit(0);
        >> %FILENAME% ECHO   }
        >> %FILENAME% ECHO }
        "C:\Program Files\Unity_5.5.2\Editor\Unity.exe" -quit -batchmode -nographics -logFile "%WORKSPACE%\log.txt" -buildTarget android -projectPath %WORKSPACE%\client -executeMethod SQMenuItems.AssetsOpenCSharpProject
        "C:\Program Files\7-zip\7z.exe" -tzip a log.zip log.txt
        
        • SQMenuItems.cs是触发Unity创建MSBuild所需的.sln.*proj文件的原因。 .sln.*proj文件通常位于.gitignore文件中,因此不在存储库中。
      2. 用于MSBuild的SonarQube扫描仪 - 开始分析

        1. SonarQube安装设置为您用于SonarQube服务器的Jenkins构建节点名称。
        2. 项目密钥设置为${PROJECTKEY}
        3. 项目名称设置为${PROJECTNAME}
        4. 项目版本设置为${PROJECTVERSION}
        5. 其他参数

          /d:sonar.exclusions=**\\SQMenuItems.cs

      3. 执行Windows批处理命令

        "C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" /maxcpucount /nr:false /nologo /target:rebuild /verbosity:quiet client\client.sln
        
        • 您可能需要更改上面的client\client.sln以符合您的环境。我还没有尝试用面向用户的Jenkins作业中定义的环境变量替换它。
      4. 用于MSBuild的SonarQube扫描仪 - 结束分析
  3. 完成
  4. 陷阱
    1. 如果由于Unity无法找到projectPath而导致作业失败,则可能忘记了其许可证密钥。远程桌面到SonarQube服务器并启动Unity GUI。如果弹出询问您的许可证密钥,请重新输入密钥,然后退出。随后的工作应该会成功。
    2. 使信息非常困难以动态方式将信息传递给SonarQube的事情。
      1. 2.5.1“执行Windows批处理命令”中定义的Windows环境变量不会保留到2.5.2“用于MSBuild的SonarQube扫描程序 - 开始分析”。
      2. SonarQube.Analysis.xml文件专门禁止分配属性sonar.projectNamesonar.projectKeysonar.projectVersion
  5. 我可能忽视了一些事情;请不要犹豫,查询。