个人笔记

专注互联网

Drone学习笔记2

代码结构

king@king:~/code/go/src/github.com/drone$ tree . -L 2
.
├── drone # drone后台代码
│ ├── agent # drone agent主要实现,部分在drone/agent/
│ ├── build # 运行docker容器的逻辑
│ ├── cache # drone自己实现的一个类似redis的内置缓存器
│ ├── client # cli的通用封装
│ ├── drone # 入口代码,没什么核心逻辑
│ ├── model # 通用结构定义
│ ├── remote # 抽象封装github/bitbucket等接口逻辑
│ ├── router # drone server的路由和各种middleware
│ ├── server # drone server实现
│ ├── shared # 公共库
│ ├── store # 抽象封装数据接口,例如sqlite/mysql等
│ ├── version # 版本号
│ └── yaml # 解析.drone.yml文件的逻辑
├── drone-ui # drone server前端,使用React
│ ├── dist
│ ├── images
│ ├── index.html
│ ├── LICENSE
│ ├── package.json
│ ├── README.md
│ ├── src
│ ├── webpack.config.js
│ └── webpack.devserver.js
└── mq # drone实现的一个消息组件,实现了STOMP协议
├── build.sh
├── cmd
├── Dockerfile
├── LICENSE
├── logger
├── README
├── server
├── stomp

前端和资源

前端使用React构建,参考【src/github.com/drone/drone-ui】,还有一些模板资源,见【src/github.com/drone/drone/server/template/files】。

前端资源首先使用webpack将开发代码编译到dist目录【src/github.com/drone/drone-ui/dist/static】,然后使用go-bindata将dist下的文件打包成【src/github.com/drone/drone-ui/dist/dist_gen.go】

// Code generated by go-bindata.
// sources:
// dist/index.html
// dist/static/app.css
// dist/static/app.js
// dist/static/drone.svg
// dist/static/favicon.ico
// DO NOT EDIT!

然后使用go-bindata-assetfs将资源暴露出去。

src/github.com/drone/drone-ui/dist/dist.go

func AssetFS() *assetfs.AssetFS {
for k := range _bintree.Children {
return &assetfs.AssetFS{
Asset: Asset,
AssetDir: AssetDir,
AssetInfo: AssetInfo, Prefix: k}
}
panic("unreachable")
}

src/github.com/drone/drone/router/router.go

fs := http.FileServer(dist.AssetFS())
e.GET("/static/*filepath", func(c *gin.Context) {
fs.ServeHTTP(c.Writer, c.Request)
})

模板

模板并不需要预先编译打包,

src/github.com/drone/drone/Makefile

gen: gen_template gen_migrations

gen_template:
go generate github.com/drone/drone/server/template

gen_migrations:
go generate github.com/drone/drone/store/datastore/ddl

关于go generate,参考Golang generate 草案

src/github.com/drone/drone/server/template/template.go

package template

//go:generate go-bindata -pkg template -o template_gen.go files/

src/github.com/drone/drone/server/template/template_gen.go

// Code generated by go-bindata.
// sources:
// files/index.html
// files/login.html
// files/logout.html
// DO NOT EDIT!

package template

src/github.com/drone/drone/router/router.go

e.SetHTMLTemplate(template.Load())

经过这么一折腾,所有的静态资源都直接包含在一个单独的可执行程序中了

数据库迁移脚本

在Makefile中还有这么一段

gen_migrations:
go generate github.com/drone/drone/store/datastore/ddl

这用于将支持的数据库的迁移(migrate)sql脚本打包

package ddl
//go:generate go-bindata -pkg ddl -o ddl_gen.go sqlite3/ mysql/ postgres/