通过 Jenkins 使用 MSBuild/SonarQube 分析非 Visual Studio、Unity C# 代码

Analyzing non-Visual Studio, Unity C# code with MSBuild/SonarQube via Jenkins

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

我随后设置了一个 Windows 系统作为 Jenkins 节点和 SonarQube 服务器。但是,我希望使用 SonarQube 评估的项目(大部分)是在 Unity 的 macOS 上开发的,并且(总是)是在 macOS 上构建的,因此缺少 MSbuild 解决方案文件。我是否可以在这些限制条件下使用 SonarQube,而不是向项目添加 Visual Studio-specific 代码?是否有某种我可以添加到项目中的虚拟解决方案文件,允许在不期望生成有效二进制文件的情况下对它们进行分析(沿着 parsing/tokenizing 行而不是 compiling/linking)?谢谢

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

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

    1. 一般——这个项目是参数化的
      1. 字符串参数PROJECTKEY
      2. 字符串参数 PROJECTNAME
      3. 字符串参数 PROJECTVERSION
    2. General—Restrict where this project can be 运行 set to Jenkins build node name you used for your SonarQube server.
    3. 源代码管理
      1. Repository URL设置为你要分析的版本库。
      2. 要构建的分支设置为主分支,即refs/heads/master
      3. 其他行为 - 递归更新子模块 检查是否适合您的存储库。
    4. 构建触发器
      1. 轮询 SCM 已检查,但未指定时间表。
    5. 构建环境
      1. 运行 buildstep before SCM 运行s - Inject environment variables set to HOME=C:\Users\Jenkins (or as appropriate for your system)。此环境变量使 git 可以找到正确的 ssh 凭据以用于 Git 服务器。您需要将 git 私钥放入 %HOME%\.ssh;这在别处记录并留作 reader.
      2. 的练习
      3. 使用另一个项目的构建环境——模板项目指向第二个 Jenkins 作业。我的名字叫 SonarQube_Scanner(见下文)。
    6. 建造
      1. 使用来自另一个项目的构建器——模板项目 指向同一个 Jenkins 作业 SonarQube_Scanner.
    7. Post-构建动作
      1. 归档工件—要归档的文件 设置为 log.zip
  2. 具有以下设置和选项的非面向用户的 Jenkins 作业 (SonarQube_Scanner)。

    1. 常规 - 禁用此项目 选中。
    2. 常规——限制这个项目可以运行检查并设置到你的SonarQube服务器的地方。
    3. 源代码管理 设置为 None。
    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-zipz.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.0\Bin\MSBuild.exe" /maxcpucount /nr:false /nologo /target:rebuild /verbosity:quiet client\client.sln
        
        • 您可能需要更改上面的 client\client.sln 以匹配您的环境。我还没有尝试用面向用户的 Jenkins 作业中定义的环境变量替换它。
      4. 用于 MSBuild 的 SonarQube 扫描器 - 结束分析
  3. 完成
  4. GOTCHAS
    1. 如果作业失败是因为 Unity 找不到 projectPath 而失败,它可能忘记了它的许可证密钥。远程桌面到您的 SonarQube 服务器并启动 Unity GUI。如果它弹出询问您的许可证密钥,请重新输入密钥,然后退出。后续作业应该会成功。
    2. 使以动态方式将信息传递给 SonarQube 非常困难 的事情。
      1. Windows 2.5.1“执行 Windows 批处理命令”中定义的环境变量不会保留到 2.5.2“SonarQube Scanner for MSBuild - Begin Analysis”。
      2. SonarQube.Analysis.xml 文件明确禁止分配属性 sonar.projectNamesonar.projectKeysonar.projectVersion
  5. 我可能忽略了什么;欢迎垂询。