Jenkins 集成

先决条件和说明

  • 本指南假定您熟悉 Jenkins 和自由风格项目的配置,
  • 要在 Jenkins 中发布报告以供查看,您需要安装 HTML Publisher 插件
  • 已使用 CppDepend GUI 创建 CppDepend 项目文件以供后续分析
  • 已有一个现有的自由风格(freestyle)项目,它已成功签出并编译 CppDepend 项目将要处理的程序集
  • CppDepend 必须安装在任何用作 Jenkins 构建代理的计算机上。我已测试了版本 6 和 7,没有问题
  • 默认的 Jenkins 内容安全策略会阻止嵌入的 CppDepend 报告被正确查看。本指南包含重新配置该策略的说明

回到顶部

调用CppDepend

目前,CppDepend 没有专用的 Jenkins 插件,因此我们在集成深度上略有受限。

第一步是调用 CppDepend。我们可以通过添加 执行Windows批处理命令 步骤添加到我们的项目,然后设置 命令 要调用的字段 CppDepend.Console.exe 传入我们项目的文件名。

CppDepend.Console.exe "%WORKSPACE%\myproject\source\Applications\WebCopy\WebCopy.cdproj"

CppDepend.Console.exe 要求项目文件名完全限定。您可以使用 %WORKSPACE% 环境变量获取代理工作区的完全限定路径,并将项目文件名附加到其后

我将 CppDepend 和构建使用的其他类似工具签入 SVN,以便它们自动签出到构建代理的工作区中,因此在我的情况下,我可以使用指向……的相对路径 CppDepend.Console.exe 或者,如果 CppDepend 二进制文件的位置已在操作系统路径中,您可以完全省略该路径。

CppDepend Jenkins

在 CppDepend 项目中使用绝对或相对路径

默认情况下,CppDepend 项目中的所有路径和文件名都是绝对路径。Jenkins 构建在临时工作区中进行,其位置对于每个代理可能不同。在这种情况下,使用绝对路径可能导致完全失败,或产生过时/意外的结果。

我们有两种方法可以解决这个问题——第一种是使用命令行开关覆盖项目中的路径,第二种是将它们设为相对路径。

覆盖绝对路径

InDirsOutDir 参数可用于指定覆盖路径。 InDirs 控制所有待分析源文件的位置,并 OutDir 指定报告将写入的位置。请注意 InDirs 允许您在需要时指定多个路径。

CppDepend.Console.exe "%WORKSPACE%\myproject\source\Applications\WebCopy\WebCopy.cdproj" /InDirs "%WORKSPACE%\myproject\source\Applications\WebCopy" /OutDir "%WORKSPACE%\myproject\source\Applications\WebCopy\CppDependOut"

配置CppDepend使用相对路径

这些说明适用于独立工具,但也应该适用于 Visual Studio 扩展。

  • 打开 CppDepend 项目属性 编辑器
  • 选择 引用的路径 标签页
  • 在路径列表中,选择要设为相对路径的每个路径
  • 右键单击并选择 设为相对路径(相对于 CppDepend 项目文件位置)
  • 保存更改

回到顶部

使构建失败

如果 执行Windows批处理 命令返回非零值,默认情况下 Jenkins 会使构建失败。当 CppDepend 成功运行且没有 质量门失败 它将返回预期的零。但是,即使它在其他方面成功运行,在质量门禁失败的情况下也会返回非零值。

根据您的需求,您可能想要禁用此行为。例如,如果您在现有代码库上使用 CppDepend,那么您可能需要调查真正的违规,或者误报。

我们可以通过将构建标记为不稳定或抑制错误来处理此问题。

将构建标记为不稳定

执行Windows批处理命令 有一个附加参数 (隐藏在后面 高级 按钮)名为 用ERRORLEVEL标记构建不稳定。通过将此字段的值设置为 1 (当遇到严重违规时 CppDepend 将返回的退出代码),则构建结果将为不稳定(Unstable),但它将继续执行。

抑制错误

作为步骤名称, 执行Windows批处理命令所示,这不是单个命令的执行。Jenkins 会根据 Command 字段的内容创建一个批处理文件,然后执行它。因此,为了抑制错误,我们只需自己退出批处理文件,从而可以提供我们自己的退出代码。

为此,只需添加 exit /b 0 作为新的一行 命令 字段,任何现有错误代码都将被忽略。

如果您这样做了,而 CppDepend 因任何其他原因未能运行,除非您检查日志文件,否则您不会知道。我可能只会将构建标记为不稳定,但您也可以修改命令以手动检查 ERRORLEVEL 值并据此采取行动。

发布HTML

CppDepend 分析完成后,将生成 HTML 报告。虽然此报告不提供像在 CppDepend GUI 中查看结果那样的功能水平,但它提供了大量有用的数据。

要将其嵌入Jenkins,我们需要添加 发布HTML报告 构建后步骤。

  • 设置 要归档的HTML目录 字段指向 CppDepend 报告保存的位置——默认情况下这是一个名为的文件夹 CppDependOut 位于与 CppDepend 项目相同的文件夹中。
  • 设置 索引页 字段设置为报告名称,它始终是 CppDependReport.html
  • 最后,设置 报告标题 字段设置为您想要的任何内容——这将用于标记 Jenkins 中的导航链接
CppDepend Jenkins 2b

查看报告

正如我在本文开头提到的,Jenkins 有一个限制嵌入资源的安全策略。此策略会削弱 CppDepend 报告,因此您需要稍微放宽限制,如 按我之前的帖子.

一旦您的 Jenkins 作业运行并成功完成,作业侧边栏中应会出现用于查看报告的新导航选项,状态概览中也会提供对 CppDepend 报告的访问。

CppDepend Jenkins 2

使用外部资源文件以避免重复

CppDepend 的另一个默认行为是将所有规则保存在项目文件中。这些内置规则会显著增大 CppDepend 项目的体积,如果您不修改它们,一遍又一遍地复制它们并没有真正的意义。

幸运的是,CppDepend 允许将规则存储在外部文件中,因此我使用 CppDepend GUI 创建了一个规则文件。现在每个项目都删除了所有内置规则,只引用外部文件。很方便!

如果您的项目使用绝对路径,您可以直接 /RuleFiles/KeepProjectRuleFiles 参数 CppDepend.Console.exe 用于在需要时覆盖绝对版本。

同样,CppDepend 2017 版本引入了项目债务的新设置,同时还提供了将这些设置存储在外部文件中的功能。遗憾的是,在……中似乎没有可用的覆盖开关 CppDepend.Console.exe,但由于我还没有测试技术债务功能,我不知道这是否会成为问题。 (CppDepend 团队备注:欢迎用户对此提供反馈)

立即试用 CppDepend

开始 14 天免费试用,畅享全部文档功能。无需信用卡。