了解管道的代码质量测试的工作原理,以及它如何提高部署质量。
在管道执行期间,会捕获许多量度并将其与业务所有者定义的关键绩效指标(KPI)或Adobe Managed Services设置的标准进行比较。
这些报告使用下一节中定义的三层评级系统进行报告
要了解Cloud Manager支持的AEMas a Cloud Service测试,请参阅 AEMas a Cloud Service文档.
管道中有三扇门:
对于每个门,都有一个由门标识的问题的三层结构。
在仅代码质量管道中,无法覆盖“代码质量”门中的重要故障,因为代码质量测试步骤是管道中的最后一步。
此步骤会评估应用程序代码的质量,该代码是仅代码质量管道的主要目的,将立即在所有非生产和生产管道中执行构建步骤。 请参阅该文档 配置非生产管道 以了解更多。
代码质量测试会扫描源代码,以确保它符合特定质量标准。 这是通过SonarQube分析、使用OakPAL的内容包级别检查以及使用调度程序优化工具进行调度程序验证的组合来实现的。
有100多个规则可组合通用Java规则和特定于AEM的规则。 某些特定于AEM的规则是根据AEM Engineering中的最佳实践创建的,称为 自定义代码质量规则。
您可以下载规则的完整列表 使用此链接。
代码质量测试的结果将以 评级. 下表汇总了各种测试标准的评级。
名称 | 定义 | 类别 | 失败阈值 |
---|---|---|---|
安全评级 | A =无漏洞 B =至少1个次要漏洞 C =至少1个主要漏洞 D =至少1个关键漏洞 E =至少1个阻止程序漏洞 |
关键 | < B |
可靠性评级 | A =无错误 B =至少1个次要错误 C =至少1个主要错误 D =至少1个严重错误 E =至少1个阻止程序错误 |
重要信息 | < C |
可维护性评级 | 由代码气味的未解决修复成本定义,以已进入应用程序的时间的百分比表示
|
重要信息 | < A |
范围 | 由单位测试线覆盖率和条件覆盖率的混合使用公式定义: Coverage = (CT + CF + LC) / (2 * B + EL)
|
重要信息 | < 50% |
跳过的单元测试 | 跳过的单元测试数 | 信息 | > 1 |
未决问题 | 总体问题类型 — 漏洞、错误和代码气味 | 信息 | > 0 |
复制的行 | 定义为重复块中涉及的行数。 在以下条件下,代码块会被视为重复的代码块。 非Java项目:
|
信息 | > 1% |
Cloud Service兼容性 | 已识别的Cloud Service兼容性问题的数量 | 信息 | > 0 |
请参阅 SonarQube的度量定义 以了解更多详细信息。
了解有关执行的自定义代码质量规则的更多信息 Cloud Manager,请参阅此文档 自定义代码质量规则。
质量扫描过程并不完美,有时会错误地识别实际上没有问题的问题。 这称为 误报.
在这些情况下,可以使用标准Java对源代码进行注释 @SuppressWarnings
将规则ID指定为注释属性的注释。 例如,一个常见的误报是,用于检测硬编码密码的SonarQube规则在识别硬编码密码的方式上可能过于激进。
以下代码在AEM项目中相当常见,该项目中有用于连接到某些外部服务的代码。
@Property(label = "Service Password")
private static final String PROP_SERVICE_PASSWORD = "password";
SonarQube随后会引发拦截器漏洞。 但是,在查看代码后,您会发现这不是一个漏洞,并且可以使用相应的规则ID对代码进行注释。
@SuppressWarnings("squid:S2068")
@Property(label = "Service Password")
private static final String PROP_SERVICE_PASSWORD = "password";
但是,如果代码为:
@Property(label = "Service Password", value = "mysecretpassword")
private static final String PROP_SERVICE_PASSWORD = "password";
那么,正确的解决方案就是删除硬编码密码。
虽然最好的做法是 @SuppressWarnings
尽可能具体的注释(即仅对导致问题的特定语句或块添加注释)可以在类级别添加注释。
Cloud Manager 运行现有 AEM安全性健康检查 部署后在暂存环境中运行,并通过UI报告状态。 结果将从环境中的所有AEM实例进行聚合。
这些运行状况检查可随时通过Web控制台或操作功能板执行。
如果有任何实例报告给定运行状况检查失败,则整个环境将失败该运行状况检查。 与代码质量和性能测试一样,这些运行状况检查按类别组织,并使用三层门控系统报告。 唯一的区别在于在安全测试中没有阈值。 所有运行状况检查均通过或失败。
下表列出了运行状况检查。
名称 | 运行状况检查实施 | 类别 |
---|---|---|
反序列化防火墙连接API就绪处于可接受的状态。 | 反序列化防火墙连接 API 已准备就绪 | 关键 |
反序列化防火墙功能正常。 | 反序列化防火墙运行正常 | 关键 |
已加载反序列化防火墙。 | 反序列化防火墙已加载 | 关键 |
AuthorizableNodeName 实施不会在节点名称/路径中显示可授权的ID。 |
可授权的节点名称生成 | 关键 |
默认密码已更改。 | 默认登录帐户 | 关键 |
Sling默认GETServlet受DOS攻击保护。 | Sling Get Servlet | 关键 |
已正确配置Sling Java脚本处理程序。 | Sling Java 脚本处理程序 | 关键 |
已正确配置Sling JSP脚本处理程序。 | Sling JSP脚本处理程序 | 关键 |
SSL配置正确。 | SSL 配置 | 关键 |
未找到明显不安全的用户配置文件策略。 | 用户配置文件默认访问 | 关键 |
配置Sling反向链接过滤器以防止CSRF攻击。 | Sling 引用过滤器 | 重要信息 |
已正确配置AdobeGraniteHTML库管理器。 | CQ HTML 库管理器配置 | 重要信息 |
已禁用CRXDE支持包。 | CRXDE 支持 | 重要信息 |
Sling DavEx包和Servlet被禁用。 | DavEx 运行状况检查 | 重要信息 |
未安装示例内容。 | 示例内容包 | 重要信息 |
WCM请求过滤器和WCM调试过滤器都处于禁用状态。 | WCM 筛选器配置 | 重要信息 |
已正确配置Sling WebDAV包和Servlet。 | WebDAV 运行状况检查 | 重要信息 |
Web服务器配置为防止点击劫持。 | Web 服务器配置 | 重要信息 |
复制未使用 admin 用户。 |
复制和转移用户 | 信息 |
Cloud Manager可执行AEM Sites程序的性能测试。 性能测试会运行大约30分钟,方法是旋转虚拟用户(容器)以模拟实际用户在暂存环境中访问页面以模拟流量。 这些页面可使用Crawler找到。
Cloud Manager旋转的虚拟用户或容器数量由用户定义的KPI(响应时间和页面查看次数/分钟)(使用 业务所有者 角色 创建或编辑程序。 根据定义的KPI,最多将拆分10个可模拟实际用户的容器。 选择进行测试的页面会被拆分并分配给每个虚拟用户。
在30分钟测试期开始之前,Cloud Manager将使用客户成功工程师配置的一组或多个种子URL来爬网暂存环境。 从这些URL开始,将检查每个页面的HTML,并以宽度优先的方式遍历链接。 此爬网过程最多限制为5000页。 来自Crawler的请求的固定超时为10秒。
页面由三个页面集选择。 Cloud Manager使用来自生产和暂存环境中AEM实例的访问日志来确定以下存储段。
热门实时页面 — 选中此选项可确保测试实时客户访问的最受欢迎页面。 Cloud Manager将读取访问日志,并确定实时客户最常访问的前25个页面,以生成顶部列表 Popular Live Pages
. 然后,会在暂存环境中爬网暂存环境中也存在的这些元素的交集。
其他实时页面 — 选择此选项可确保测试不属于前25个受欢迎的实时页面(可能不受欢迎,但对测试很重要)的页面。 与常用的实时页面类似,这些页面是从访问日志中提取的,并且还必须存在于暂存环境中。
新页面 — 选择此选项可测试可能只部署到暂存环境但尚未部署到生产环境但必须进行测试的新页面。
您可以在 测试 选项卡 管道配置。 流量分配基于所选集数。 即,如果选择所有这三个页面,则每个页面集将占总页面查看次数的33%。 如果选择两个,则50%将转至每个集。 如果选择一个,则100%的流量会转到该集。
让我们考虑这个示例。
在30分钟的测试期间:
((200 * 0.5) / 25) * 30 = 120
((200 * 0.5) / 3000) * 30 = 1
Cloud Manager默认情况下会在暂存发布服务器上以未经身份验证的用户身份请求页面,为期30分钟,以执行AEM Sites程序的性能测试。 它测量用户生成的虚拟量度(响应时间、错误率、每分钟查看次数等) 每个页面以及所有实例的各种系统级别量度(CPU、内存、网络数据)。
下表总结了使用三层门控系统的性能测试矩阵。
量度 | 类别 | 失败阈值 |
---|---|---|
页面请求错误率 | 关键 | >= 2% |
CPU利用率 | 关键 | >= 80% |
磁盘IO等待时间 | 关键 | >= 50% |
第95个百分位数响应时间 | 重要信息 | >=项目级别KPI |
峰值响应时间 | 重要信息 | >= 18秒 |
每分钟页面查看次数 | 重要信息 | <项目级别KPI |
磁盘带宽利用率 | 重要信息 | >= 90% |
网络带宽利用 | 重要信息 | >= 90% |
每分钟请求数 | 信息 | >= 6000 |
请参阅章节 已验证的性能测试 有关使用基本身份验证对站点和资产进行性能测试的更多详细信息。
在测试期间,会监控创作实例和发布实例。 如果未获取某个实例的任何量度,则该量度将报告为未知量度,并且相应步骤将失败。
如有必要,具有经过身份验证的站点的AMS客户可以指定一个用户名和密码,Cloud Manager将在站点性能测试期间使用该用户名和密码访问该网站。
用户名和密码被指定为具有名称的管道变量 CM_PERF_TEST_BASIC_USERNAME
和 CM_PERF_TEST_BASIC_PASSWORD
.
用户名应存储在 string
变量和密码应存储在 secretString
变量。 如果指定了这两个凭据,则性能测试Crawler和测试虚拟用户的每个请求都将包含这些凭据作为HTTP Basic身份验证。
要使用Cloud Manager CLI设置这些变量,请运行:
$ aio cloudmanager:set-pipeline-variables <pipeline id> --variable CM_PERF_TEST_BASIC_USERNAME <username> --secret CM_PERF_TEST_BASIC_PASSWORD <password>
请参阅该文档 修补用户管道变量 了解如何使用API。
Cloud Manager通过在30分钟的测试期间内反复上传资产,执行AEM Assets程序的性能测试。
对于资产性能测试,您的客户成功工程师将创建 cloudmanager
将作者载入暂存环境期间的用户和密码。 性能测试步骤需要一个名为 cloudmanager
以及由CSE设置的关联密码。 不应从创作实例中删除该内容,也不应更改其权限。 这样做可能会失败Assets性能测试。
客户可以上传自己的资产以进行测试。 此操作可从 管道设置 或 编辑 屏幕。 支持常用图像格式(如JPEG、PNG、GIF和BMP)以及Photoshop、Illustrator和Postscript文件。
如果未上传图像,Cloud Manager将使用默认的图像和PDF文档进行测试。
每分钟上传的每种类型资产的分布情况在 管道设置 或 编辑 屏幕。
例如,如果使用70/30拆分,并且每分钟上传10个资产,则每分钟将上传7个图像和3个文档。
Cloud Manager将在创作实例上使用CSE在 入门要求 中。 然后,使用开源库将资产上传到文件夹。 由资产测试步骤运行的测试使用 打开源库。 在30分钟的测试持续时间内,会测量每个资产的处理时间以及各种系统级别的量度。 此功能可以上传图像和PDF文档。
在 性能测试对话框
量度面板可以展开以显示图形,提供下载链接,或同时提供两者。
此功能适用于以下量度。
CPU利用率
磁盘I/O等待时间
页面错误率
磁盘带宽利用率
网络带宽利用
峰值响应时间
第95个百分位数响应时间
在质量分析流程中,Cloud Manager将对Maven内部版本生成的内容包进行分析。 Cloud Manager提供了优化功能来加快此过程,当发现某些包装约束时,这些功能非常有效。 最重要的是对输出单个内容包(通常称为“全部”包)的项目执行了优化,该包中包含由内部版本生成的许多其他内容包,这些内容包被标记为跳过。 当Cloud Manager检测到此方案时,将直接扫描各个内容包并根据依赖关系对其进行排序,而不是解压缩“所有”包。 例如,请考虑以下内部版本输出。
all/myco-all-1.0.0-SNAPSHOT.zip
(content-package)ui.apps/myco-ui.apps-1.0.0-SNAPSHOT.zip
(跳过的内容包)ui.content/myco-ui.content-1.0.0-SNAPSHOT.zip
(跳过的内容包)如果 myco-all-1.0.0-SNAPSHOT.zip
是两个跳过的内容包,则将扫描两个嵌入的包,而不是“所有”内容包。
对于生成数十个嵌入式包的项目,显示此优化后,每个管道执行最多可节省10分钟。
当“所有”内容包包含跳过的内容包和OSGi包的组合时,可能会出现特殊情况。 例如,如果 myco-all-1.0.0-SNAPSHOT.zip
包含先前提到的两个嵌入式包以及一个或多个OSGi包,然后仅使用OSGi包构建一个新的、最小的内容包。 此包始终名为 cloudmanager-synthetic-jar-package
包装的包装在 /apps/cloudmanager-synthetic-installer/install
.