去年,有一些用户基于 ArchGuard 定制了自己的版本,但是遇到了一系列的问题;简单来说,就是可定制性差。与此同时,构建企业级的架构治理流程时,还需要考虑适用于不同团队的可扩展性、任务可追溯性等问题。
为了解决这些问题,我们开始着手设计 ArchGuard Pipeline 来构建轻量级的架构治理流程。现在,这个功能处于一个可工作的 MVP 状态,如果你对这个功能有兴趣,欢迎来加入开发:https://github.com/archguard/codedb-poc
在 ArchGuard 2023 的 Roadmap 里,我们的核心是:自定义的架构适应度函数,而其原因包含了:
除此,有的团队还想要精细化的控制架构演进,如通过自定义的架构适应度函数,可以更加细致地控制系统的架构,从而实现更好的管理和治理效果。
而在当前的版本中,想要定制的话存在一些问题,包括:
上述问题,我们预期是通过 ArchGuard Pipeline 得到解决。
ArchGuard Pipeline 是一个轻量级的架构治理流程工具,可以定制化、可扩展,让用户轻松创建和管理自定义的架构适应度函数。并计划(预计是在 CodeDB 中提供)提供了丰富的可视化工具,实现更好的可视性和透明度。
ArchGuard Pipeline 可以帮助团队更加细致地控制系统的架构演进。通过自定义的架构适应度函数,团队可以根据自己的具体需求和关注点,灵活地定义系统的架构特性和度量指标。这样,团队可以更加精细地管理和治理系统的架构,从而提高系统的稳定性、可维护性和可扩展性。
我们思考的使用场景包括但不限于:
我们也在思考提供可视化工具,以帮助用户更好地跟踪和调试整个流程,提高可视性和透明度。
起初,因为已经有一个 ArchGuard Gradle 插件。所以,打算参考 Gradle 设计整体的工作流程,遇到了一些问题,如中心化框架等等。
在之前的 Meetup 里,我们已经介绍了 ArchGuard 的数据处理是一种 Pipeline 风格的架构。那么作为一个构建系统,它也 Jenkinsfile、GitHub Action 也是相似的,具备如下的特征:
上述的特性,对于 ArchGuard Pipeline 也是类似的。考虑到 DSL 的学习和设计成本,便想着参考 GitHub Action,又因为开发人数有限,我们就直接~~复制~~参考了 GitHub Action。
如下是 ~~GitHub Action~~ ArchGuard Pipeline 的配置:
jobs:
backend:
steps:
- name: "Source Code with Linter"
uses: archguard/scanner@v2
with:
type: "source_code"
language: kotlin
features: [ "datamap" ]
output: [ "json", "arrow" ]
rules: [ "webapi", "test", "sql" ]
path: "."
随后,通过 ArchGuard Runner 就可以运行我们的分析任务,并将数据上传到服务端。而如果是服务端来运行的话,还需要 Checkout 一下代码:
- uses: actions/checkout@0.1.0-SNAPSHOT
with:
repository: https://github.com/archguard/code-poc.git
branch: master
这就是全新的 ~~GitHub Action~~ ArchGuard Pipeline,新时代的架构治理编排工具。这里的每个 Action 便是一系列可执行的命令、jar 等,相当于是一系列的插件,可以直接在客户端、服务端运行。
未来会根据分析、治理等不同维度划分 action,示例如下:
- uses: analyser/architecture@0.0.1
with:
- uses: linter/database@v1
- used: metric/oo@v1
- used: metric/complexity@v1
- used: factor/sonarqube@v1
不过,在那之前,需要进一步进行设计和完善。
ArchGuard Pipeline 主要由三部分组件:
与此同时,为了减少 action 之间序列化带来的性能问题,我们正在试验引入 Apache Arrow,并采用 Kotlin dataframe 来支持直接基于 Apache Arrow 的数据科学计算。
设计之后的 ArchGuard Runner 主要过程如下:
即:
archguard.yml
文件来定义工作流程。archguard.yml
文件中的定义,自动下载并加载不同的 Action,如 checkout
、scanner
等,来执行不同的任务。这样一来,我们的主要工作就变成了创建各类的 Action,以方便团队进行架构观测。
我们参考了 NPM Registry、Maven Central 等制品仓库的思想,构建了基本的 Runner registry API。它包含了以下的功能:
于是乎,我们需要在 archguard.yml
中引入新的配置:
env:
registry:
url: https://registry.archguard.org/
现在的 Registry 是一个放在 GitHub Pages 的 JSON 文件,相当于是一个 fake server。
在 GitHub Action 里,Runner 是一系列的 JobService:
考虑到我们当前并没有执行环境、进程等,只需要好好写 ActionRunner 即可,即解析上面 Yaml 中的 steps 里的 Action 字段。根据不同的 action 来执行,并将上面的 with
字段转换成对应的参数,因此上面的配置在执行时会变成:
java -jar plugins/scanner-v2.jar --output json --output arrow --features datamap --path . --language kotlin --rules webapi --rules test --rules sql --type source_code
然后,将构建的 jar 上传到 registry,并编写一个 Json,就实现了完成的 Runner 原型。
本文介绍了 ArchGuard Pipeline,一个轻量级的架构治理流程工具,可以定制化、可扩展,让用户轻松创建和管理自定义的架构适应度函数。该工具可以帮助团队更加细致地控制系统的架构演进,提高系统的稳定性、可维护性和可扩展性。
如果你也有兴趣,欢迎来加入我们:https://github.com/archguard/codedb-poc
围观我的Github Idea墙, 也许,你会遇到心仪的项目