通过 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 项目的程序。
一个面向用户的 Jenkins 作业,具有以下设置和选项,以及其他特定于我的环境的设置和选项。
- 一般——这个项目是参数化的
- 字符串参数
PROJECTKEY
- 字符串参数
PROJECTNAME
- 字符串参数
PROJECTVERSION
- General—Restrict where this project can be 运行 set to Jenkins build node name you used for your SonarQube server.
- 源代码管理
- Repository URL设置为你要分析的版本库。
- 要构建的分支设置为主分支,即
refs/heads/master
。
- 其他行为 - 递归更新子模块 检查是否适合您的存储库。
- 构建触发器
- 轮询 SCM 已检查,但未指定时间表。
- 构建环境
- 运行 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. 的练习
- 使用另一个项目的构建环境——模板项目指向第二个 Jenkins 作业。我的名字叫 SonarQube_Scanner(见下文)。
- 建造
- 使用来自另一个项目的构建器——模板项目 指向同一个 Jenkins 作业
SonarQube_Scanner
.
- Post-构建动作
- 归档工件—要归档的文件 设置为
log.zip
。
具有以下设置和选项的非面向用户的 Jenkins 作业 (SonarQube_Scanner)。
- 常规 - 禁用此项目 选中。
- 常规——限制这个项目可以运行检查并设置到你的SonarQube服务器的地方。
- 源代码管理 设置为 None。
构建环境——将环境变量注入构建过程 选中。
属性内容包含
`LANG=en_US.UTF-8`
建造
执行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
文件中,因此不在存储库中。
用于 MSBuild 的 SonarQube 扫描器 - 开始分析
- SonarQube 安装 设置为您用于 SonarQube 服务器的 Jenkins 构建节点名称。
- 项目密钥设置为
${PROJECTKEY}
。
- 项目名称设置为
${PROJECTNAME}
。
- 项目版本设置为
${PROJECTVERSION}
。
附加参数
/d:sonar.exclusions=**\SQMenuItems.cs
执行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 作业中定义的环境变量替换它。
- 用于 MSBuild 的 SonarQube 扫描器 - 结束分析
- 完成
- GOTCHAS
- 如果作业失败是因为 Unity 找不到 projectPath 而失败,它可能忘记了它的许可证密钥。远程桌面到您的 SonarQube 服务器并启动 Unity GUI。如果它弹出询问您的许可证密钥,请重新输入密钥,然后退出。后续作业应该会成功。
- 使以动态方式将信息传递给 SonarQube 非常困难 的事情。
- Windows 2.5.1“执行 Windows 批处理命令”中定义的环境变量不会保留到 2.5.2“SonarQube Scanner for MSBuild - Begin Analysis”。
SonarQube.Analysis.xml
文件明确禁止分配属性 sonar.projectName
、sonar.projectKey
和 sonar.projectVersion
。
- 我可能忽略了什么;欢迎垂询。
我继承了 运行 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 项目的程序。
一个面向用户的 Jenkins 作业,具有以下设置和选项,以及其他特定于我的环境的设置和选项。
- 一般——这个项目是参数化的
- 字符串参数
PROJECTKEY
- 字符串参数
PROJECTNAME
- 字符串参数
PROJECTVERSION
- 字符串参数
- General—Restrict where this project can be 运行 set to Jenkins build node name you used for your SonarQube server.
- 源代码管理
- Repository URL设置为你要分析的版本库。
- 要构建的分支设置为主分支,即
refs/heads/master
。 - 其他行为 - 递归更新子模块 检查是否适合您的存储库。
- 构建触发器
- 轮询 SCM 已检查,但未指定时间表。
- 构建环境
- 运行 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. 的练习
- 使用另一个项目的构建环境——模板项目指向第二个 Jenkins 作业。我的名字叫 SonarQube_Scanner(见下文)。
- 运行 buildstep before SCM 运行s - Inject environment variables set to
- 建造
- 使用来自另一个项目的构建器——模板项目 指向同一个 Jenkins 作业
SonarQube_Scanner
.
- 使用来自另一个项目的构建器——模板项目 指向同一个 Jenkins 作业
- Post-构建动作
- 归档工件—要归档的文件 设置为
log.zip
。
- 归档工件—要归档的文件 设置为
- 一般——这个项目是参数化的
具有以下设置和选项的非面向用户的 Jenkins 作业 (SonarQube_Scanner)。
- 常规 - 禁用此项目 选中。
- 常规——限制这个项目可以运行检查并设置到你的SonarQube服务器的地方。
- 源代码管理 设置为 None。
构建环境——将环境变量注入构建过程 选中。
属性内容包含
`LANG=en_US.UTF-8`
建造
执行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
文件中,因此不在存储库中。
- SQMenuItems.cs 是触发 Unity 创建 MSBuild 需要的
用于 MSBuild 的 SonarQube 扫描器 - 开始分析
- SonarQube 安装 设置为您用于 SonarQube 服务器的 Jenkins 构建节点名称。
- 项目密钥设置为
${PROJECTKEY}
。 - 项目名称设置为
${PROJECTNAME}
。 - 项目版本设置为
${PROJECTVERSION}
。 附加参数
/d:sonar.exclusions=**\SQMenuItems.cs
执行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 作业中定义的环境变量替换它。
- 您可能需要更改上面的
- 用于 MSBuild 的 SonarQube 扫描器 - 结束分析
- 完成
- GOTCHAS
- 如果作业失败是因为 Unity 找不到 projectPath 而失败,它可能忘记了它的许可证密钥。远程桌面到您的 SonarQube 服务器并启动 Unity GUI。如果它弹出询问您的许可证密钥,请重新输入密钥,然后退出。后续作业应该会成功。
- 使以动态方式将信息传递给 SonarQube 非常困难 的事情。
- Windows 2.5.1“执行 Windows 批处理命令”中定义的环境变量不会保留到 2.5.2“SonarQube Scanner for MSBuild - Begin Analysis”。
SonarQube.Analysis.xml
文件明确禁止分配属性sonar.projectName
、sonar.projectKey
和sonar.projectVersion
。
- 我可能忽略了什么;欢迎垂询。