TAP 文章系列-12 | 小步快跑的代码扫描,实现质量左移
测试是软件质量的基础,测试左移为应用准时上线的关键在以往的日子,一个应用软件项目开发工作,相关人员无不将注意力放在范畴、预算与项目周期三个面向。而「墨菲定律」却如影随形,不断发威;我们总是无法避免的如「人月神话」书中所描述的一样陷入困境。
通常,需求访谈消耗掉大量时间,大大的压缩了开发所需要的时间,即使系统设计被清楚的讨论与制订,开发者依旧被项目周期压得喘不过气来,所以测试是最常被省略的部分;一直到应用要上生产环境时,才发现应用程序没有完全实现原先设计目标,没办法满足客户要求,甚至源代码的编写或是使用的框架,都具有安全的风险,最后导致整个项目延期。
即便最终,系统在跌跌撞撞的开发过程后上线,紧接的一连串Bug修正、功能增加与修改,都是是项目规划初期应该想到,却又没想到的部分。
一个系统经过多年的使用与维护,历经多代轮替的开发者,早已偏离原来的设计;再加上没有良好的架构设计,也没有从项目开始时就纳入的测试,后续的开发者没有充足的信心与多余的时间进行重构,以至于整个系统的维护工作日趋沉重,也让迭代速度不断下降,整个系统也越加混乱,与热力学的熵增定律:「每个系统会从有序走向无序,日趋混乱,且不可逆」,不谋而合。
相信许多具有应用开发与运维实务经验的读者,每次在系统上线时总是有种惶惶不安、惊涛骇浪的刺激感。
Working Effectively with Legacy Code 的作者Michael C. Feathers在书中定义了遗留系统即为没有测试覆盖(保护)的系统,也是有待改善的系统,可见测试的重要性,却是传统应用开发所欠缺的部分。
前述的传统瀑布式项目管理方式,确实弊病丛生,因此敏捷开发思维横空出世,提倡测试先行、增量开发与及早部署;这个概念改变了这个世界开发软件的方式。
VMware Tanzu Labs(原Pivotal Labs)的技术专家 Mark Parker,曾经于2016年的SpringOne活动上,以 “TDD: The Bad Parts”为题目的演讲中提出,如何让应用程序可以高效开发、持续且即时部署的关键,即为测试。
但是,现在多半开发在个阶段测试工作所花费的时间与精力,通常如下图左边的倒三角形,单元测试花费很少时间,系统整合测试与验收测试则需要更多的工作量才可完成;其中原因不难理解,一旦系统进入SIT或是UAT的测试阶段,其需要与其他系统对接,所以在问题查找需要更多时间,且功能修正过程中则需要请其他周边系统与团队配合,才能够重新部署测试。
综合上述问题,反之,若将更多时间与精力放在单元测试工作上,将会省去大量的SIT与UAT工作量。
而如果期待系统可以快速反应需求变化,也希望有正确高品质的源代码,不断地重构以便取得整洁的源代码,也透过测试驱动开发,让开发者与业务相关人员对于推出的应用与提供的服务更加有信心,都是必要的步骤与正向循环。
敏捷开发的工程实践管理方式,推动测试左移,质量左移
我们简单将应用程序开发到上线,简单划分成迭代开发与上线部署两个阶段。
在第一个开发阶段,是属于开发者所需关注的部分,除了完成客户要求的系统规格、功能,若期许达到开发者可以达到敏捷团队的要求,则乐于分享的开放式心态、团队紧密的合作方式、开发者讲求纪律的自我要求,皆是VMware Tanzu Labs提供给客户的参考意见。
Kent Beck与Uncle Bob推广测试驱动开发(Test Driven Development, 简称 TDD),这是一种从 test code的角度来是看待production code的软体开发方式,根据需求所规划的测试案例,遵循简单原则,先不考虑进一步的架构问题,以满足测试条件为要点,反覆的以红灯、绿灯、重构为循环,从test code与 production code中往返;
因为有 test code的保护,可落实Martin Fowler在他的著作—“Refactoring”书中所提:「一个系统的重构工作是从第一源代码被写出来开始,到系统停用为止」,大大避免了前述「熵增定律」的发生,更容易的开发出易于测试、维护的 production code。
有别过去写在文件上僵化且没有持续维护的规格,此过程中的测试案例,进而成为可执行的制品,避免开发过程中改A坏B的问题,确保系统的正确性。如此一来,敏捷开发与云原生概念中的持续集成、持续交付,才能够快速且有信心的执行。
敏捷开发方法论中,不论是eXtreme Programing的迭代(Iteration)或是Scrum的冲刺(Sprint),皆要求以小步快跑的增量方式,并尽速反覆的推送到生产环境,完成客户所需功能,取得业务价值。
这个要求,也就是应用程序开发与上线的第二阶段:一开始是所谓的持续集成,所涵盖的范围,有源代码的集成、测试与扫描,在云原生的技术中,还要历经镜像生成,紧接着再进行镜像扫描、签章,最后存储至镜像仓库后,静待最后的部署。
这些过程,须由安全、运维与平台团队根据组织要求,共同制定与搭建流水线,提供给开发者使用;为求高效且减少人为介入的错误,须以自动化方式进行,但也可根据管理与安全上的要求设定质量门禁,让负责质量的人有机会可做最后的确认,之后再部署到UAT或是生产环境中。
前述这些工作皆可在云原生基金会所带领的生态系中,找到适合企业用户想要的工具;但是稳定又可靠的开源工具,有一定选择的困难度。
加上需要安全、运维与平台团队自行评估、搭建与测试,再到后期的管理,让这项工作显得更加沉重。
Tanzu Application Platform与Supply Chain Security Tool
Tanzu Application Platform(简称 TAP)是根据VMware多年来协助企业客户,进行数字化转型工作后,所累积的经验与汇整企业客户、开发者使用体验,归纳并设计出一系列的技术栈。
呼应了前面提到的开发迭代与上线部署两个阶段(在此称为 Inner Loop 与 Outer Loop),其目的在提升开发团队与运维团队的生产力、容器平台的可观察性,以及应用与容器部署至Kubernetes后的安全性。
不管是 Inner Loop 还是 Outer Loop,TAP皆以Choreographer Supply Chain技术为基础框架,根据两个阶段的不同要求与架构设计,可选择单集群或是单一责任的多集群,如Iterate、Build、Stage与Production等。
并搭配Tanzu Build Service、Anchore Syft&Grype等技术,其中提供的Supply Chain Security Tool将可大幅简化,Outer Loop流程中相关团队的建置与管理工作负担。
Outer Loop中包含Scan、Store与Sign等安全相关技术;Scan包括了源代码扫描与容器镜像扫描,Store则可以在Scan之后,将应用程序中所使用的相关套件进行记录,做为软件元数据库(software metadata),Sign则可为容器进行安全签名。
从几个关键的步骤来逐一理解:
1.源代码扫描Source Scan与镜像扫描 Image Scan:
TAP 采用Anchore Syft&Grype针对源代码与打包完成容器镜像进行扫描,除了在Inner Loop的第一阶段进行测试,在Outer Loop的第二阶段依然可以再次进行测试,彻底实现敏捷测试要求的测试左移或是测试前移要求。 TAP所采用的Anchore Grype可支持CycloneDX格式的软件物料清单SBOM,为未来的扩充留下宽广的一条路。以下图示,简单呈现其架构与运作方式。
在扫描过程中,将会自动化的清查与盘点,该应用程序所使用相关框架、程序库等,并将其结果纪录于TAP的数据库之中,做为后续运维的备查资料,在发生安全遗漏时,将有迹可循,提供快速解决问题的线索。
2.软体元资料纪录(metadata store):
根据统计,每个系统使用将近130个左右的相依套件,其中百分之九十为开源软件,因此这些开源软件状况的掌握,与未来在发生安全疑虑的时候可以快速反应与处置,对于企业客户极为重要。
TAP自带PostgreSQL实现Metadata Store功能,负责纪录Scan后的结果,将应用程序所使用的相关套件进行记录。当前,TAP可以使用insight cli 与 API 对 metadata store 内容进行查询,提供使用者完整的参考信息。
查询程序码metadata
查询容器镜像metadata
3.镜像建置 Build:
TAP 采用Tanzu Build Service(简称 TBS)或是Kpack,提供安全的基础容器镜像、Spring Runtime、OpenJDK与多种程序语言支持;
使用TBS除了省去撰写与管理Dockerfile的麻烦,经过TBS所建置的容器更是优化后的结果,避免因为不同技术人员所撰写的Dockerfile,存在着技术水平落差;并让基础镜像、runtime有统一的版本,达成容器管理工作;
此外TBS还可以对镜像进行签名,配合平台的安全策略,即可过滤掉未被安全签名认可的容器,满足安全控管的需求。
总结与展望
现今企业所需要面对的竞争对手,已经不仅仅来自同一行业,而是任何一个携带强大企图心与创新能力的跨界公司。
因此,除了要在原本的领域中创新,更急需让自身的IT技术可以快速反应需求,提供创新的服务去吸引客户。因此,IT技术已经成为企业竞争的核心能力。
另外,在互联网技术发达的环境下,企业赖以为生的系统,在一个不经意的情况下,极有可能遭受不明的攻击;轻微的,企业名声与信用受损,严重的,造成无法计算的财产损失。
从基础设施建设、软件开发技术、部署流程,乃至于信息安全的提升,都应该是企业关注,且投入大量资源的目标。
因此,应用程序从开发、测试到部署、运维的整个生命周期,皆需重新思考并层层把关,让应用程序可以快速迭代部署,更要防堵漏洞、提升信息安全。
这样的需求之下,一个容易搭建、使用与管理的工具链是现代化企业所需的法宝。
而VMware 的Tanzu Application Platform 就是集应用程序开发生命周期中所需之大成,内含Supply Chain Security Tools,可让开发团队与运维团队各司其职,亦可紧密合作,朝向开发运维合一的高效团队迈进。
快速发展中的Supply Chain Security Tools,除了为安全工具链奠定一个具有规范的框架,其可任意抽拔的设计架构,更为未来的扩展工作留下伏笔。采用的企业除了可以享受开箱即用的安全应用部署的技术栈,在不久的将来更可以根据自身需求,更换适合的相关工具与套件。
作者:王钧平
王钧平是VMware大中华区应用现代化部门的高级解决方案架构师,具有20余年的应用程序开发经验,曾经协助电信、金融、制造等产业客户,进行应用现代化与数字化转型等工作。近年来更专注于领域驱动设计、测试驱动开发、设计模式等软体工程技术,并支持企业客户采用微服务架构与引进容器技术等,对于云原生相关技术具有丰富经验。
来源|公众号:VMwareTanzu云原生
https://my.oschina.net/u/4238514/blog/5569685
页:
[1]