Skip to content

Commit

Permalink
docs: translation for architecture.md (#765)
Browse files Browse the repository at this point in the history
Signed-off-by: Tiexin Guo <guotiexin@gmail.com>
  • Loading branch information
jxs1211 authored Jun 29, 2022
1 parent 201e9e8 commit 73e74ca
Show file tree
Hide file tree
Showing 3 changed files with 114 additions and 3 deletions.
60 changes: 59 additions & 1 deletion docs/development/architecture.zh.md
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)
2 changes: 1 addition & 1 deletion docs/development/creating-a-plugin.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,4 +53,4 @@ DevStream uses [go plugin](https://pkg.go.dev/plugin) to implement custom DevOps

When you execute a command which calls any of the interfaces(`Create`, `Read`, `Update`, `Delete`), devstream's pluginengine will call the [`plugin.Lookup("DevStreamPlugin")` function](https://github.com/devstream-io/devstream/blob/38307894bbc08f691b2c5015366d9e45cc87970c/internal/pkg/pluginengine/plugin_helper.go#L28) to load the plugin, get the variable `DevStreamPlugin` that implements the ` DevStreamPlugin` interface, and then you can call the corresponding plugin logic functions. This is why it is not recommended to modify the `/cmd/plugin/YOUR-PLUGIN-NAME/main.go` file directly.

Note: The `main()` in `/cmd/plugin/YOUR-PLUGIN-NAME/main.go` file will not be executed, it is only used to avoid the goclangci-lint error.
Note: The `main()` in `/cmd/plugin/YOUR-PLUGIN-NAME/main.go` file will not be executed, it is only used to avoid the golangci-lint error.
55 changes: 54 additions & 1 deletion docs/development/creating-a-plugin.zh.md
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错误。

0 comments on commit 73e74ca

Please sign in to comment.