文章详情页 您现在的位置是:网站首页>文章详情
Promu打包编译工具
Jeyrce.Lu 发表于:2021年1月7日 16:19 分类:【服务器】 3929次阅读
promu简介
众所周知,Go语言中打包命令是go build。在项目中,你可以单独使用go build 命令对项目进行编译打包,也可以根据自己的需要,在该命令后加各种参数。prometheus官方为了统一项目(包括prometheus,alertmanager和各种官方的exporter)的编译和打包,开发了promu工具。
官方对promu工具的介绍:
promu is the utility tool for building and releasing Prometheus projects # promu是一个构建和发行Prometheus项目的实用工具
promu工具的获取
源码编译:git clone https://github.com/prometheus/promu.git 之后 make build
直接下载可执行文件:curl -s -L https://github.com/prometheus/promu/releases/download/v0.5.0/promu-0.5.0.linux-amd64.tar.gz | tar -xvzf - -C /tmp
promu配置文件介绍
promu使用过程中,最重要的配置文件是.promu.yml。但是,官网上除了对promu工具参数的简单解释外,没有对.promu.yml的编写进行说明,下面我们对一些常用的配置进行说明(可能官方觉得既然都要去编译prometheus项目了,那肯定会去看代码的,所有就不写文档了)
下面这个.promu.yml文件,就是在我的一个go项目中使用promu工具进行打包的配置文件
# go相关的基本配置 go: cgo: true repository: # module name path: woqutech.com/jianqiang.zhu/my-golang # 构建 build: binaries: # 输出的二进制包名称 - name: woqu # main方法所在go文件的位置 path: ./ flags: -a -tags netgo # 编译时注入变量,结合prometheus的version包使用 ldflags: | -X github.com/prometheus/common/version.Version={{.Version}} -X github.com/prometheus/common/version.Revision={{.Revision}} -X github.com/prometheus/common/version.Branch={{.Branch}} -X github.com/prometheus/common/version.BuildUser={{user}}@{{host}} -X github.com/prometheus/common/version.BuildDate={{date "20060102-15:04:05"}} # 打包,将生成的二进制包和files下列出的文件进行打包 tarball: files: - default.yml - README.md # 交叉编译 crossbuild: platforms: - linux/amd64 - linux/386
go标签
(1)cgo
go语言提供了CGO机制,使得能够在go代码中直接调用C的库函数,大大提高了效率,减少了重复开发工作,如果你的项目中引用了用CGO写成的库,在编译时要把CGO_ENABLED=1开起来。如在使用go-sqlite3
(2)Oracle exporter 需要oracle提供的OCI或ODPI动态链接库支持,需要开启CGO特性
(3)网上说使用CGO的库,会使整个系统的性能大大降低。goroutine 通过 CGO 进入到 C 接口的执行阶段后,已经脱离了 golang 运行时的调度并且会独占线程,此时实际上变成了多线程同步的编程模型。如果 C 接口里有阻塞操作,这时候可能会导致所有线程都处于阻塞状态?
repository标签
(1)path
- path后所填的变量为你的模块,go语言在1.11后,官方支持了模块,即Go Modules,使用go mod命令实现
- 当你在你项目的根目录执行 go mod init woqutech.com/jianqiang.zhu/my-golang后,当前目录就变成了一个go模块,并会生成一个go.mod文件
- 若path后所填不是模块名,promu工具编译时则会去GOPATH或GOROOT目录下找,如下图:
build标签
(1)binaries
- 输出的二进制包的名字:name
- 指定main包的位置:path
- 可以以yml列表的形式编写多个,执行build命令后生成多个二进制包
(2)flags
-a:强制重新构建
-tags:TODO,还不清楚具体干啥
(3)ldflags
编译时加上ldflags属性,可以设置变量的值,在prometheus项目中通常用来设置版本等基础信息(当前项目比需被git所管理,否则编译时获取不到分支等信息),并结合prometheus的version包来使用,下面是个简单的例子:
package main import "gopkg.in/alecthomas/kingpin.v2" import "github.com/prometheus/common/version" func main() { kingpin.Version(version.Print("woqu")) kingpin.Parse() }
- 命令: ./promu build
tarball标签
(1)files
编译完成之后,你可能需要将二进制文件和其他文件一起打个包,则可使用这个命令
命令: ./promu tarball
crossbuild标签
golang支持交叉编译,我们生产环境均为linux/amd64环境,无需使用该功能,不然多环境的使用会引入不必要的麻烦。
但是某些依赖库在操作系统上安装部署非常麻烦,可以借助crossbuild在docker环境中构建可执行程序。
版权声明 本文属于本站 原创作品,文章版权归本站及作者所有,请尊重作者的创作成果,转载、引用自觉附上本文永久地址: http://blog.lujianxin.com/x/art/mwuvnoldjj83
上一篇:20年年终盘点
下一篇:Promu打包编译工具
猜你喜欢
文章评论区
作者名片
- 作者昵称:Jeyrce.Lu
- 原创文章:61篇
- 转载文章:3篇
- 加入本站:2004天
作者其他文章
站长推荐
友情链接
站点信息
- 运行天数:2005天
- 累计访问:164169人次
- 今日访问:0人次
- 原创文章:69篇
- 转载文章:4篇
- 微信公众号:第一时间获取更新信息