-
Notifications
You must be signed in to change notification settings - Fork 194
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
docs: translation for architecture.md (#765)
Signed-off-by: Tiexin Guo <guotiexin@gmail.com>
- Loading branch information
Showing
3 changed files
with
114 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,61 @@ | ||
# 架构 | ||
|
||
todo | ||
本文介绍了DevStream的架构,总结了DevStream的主要组件,以及数据、命令是如何在各个组件之间流转的。 | ||
|
||
## 0 工作流程 | ||
|
||
下图展示了DevStream是如何执行一个用户命令的。 | ||
|
||
![DevStream架构图](../images/architecture-overview.png) | ||
|
||
DevStream主要由三大块组成: | ||
|
||
- CLI:处理用户输入的命令和参数 | ||
- `pluginengine`:插件引擎,通过调用其他组件(`configloader`、`pluginmanager`、`statemanager`等)来实现DevStream的核心功能。 | ||
- 插件:实现某个DevOps工具的CRUD接口。 | ||
|
||
## 1 CLI | ||
|
||
_注意:为了简单起见,CLI被命名为`dtm`(DevOps Toolchain Manager)。_ | ||
|
||
用户运行`dtm`时,会调用[`devstream`](https://github.com/devstream-io/devstream/tree/main/cmd/devstream)包中的一个命令。所有命令的源文件定义都在这个文件夹中。 | ||
|
||
然后,每个命令调用[`internal/pkg`](https://github.com/devstream-io/devstream/tree/main/internal/pkg/pluginengine)下的`pluginengine`包。 | ||
|
||
`pluginengine`首先调用`configloader`,将本地YAML配置文件读取到一个结构体中,然后调用`pluginmanager`来下载所需的插件。 | ||
|
||
之后,`pluginengine`调用`statemanager`来计算congfig、状态和实际DevOps工具的状态之间的"差异"。最后,`pluginengine`根据这变更执行对应的操作,并更新状态。在执行过程中,`pluginengine`加载每个插件(`*.so`文件)并根据每个变更调用相应的接口。 | ||
|
||
## 2 插件引擎 | ||
|
||
`pluginengine`有几个职责: | ||
|
||
- 确保所需的插件(根据配置文件的设置)存在 | ||
- 根据配置、状态和工具的实际状态生成变更 | ||
- 通过加载每个插件和调用所需的接口来执行这些变更 | ||
|
||
它通过调用以下模块来实现这些功能: | ||
|
||
### 2.1 配置加载器 | ||
|
||
包[`configloader`](https://github.com/devstream-io/devstream/blob/main/internal/pkg/configloader/config.go#L19)中的struct代表了顶层的配置结构。 | ||
|
||
### 2.2 插件管理器 | ||
|
||
[`pluginmanager`](https://github.com/devstream-io/devstream/blob/main/internal/pkg/pluginmanager/manager.go)负责根据配置下载必要的插件。 | ||
|
||
如果本地已经存在所需版本的插件,将不再下载。 | ||
|
||
### 2.3 状态管理器 | ||
|
||
[`statemanager`](https://github.com/devstream-io/devstream/blob/main/internal/pkg/statemanager/manager.go)负责管理"状态",即哪些事情已经成功完成,哪些没有。 | ||
|
||
`statemanager`将状态存储在一个[`backend`](https://github.com/devstream-io/devstream/blob/main/internal/pkg/backend/backend.go)中。 | ||
|
||
## 3 插件 | ||
|
||
一个 _plugin_ 实现了上述的预定义接口。 | ||
|
||
它执行的包括"创建"、"读取"、"更新"和"删除"等操作。 | ||
|
||
要开发一个新的插件,请参阅[创建一个插件](./development/creating-a-plugin.md)。 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,56 @@ | ||
# 创建一个插件 | ||
|
||
todo | ||
## 0 感谢您的贡献! | ||
|
||
首先,请阅读我们的 [CONTRIBUTING](https://github.com/devstream-io/devstream/blob/main/CONTRIBUTING.md) 文档。 | ||
|
||
## 1 自动建立新插件的代码框架 | ||
|
||
运行`dtm develop create-plugin --name=YOUR-PLUGIN-NAME` ,dtm将自动生成以下文件。 | ||
|
||
> ### /cmd/plugin/YOUR-PLUGIN-NAME/main.go | ||
这是该插件代码的唯一主要入口。 | ||
|
||
你不需要修改这个文件。如果您觉得自动生成的这个文件有问题,您可以创建一个PR来直接修改[模板](https://github.com/devstream-io/devstream/blob/main/internal/pkg/develop/plugin/template/main.go)。 | ||
|
||
> ### /docs/plugins/YOUR-PLUGIN-NAME.md | ||
这是自动生成的插件的文档。 | ||
|
||
虽然`dtm`的目的就是自动化,但它并不能魔法般的生成文档。你需要自己编写自己想要创建的这个插件的文档。 | ||
|
||
> ###/internal/pkg/plugin/YOUR-PLUGIN-NAME/ | ||
请在这里编写插件的主要逻辑。 | ||
|
||
可以查看我们的[Standard Go Project Layout](project-layout.md)文件,了解关于项目布局的详细说明。 | ||
|
||
## 2 接口 | ||
|
||
### 2.1 定义 | ||
|
||
每个插件都需要实现[pluginengine](https://github.com/devstream-io/devstream/blob/main/internal/pkg/pluginengine/plugin.go#L10)中定义的所有接口。 | ||
|
||
目前,有4个接口,可能会有变化。目前,这4个接口是。 | ||
|
||
- [`create`](https://github.com/devstream-io/devstream/blob/main/internal/pkg/pluginengine/plugin.go#L12) | ||
- [`read`](https://github.com/devstream-io/devstream/blob/main/internal/pkg/pluginengine/plugin.go#L13) | ||
- [`update`](https://github.com/devstream-io/devstream/blob/main/internal/pkg/pluginengine/plugin.go#L14) | ||
- [`delete`](https://github.com/devstream-io/devstream/blob/main/internal/pkg/pluginengine/plugin.go#L16) | ||
|
||
### 2.2 返回值 | ||
|
||
`create`、`read`和`update`方法返回两个值`(map[string]interface{}, error)`;第一个是 "状态"。 | ||
|
||
`delete'接口返回两个值`(bool, error)`。如果没有错误,它返回`(true, nil)`;否则将返回`(false, error)`。 | ||
|
||
如果没有发生错误,返回值将是`(true, nil)`。否则,结果将是`(false, error)`。 | ||
|
||
## 3 插件是如何工作的? | ||
|
||
DevStream是使用[go plugin](https://pkg.go.dev/plugin)来实现自定义插件的。。 | ||
|
||
当你执行一个调用任何接口(`Create`, `Read`, `Update`, `Delete`)的命令时,DevStream的`pluginengine`会调用[`plugin.Lookup("DevStreamPlugin")`函数](https://github.com/devstream-io/devstream/blob/38307894bbc08f691b2c5015366d9e45cc87970c/internal/pkg/pluginengine/plugin_helper.go#L28)来加载插件,获得实现`DevStreamPlugin`接口的变量`DevStreamPlugin`,然后你就可以调用相应的插件接口。所以我们不建议您直接修改`/cmd/plugin/YOUR-PLUGIN-NAME/main.go`文件,因为该文件是根据接口定义自动生成好的。 | ||
|
||
注意:`/cmd/plugin/YOUR-PLUGIN-NAME/main.go`文件中的`main()`不会被执行,它只是用来避免golangci-lint错误。 |