目录结构

主目录

.
├── LICENSE
├── README.md
├── cmd # 所有命令
├── config # 系统配置
├── controllers # 控制器
├── docs
├── ects.example.json # JSON 格式配置文件模板
├── ects.example.yaml # YAML 格式配置文件模板
├── go.mod
├── go.sum
├── internal # 内部公用模块
├── main.go # 入口文件
├── models # 数据模型
├── routes # RESTful 路由
├── services # 数据服务,后期考虑移除
├── vendor # 依赖的包
└── web # Web UI

10 directories, 7 files
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

后端框架

经过对多个框架的对比,最终决定选择 iris

命令行

命令行采用的是 Cobra,这个包提供了比较全面的命令行常用功能。可以看到包括像 Kubernetes、Docker、Etcd、Linkerd、Istio 和 Pouch 这样的项目都在使用它。

├── cmd
│   ├── initialize.go # 初始化命令
│   ├── master.go # master 节点启动命令
│   ├── root.go
│   ├── single.go # 单节点启动命令,可以不需要 ETCD
│   └── worker.go # worker 节点启动命令
1
2
3
4
5
6

路由

├── routes
│   ├── auth.go # 用户认证
│   ├── dashboard.go # 概览
│   ├── initialize.go # 初始化
│   ├── log.go # 日志
│   ├── node.go # 节点
│   ├── pipeline.go # 流水线
│   ├── profile.go # 个人信息
│   ├── register.go # 用户注册
│   ├── setting.go # 系统设置
│   ├── task.go # 任务
│   └── user.go # 用户管理
1
2
3
4
5
6
7
8
9
10
11
12

控制器

├── controllers
│   ├── account # 账户
│   │   └── profile.go
│   ├── auth # 认证
│   │   └── authentication.go
│   ├── dashboard # 概览
│   │   └── main.go
│   ├── initialize # 初始化
│   │   └── main.go
│   ├── log # 日志
│   │   └── main.go
│   ├── node # 节点
│   │   └── main.go
│   ├── organization # 组织
│   │   └── user.go # 用户
│   ├── pipeline # 流水线
│   │   └── main.go
│   ├── setting # 设置
│   │   └── main.go
│   └── task # 任务
│       └── main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

模型

── models
│   ├── log.go # 日志
│   ├── main.go # MySQL 配置信息
│   ├── node.go # 节点
│   ├── password_reset.go # 密码重置
│   ├── pipeline.go # 流水线
│   ├── pipeline_node_pivot.go # 流水线和节点关联关系模型
│   ├── pipeline_record.go # 流水线执行记录模型
│   ├── pipeline_task_pivot.go # 流水线和任务关联模型
│   ├── task.go # 任务
│   ├── task_record.go # 任务执行记录
│   └── user.go # 用户
1
2
3
4
5
6
7
8
9
10
11
12

开发环境

  • MySQL 8.0.11
  • ETCD 3.3.12
# 启动 MySQL
$ docker run -d \
    --name mysql \
    -p 3306:3306 \
    -e MYSQL_ROOT_PASSWORD=your-secret-pw mysql:8.0.11 \
    --character-set-server=utf8mb4 \
    --collation-server=utf8mb4_unicode_ci

# 启动 ETCD
$ docker run -d \
    --name etcd \
    -p 2379:2379 \
    -p 2380:2380 \
    --volume=/private/var/local/etcd/data:/data \
    gcr.io/etcd-development/etcd:v3.3.12 \
    /usr/local/bin/etcd \
    --name etcd \
    --data-dir /data \
    --listen-client-urls http://0.0.0.0:2379 \
    --advertise-client-urls http://0.0.0.0:2379 \
    --listen-peer-urls http://0.0.0.0:2380 \
    --initial-advertise-peer-urls http://0.0.0.0:2380 \
    --initial-cluster etcd=http://0.0.0.0:2380 \
    --initial-cluster-token betterde \
    --initial-cluster-state new
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

初始化

