背景介绍
Grafeas 是一个通用的云组件元数据 API 引擎,并且提供了相关资源的标准。该项目由 Google、JFrog 等众多公司发起和维护,目前已经具备了基本的 API 操作能力。该项目是Data Driven DevOps 理念落地的核心,其主旨思想是为组件提供统一的元数据 API,使整个软件生命周期中的信息标准化、透明化。同时,也在设计一个二进制授权的组件,期望结合策略引擎和元数据,打造基于质量关卡的自动化软件供应链。
Grafeas 核心理念
设计目标
Grafeas 的设计目标主要有三个:
提供通用的语言来存储和查询组件元数据
提供常用元数据的描述规范
为用户和元数据提供者带来更多收益,促进他们广泛采用
设计目标中暂时未考虑二进制授权的内容,但从设计方案中可以清晰地看到,未来会首先支持 Kubernetes,目前已经在 GKE 上得到了使用。
软件生命周期
从通用标准流程来看,主要分为如下几个阶段:
开发者本地构建和单元测试
部署到开发环境,通常这里会由端到端测试(e2e 测试)
部署到 QA 环境,运行 UAT 测试、SIT 测试及手动测试
部署到灰度发布环境,进行灰度发布、监测及回滚
部署到生产环境
这几个步骤基本涵盖了软件发布的关键节点,Grafeas 给出了元数据驱动流程的最佳实践。

从上图可以看出,Grafeas 是软件组件全生命周期的元数据记录中心,包含了开发、构建、测试、部署等整个流水线各个阶段的关键信息。通常企业有统一的二进制包管理系统,这样就可以实现通过平台管控软件生产流水线。
随着整个系统的运转,关于软件组件的数据越来越多,挖掘数据中的有价值的信息就顺理成章了。从流程上可以分析出哪些环节是软件交付的瓶颈,从运营的角度可以分析出问题发生的环节,从管理的角度可以对相关团队和人员进行能力评估,从而使得企业从整体上得到不断优化。
核心价值
从流程上,我们可以看出 Grafeas 确实能够从整体上提升软件生产流水线的透明度,结合策略引擎能够很好地实现安全、自动化地交付到生产环境。不同的生命周期阶段,企业管理者关注不同的内容,Grafeas 也给出了相应的模型。

不同的角色有不同的诉求,具体来说可以总结如下:
开发者
开发者期望尽早地发现代码中隐藏的问题,越早发现并修改,则付出的代价越小。但是,事情往往并不如人所愿,一旦在生产环境出现了问题,就不得不在生产环境中监测组件的行为,现场做问题排查。生产环境往往具有很多安全限制,比如网络方面、权限方面,使得开发者在生产环境排查问题变得非常困难。开发者往往更加倾向于阅读自己的代码,试图根据报错信息分析出代码中的问题。从源代码到生产环境,中间有很多的细节是开发者所不能控制的,一旦发布了一个非当前代码编译的版本,通过阅读代码进行排查只能是缘木求鱼。
DevOps
这个角色的人员面对的问题比较错综复杂,有点类似SRE角色。DevOps 团队需要根据公司的安全、质量等各方面的要求,在合适的环节设置质量关卡,与此同时需要考虑如何尽量减小对开发人员的影响。企业的首席技术官、首席信息安全官会对整个流程进行监管,因此他们会对整个流程进行审查,如何确保不会因此而减缓软件上线的节奏。
首席技术官
首席技术官会面临多方面的挑战,比如如何避免数据泄露、如何确保各个环节的安全一致性、如何在既有流程下引入新的技术,比如容器和微服务以及如何基于开源项目做特性增强,以便于在生产环境中使用。
信息安全
如何确保满足合规性,强制实施最小权限模型。如何通过强代码识别来最小化风险。如何确保能够跟踪和审计。如何防范强有力的持续威胁。
Grafeas 是一个通用的元数据引擎,可以根据企业的不同角色的诉求设置不同的维度,在具体流程的节点通过简单的 Http 协议推送相关信息到元数据中心即可。任何角色通过统一的控制台获取与自身角色相关的元数据信息,当然这些数据可以被进一步加工,产生更加具有洞察力的信息。
应用场景
Grafeas 非常通用,跟具体的开发语言、构建环境和部署环境无关,更不局限于企业的业务。所以,应用的场景也非常广泛。

源码解读
Grafeas 源码托管在 GitHub 上,具体链接参见文章开始的“扩展阅读”部分。
首先,我们来看看代码结构:

目前整个代码结构非常简单,主要是定义一个数据结构,只有一个 Sample Server 作为示例,熟悉 Kubernetes 源码的同学,对这种代码的组织方式应该非常熟悉。
为了方便用户进行测试和试用,采用内存存储的方式,但后期首先会支持 Google 存储,存储相关的接口定义在 grafeas\server-go\storage.go。

整体代码量并不多,逻辑也比较清晰,目前filters的机制没有实现,在社区也创建了issue在跟踪进一步的设计,另外后期肯定会扩充资源的类型,社区也在积极呼吁一个完善的手册来描述具体的操作步骤。
最终当然是要试用一下,启动Grafeas非常简单,配置好Go语言环境,执行如下命令即可:
cd grafeas/samples/server/go-server/api/server/main
go build
./main

总结
Grafeas 的设计理念是数据驱动,从数据中提炼出有洞察力的信息。随着整个流水线的不断运行,数据量会快速增长,与此同时数据中也蕴藏了更多反应实际情况的信息。数据标准化是基础,数据源与业务的关联是核心,Grafeas 使得整个流程透明、可度量,为数据驱动 DevOps 理念落地打下了坚实的基础。