1

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

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

4

1 回答 1

2

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

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

    1. 常规 - 此项目已参数化
      1. 字符串参数 PROJECTKEY
      2. 字符串参数 PROJECTNAME
      3. 字符串参数 PROJECTVERSION
    2. 常规—限制此项目可以运行的位置,设置为您用于 SonarQube 服务器的 Jenkins 构建节点名称。
    3. 源代码管理
      1. 存储库 URL设置为要分析的存储库。
      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“SonarQube Scanner for MSBuild - 开始分析”。
      2. SonarQube.Analysis.xml文件明确禁止分配属性sonar.projectNamesonar.projectKeysonar.projectVersion
  5. 我可能忽略了一些东西;请不要犹豫,询问。
于 2017-06-07T20:05:35.053 回答