这一步主要是将配置信息写入到 ETCD 中

$ go run main.go init -h
Run initialize elastic crontab system service

Usage:
  ects init [flags]

Examples:
ects init

Flags:
  -e, --email string   Set admin email # 如果是采用配置文件方式初始化,则需要提供管理员邮箱
  -h, --help           help for init
  -m, --mode string    Set initialize mode with web ui or json, yaml config file (default "web") # 支持的模式有 web、json、yaml
  -n, --name string    Set admin name # 如果是采用配置文件方式初始化,则需要提供管理员用户名
  -P, --pass string    Set admin pass # 如果是采用配置文件方式初始化,则需要提供管理员密码
  -p, --path string    Set config file path # 如果是采用配置文件方式初始化,则需要提供配置文件路径
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

打包前端资源到二进制

在打包之前,请参照前端框架的内容,先眼妆依赖,并打包前端资源。

# install go-bindata
$ go get -u github.com/shuLhan/go-bindata/...

# 打包静态资源
$ go-bindata -pkg web -o web/bindata.go web/dist/...
1
2
3
4
5

启动服务

$ go run main.go master
1

前端框架

前端框架我们采用的是 Vue Cli 3.* 搭建的 SPA,以及基于 Vue 而开发的组件库 Element-UI

.
├── README.md
├── babel.config.js
├── bindata.go # 前端静态资源打包成二进制后的文件
├── dist # 执行 yarn build 后的输出目录
├── docs # 项目文档目录,采用 Vuepress 搭建
│   ├── README.md
│   ├── developer
│   │   ├── README.md
│   │   └── api.md
│   ├── introduction
│   │   ├── README.md
│   │   ├── architecture.md
│   │   ├── configuration.md
│   │   ├── dependencies.md
│   │   ├── managerment.md
│   │   ├── more.md
│   │   └── services.md
│   └── version
│       └── README.md
├── package.json
├── public
│   ├── favicon.ico
│   └── index.html
├── src
│   ├── App.vue # 根组件
│   ├── apis # 与后端交互的 API
│   │   ├── index.js
│   │   └── modules # API 模块
│   ├── assets # 前端静态资源
│   │   └── styles
│   ├── components # 自定义公共组件
│   │   ├── Collapse.vue
│   │   └── CronExpression.vue
│   ├── element-variables.scss
│   ├── entries # 入口文件
│   │   ├── index.js
│   │   └── initialize.js
│   ├── language # 本地化
│   │   ├── en.js
│   │   └── index.js
│   ├── layouts # 页面布局
│   │   ├── Backend.vue # 登录后的布局
│   │   └── Guest.vue # 未登录时的布局
│   ├── plugins # Vue cli 3.* 的插件目录
│   │   ├── axios.js # 发起 XHR 请求的插件
│   │   └── element.js # Element-UI 插件
│   ├── router
│   │   └── index.js # 前端路由
│   ├── store # vuex 目录
│   │   ├── actions.js
│   │   ├── index.js
│   │   ├── modules # 模块
│   │   ├── mutations.js
│   │   └── types.js
│   └── views # 模块页面
│       ├── About.vue # 关于
│       ├── Dashboard.vue # 概览
│       ├── Initialize.vue # 初始化配置
│       ├── Log.vue # 日志查询
│       ├── Node.vue # 节点管理
│       ├── NotFound.vue # 404 所有前端为定义的路由将跳转至该页面
│       ├── Pipeline.vue # 流水线管理
│       ├── Setting.vue # 系统设置
│       ├── SignIn.vue # 用户登录
│       ├── Task.vue # 任务管理
│       └── User.vue # 系统用户管理
├── vue.config.js # 项目配置,代理、HTTPS
├── yarn-error.log
└── yarn.lock

24 directories, 93 files
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72

安装依赖

$ cd web
$ yarn install
$ yarn build
1
2
3

项目配置

前端项目的打包配置都在 web/vue.config.js 文件中,其中 devServer 配置根据自己的需要进行设置。