# Microsoft Azure - 通过 SonarQube 和 TFS 管理技术债务
通过 [Cesar Solis Brito](https://msdn.microsoft.com/zh-cn/magazine/mt149362?author=Cesar+Solis+Brito), [Hosam Kamel](https://msdn.microsoft.com/zh-cn/magazine/mt149362?author=Hosam+Kamel) | 2015 年 11 月
技术债务是一套开发工作,使客户价值上的进度效率低下的问题。它通过使代码难以理解、 脆弱、 耗时若要更改,难以验证影响工作效率,并创建阻止进度的计划外的工作。技术债务削弱组织的强度由于较高的客户支持成本并最终,这些问题的某些组合将产生更大的问题。
技术债务是隐匿。它开始时很小,并随着时间通过匆忙更改和缺少上下文和守纪。它可以将它们具体化这竟然莫名其妙 — 即使对于被认为是"干净"的项目 — 由于项目环境中的更改。例如,生成针对美国市场的原型代码可能会建议为国际、 立即创建与可本地化性相关的债务。或者,随着技术的发展,应用程序可能无法承受。
债务有多种形式,包括通过代码分析、 重复代码、 代码复杂性、 没有足够的测试、 重叠和变数测试和"体系结构意大利面一样。"发现的问题
在管理其技术债务的开发团队所面临的核心问题包括:
* 了解和确定债务和在代码中的位置。
* 评估补救措施的成本与非补救措施的成本。技术债务清偿产生开销。此外不修复有成本的这是到变得更加复杂的计算结果,可以是更大。
* 将策略放就地侧重于阻止从越来越严重和管理向下的债务。
* 公开了开发人员能够满足不是人生畏,以便它们可以解决其作为一个自然组成部分其日常开发过程并不将其视为非常耗时且非常烦琐麻烦的方式的策略所需的债务。
* 通过时间,以确保它是正确的方向趋势分析,并满足已定义的策略中跟踪债务。
* 尽可能高效、 尽可能自动修正债务。
因此,此债务不得不进行管理不一定是消除 —,因此,必须进行度量。当管理时向下,它应该优先处理之间的其他新功能和所需的功能。应衡量产生的影响,以及,就像测量的财务影响的获取房屋贷款申请。
您需要做出的、 在开发过程中可能会增加技术债务的决定必须意识到。您应能够测量通过实际管理技术债务的改进。这是重要的产品所有者 (客户端、 用户、 经理等) 的正当理由投资。
解决方案 (例如从 SonarSource SonarQube 协作与 Visual Studio Team Foundation Server (TFS) 提供策略以简化数据收集和提供可帮助管理并减少技术债务的方式。SonarQube 是一个开放源代码平台,可了解和管理技术债务。
在本文中,我们将重点介绍一种测量和主动管理技术债务方法。调用基于生命周期的期望 (SQALE) 上评估软件质量,它是开放源代码方法,主要从事软件代码库的非功能性的质量特性 ([bit.ly/1JQ96qT](http://bit.ly/1JQ96qT))。SQALE 方法是由 Inspearit 法国 (以前称为 DNV ITGS 法国) 开发的。
如家庭水泄漏的技术债务是根据 SonarSource 博客文章 ([bit.ly/1N0Y4A9](http://bit.ly/1N0Y4A9))。当您在家里有水泄漏时,做您执行第一次,插入泄漏或拖地? 答案很简单和直观: 您插入泄漏。为什么会这样呢? 因为任何其他操作将无用;它将只需返回在地板上是相同数量的水之前的时间。
技术债务问题"修复泄漏"意味着将焦点放在"new"代码 ;也就是说,添加或更改自最后一个版本中,或最后一个提交/签入后的代码。
## 实现 SonarQube 和 TFS
图 1 显示的 TFS 和 SonarQube 企业安装程序参考体系结构 ; 那里详细介绍了有关容量、 设计、 实施和操作的本地 TFS 并在 Microsoft Azure 基础结构即服务 (IaaS) 中的"TFS 规划指南"和"TFS 在 Azure IaaS 指南,"可以从 Visual Studio ALM Rangers CodePlex 站点下载该指南 ([aka.ms/treasure5](http://aka.ms/treasure5))。这种体系结构和其实现通过考虑在数据库群集上,通过与数据层和应用程序层与服务器场中的高可用性功能定向向企业级支持。
![](https://box.kancloud.cn/2016-01-08_568f30b68ef97.png)
图 1 Team Foundation Server 参考体系结构,包括 SonarQube
通过设置基于各个团队的多个 SonarQube 服务器或按不同的技术并考虑以下可以实现可缩放的 SonarQube 服务器部署:
可以在数据库群集提供一种安全的方式来处理高可用性服务在实例中安装 SonarQube 数据库。
SonarQube 分析器 (插件) 到 SonarQube 数据库实现一种的分析数据的处理负载的可缩放的每个服务器方法。
数据库和分析工具必须位于同一网络中。SonarSource 一直致力于重构 SonarQube (版本 5.2) 以使其具有三层体系结构,这将使此约束已过时。
所有计算机数据库、 Web 服务器、 分析工具 — 必须是时间同步。
## 承载 SonarQube 和在 Azure 上的 TFS 的先决条件
若要设置 TFS 和 SonarQube 环境需要具有足够信用额度朝着大小与环境的 Azure 订阅的 Azure 上您要创建。可以使用 TFS 规划指南 》 ([bit.ly/1JzfVJK](http://bit.ly/1JzfVJK)) 项的虚拟机 (Vm) 大小决定。该指南还提供有关身份验证模型 (如独立的扩展的域和单向信任选项的建议。可帮助加快环境创建的 Azure 的一个重要功能是可用的现成 TFS 虚拟机模板,如中所示 图 2。
![](https://box.kancloud.cn/2016-01-08_568f30b69ebed.png)
图 2 可在 Microsoft Azure 上的虚拟机模板
网络配置应根据自己的需求来保护对 TFS 体系结构的内部层的外部访问选中状态。作为一种方式扩展企业基础结构并获得云弹性,应查看的 Azure 连接到本地通过 VPN 的各种方法。本指南介绍最佳实践和设置在 Azure 上的 TFS 环境有帮助的性能提示。SonarQube 要求数据库和分析工具必须位于同一网络中。
安装在规划时请按照这些建议的步骤操作:
* 确定 Azure IaaS 适用性。云计算提供了计算功能作为一种服务,为您提供对资源的访问如计算电源、 网络和存储。确定是否可接受约束以及是否没有增值。
* 规划的 TFS。使用"TFS 规划和灾难避免和恢复指南"([bit.ly/1JzfVJK](http://bit.ly/1JzfVJK)) 来确定最佳的服务器体系结构适合您的要求。
* Azure IaaS 映射。将映射到最接近的 Azure VM 配置根据成本和可伸缩性。
* Azure 平台管理。定义帐户、 订阅和管理和报告以满足您企业的审核要求的所有权。明确定义的所有权和责任。
* 网络规划。定义您的网络,这包括在本地要求、 网络地址段、 地缘分组、 名称解析、 Azure 隧道和监视。
* 存储规划。定义您使用在本地存储或 Azure 存储的存储策略。
* 验证。请联系 Microsoft 或 Azure 社区中的 Azure 的主题事项专家 ([bit.ly/1fVTgz0](http://bit.ly/1fVTgz0)) 并在提交自己之前验证这些计划。确保在计划的环境从技术上讲是和财务上可行并可进行维护。
如这篇文章的目的是设置 SonarQube 服务器用于演示和试用版的目的,此处未提及的其他步骤。如果您计划或设置生产环境中或从一个现有的迁移,应查看完整的计划指南中的其他步骤。应遵循确保成功安装指南中还有部署清单。
Azure IaaS 参考体系结构和安装过程中执行此处取决于对应的概念验证 (POC) 中"TFS 在 Azure IaaS 指南,"可以用于实现示例详细说明。该指南包含有关设置 TFS POC 环境的详细的步骤,但是围绕与您自己的 POC 环境或生产中使用的相同说明任何约束。
## SonarQube 安装要求
我们建议使用相同的 IaaS SQL Server 实例对于 SonarQube 安装,只需负责特定的 SQL Server 配置要求创建 SonarQube 数据库时。"SonarQube 安装指南为现有 Team Foundation Server 2013 单个服务器环境"([bit.ly/1itxhS9](http://bit.ly/1itxhS9)) 如何设置 Azure 区域 (请确保将归置到 SonarQube server 与 TFS 相同的区域中的虚拟机) 和 SQL Server 上具有足够的详细的信息和参考资料。SQL Server 配置和数据库创建有特定的要求使其满足 SonarQube。例如,SQL Database 应是区分大小写和重音的而不是默认值。此外需要启用 SQL 身份验证并且 SQL 用户配置为 SonarQube 工作。在 Azure 上托管时您需要更改 SQL Server 以启用对从虚拟机之外的数据库的以下某些步骤访问的网络协议。首先,使用 SQL Server 配置管理器中,启用命名管道和 TCP/IP 协议为 SQL Express 数据库中所示 图 3。
![](https://box.kancloud.cn/2016-01-08_568f30b6c010b.png)
图 3 启用命名的管道和 TCP/IP 协议为 SQL Express 数据库
仍在服务器配置管理器中,编辑 TCP/IP 属性中,和在 IP 地址选项卡中查看为采用 TCP 动态端口以及记端口 (此处 49419),如中所示 图 4。将使用它来从外部到数据库中启用该连接。
![](https://box.kancloud.cn/2016-01-08_568f30b6deca9.png)
图 4 请注意在 TCP 动态端口的端口号以便连接到数据库从外部
如中所示图 5, 、 重新启动通过在 SQL Server Express 上右键单击 SQL Server 服务项中的 SQL Server 和选择重新启动。启动 SQL Server Browser (在服务选项卡中它从已停止更改为自动,然后启动它)。
![](https://box.kancloud.cn/2016-01-08_568f30b705acc.png)
图 5 启动 SQL Server Browser
现在需要在防火墙中打开一个端口,以便该数据库是可从 TFS 计算机访问。在以管理员身份运行 cmd.exe 提示符下键入以下命令:
~~~
netsh advfirewall firewall add rule name="SQL" dir=in action=allow
protocol=TCP localport=49419 49590
~~~
SonarQube 不需要完整的 JVM 安装 — Java SE Runtime Environment (JRE) 应该足够并且有具体的建议有关如何将其设置和充分利用 x64 处理器体系结构。
安装指南 》 中的 SonarQube 服务器部分介绍的下载、 安装和配置过程时配置和启动 SonarQube,包括 Windows 防火墙设置。
在 Azure 上托管时您需要启用对 SonarQube 服务器可从外部世界的访问。若要这样做,请先关闭匿名访问。若要强制用户身份验证,以系统管理员身份登录,请转到设置 |常规设置 |安全性和组强制用户身份验证属性设为 true。
在防火墙中为 Web 服务器打开的端口。现在您需要在防火墙中打开一个端口,以便 Web 服务器可从 Internet 访问。在以管理员身份运行的 cmd.exe 提示符处,键入:
~~~
netsh advfirewall firewall add rule name="Sonar Web" dir=in action=allow
protocol=TCP localport=9000
~~~
对于 Sonar Web 和数据库在 Azure 中添加终结点。目前,可以登录到使用远程桌面 SonarQube 虚拟机并访问数据库和 Web 站点。您需要确保您可以连接到这两个资源从您的计算机通过 Internet。为此,您需要在 Azure 中创建终结点:
* 请转到 portal.azure.com 上。
* 浏览以查找虚拟机在其中设置 SonarQube。
* 在边栏选项卡显示此虚拟机,单击所有设置。
* 在设置中,单击终结点。
* 在终结点刀片中,单击添加。
* 添加名为映射到专用端口 9000 的 TCP 公用端口 9000 Sonar Web 终结点。
* 添加名为 SQL 映射到专用端口 49419 的 TCP 公共端口 1433年的终结点: 端口 1433年应由 SQL Server Management Studio 或 Visual Studio 为发现 SQLEXPRESS)。请注意此步骤中不会是有必要再释放 SonarQube 5.2 时。
SonarQube 可以对许多语言 ; 执行分析首先您需要安装即插即用接程序项目从 SonarQube 插件库中要分析的语言 ([bit.ly/1NdhnYF](http://bit.ly/1NdhnYF)) 或通过 SonarQube 更新中心 ([bit.ly/1NPKZet](http://bit.ly/1NPKZet))。然后您需要安装和配置生成代理,具体取决于项目的类型上的某些必备组件: MSBuild.SonarQube.Runner ([bit.ly/1LOYzM3](http://bit.ly/1LOYzM3))、 一个有关。NET-基于项目);(对于 Java Maven 项目); SonarQube Maven 插件运行程序和 SonarQube 运行程序,泛型赛跑者对于所有其他项目类型。
与 Team Build 集成并测试修改后的生成定义中,如中所示 图 6。SonarQube 运行程序工具也与生成代理集成,因此它可以轻松地执行编写用于处理与 TFS 的开发团队。
![](https://box.kancloud.cn/2016-01-08_568f30b720023.png)
图 6 SonarQube 执行与生成代理的分析
## 若要管理技术债务的策略
既然 SonarQube 环境设置了,我们将介绍一种策略利用敏捷的形成良性周期以提高其值改为产品所有者和企业内的技术债务度量。如 SQALE 方法所述,我们的意图是什么创建技术债务清晰地定义、 估计正确此债务、 分析技术和业务角度来看和允许建立优化的回报计划的产品/服务不同的优先次序策略后的债务。
SQALE 方法,如中所示 图 7, ,用于制定和组织与代码的质量相关的非功能性要求。它分为三个层次结构级别: 特性、 子特征和要求相关的代码的内部属性。(这些要求通常取决于软件的上下文和语言。这些要求的任何违反引入了技术债务性。)
![](https://box.kancloud.cn/2016-01-08_568f30b752332.png)
图 7 SQALE 方法
SQALE 方法规范化因源代码分析工具通过将它们转换为修正成本和非修正成本的报表。它还定义聚合这些成本,按照 SQALE 方法的树状结构或后面的源代码的项目的层次结构的规则。若要管理软件项目的技术债务,应使可见债务。请确保产品所有者和市场营销人员知道技术债务存在并且重复给他们通常情况下,"如果我们不计划时间白费技术债务,您可能无法获得所有所需的功能。"
水泄漏隐喻建议推迟了当前的技术债务而除非什么是真正重要、 最紧迫的问题是要修复 — 例如,安全问题。因此,需要一个基线、 确保您可以意识到任何新债务、 尝试不引入任何新债务 (停止泄漏),并根据您正在使用并重构代码,花时间来修复现有的债务。您是单元测试,因此这并不是很危险若要这样做 (清理根据自己的意愿)。
不需要进行预算的管理技术债务。它是行为的整个组织中的更改。
中所示 图 8, ,SonarQube 显示仪表板基于 SQALE 为了使团队具有了软件项目的质量状态的通用表示形式。
![](https://box.kancloud.cn/2016-01-08_568f30b764377.png)
在项目生存期内图 8 SQALE 基于方法的 SonarQube 仪表板
图 9 显示技术债务棱锥图小组件。读取图形垂直从底部到顶部。首先,您想要确保您是可测试 (40 min),否则,当您更改时代码,就不能保证不会将更多的问题。然后您想要可靠,这需要额外的 42 分钟 ;因此总的来说,使其具有可靠性您需要花费 1 h 22 分钟,等等。
![](https://box.kancloud.cn/2016-01-08_568f30b789225.png)
图 9 技术债务棱锥图小组件
## 如何管理技术债务?
以下是管理技术债务所需的主要步骤:
步骤 1: 设置项目的目标。应了解哪些程序产生技术债务的定义。计算索引根据由开发团队估计的平均修正工作。多个关系图和关系图用于有效地实现可视化效果的评估的源代码的优缺点。您应提出:
* 哪些软件部分最导致风险?
* 最受影响的质量标准?
* 标识非-符合性上项目或其用户的影响是什么?
它们通过一个项目定义的目标。SonarQube 允许您以了解的原因和影响和,因此,计划任务用于清偿债务深化到在代码内的特定问题。此分析应敏捷规划期间所做并,如果可能,请设置沿产品积压工作项 (Pbi) 的优先级。定义 Pbi 和计算以平衡或提高速度或其他体系结构特征。特征是从更严重,到那些将将潜在的商业价值,传递到可移植性或可重用性等的产品用户定义的。
步骤 2: 随着时间的推移,监视技术债务的量。能够检查执行的任务的结果或正在实现的最佳实践。要问的问题包括是否在最后一天/冲刺 (sprint) / 版本和那里多少边距与为此项目设置的目标的技术债务增加。
步骤 3: 分析过程和产生的影响。此外应能够通过以下做法了不同的项目或团队或转包商除外之间对技术债务进行比较。这可能会提高时采取的最佳做法并将它们应用更有效地时测量技术债务结果也更好, 的团队之间的做法。
则可以通过回答的问题如哪些当前的债务的一部分已创建在最后一天/冲刺 (sprint) / 版,当前的债务的哪一部分继承自旧代码和项目中的哪些部分具有最高的技术债务期间分析技术债务的来源。
团队应还侧重于技术债务的特定部分以优化结果。为此,提问如哪些是需要修复我的代码中的最紧迫的问题的问题、 下一步要修复的问题是什么以及哪些违反规则的"正确的代码"的不是那么严重影响修复并将生成高降低业务的影响。
最后,如果我花费 100 的数小时来减少技术债务,问我将在多少提高我的速度吗? 以及哪些改进将用户会认为对应用程序的质量?
这些问题的答案将提供一种自然的回馈机制用于查找的改进机会和填补到更好的产品。
SQALE 方法对于解决技术债务支持三种策略:
1. 遵循技术逻辑 (避免无用返工)。使用 SQALE 棱锥图。
2. 通过修复非 conformities,具有最高业务影响降低对业务的影响。
3. 通过修复非 conformities,最高的投资回报率来优化您的投资回报率。
## 总结
技术债务具有要管理 — 不一定是消除 — 并且,因此,必须确认并测量。选择可将其停止是一个良好的开端。您可以选择对其进行管理,并且有不同的方式。您可能会清除现有债务因为触摸代码以修复 bug 或添加新功能。或者可能决定操作都必须采取安全或一致性问题的修正。在这种方式可能是您的组织认为它应解决该问题。在这种情况下,工作需要设置之间的其他新功能或功能所需的衡量锁定的含义的影响的优先级。
您应该了解要做出的、 可能会增加技术债务的决定必须意识到并且应该能够测量通过实际管理来实现的改进。
SonarQube 和 TFS 的集成组件可帮助简化从 Microsoft Build Engine,或 TFS 和 Visual Studio Online 中生成的收集数据。SonarQube 可帮助您了解这一点并计划如何以更好地投入解决它的方式显示技术债务。没有正在进行的工作由 Microsoft 和 SonarSource 完成 (请参阅 [bit.ly/1OeqftX](http://bit.ly/1OeqftX)) 来提高这种进一步集成并提供一流的解决方案来管理在平台上的技术债务。
* * *
Cesar Solis Brito *已专门从事 20 多年的软件开发财务和医药字段中并在 Microsoft 的顾问。目前,他是在 Azure 平台的 Microsoft 专家级工程师。他一直积极地从事 ALM 和相关的 Microsoft 开发技术。您可以通过 [Cesar.Solis@microsoft.com](mailto:Cesar.Solis@microsoft.com) 或关注他的 Twitter: [@cesarsolis](https://twitter.com/@cesarsolis)。*
Hosam Kamel *是一名高级首席现场工程师,在 Microsoft,并与 Visual Studio ALM Ranger 超过 10 年的软件开发经验。他目前从事 Visual Studio ALM 和 Team Foundation Server。您可以通过他的博客与他联系 [blogs.msdn.com/HKamel](http://blogs.msdn.com/HKamel) 或关注他的 Twitter: [@HosamKamel](https://twitter.com/@HosamKamel)。*
- 介绍
- Essential .NET - C# 异常处理
- 崛起 - 具备批判精神
- Windows 10 - 通过搜索索引器加快文件操作速度
- 最前沿的技术 - 利用用户体验驱动设计改善体系结构
- 异步编程 - 从头开始执行异步操作
- 数据点 - Aurelia 与 DocumentDB 结合: 结合之旅
- ASP.NET - 将 ASP.NET 用作高性能文件下载器
- 测试运行 - 使用 C# 执行 t-检验
- Microsoft Azure - 通过 SonarQube 和 TFS 管理技术债务
- 孜孜不倦的程序员 - 如何成为 MEAN: Express 路由
- 别让我打开话匣子 - Alan Turing 和 Ashley Madison
- 编辑寄语 - 欢迎使用 Essential .NET