Prometheus構(gòu)建發(fā)布工具 promu 使用
眾所周知,Go語言中打包命令是 go build。在項目中,你可以單獨使用 go build 命令對項目進行編譯打包,也可以根據(jù)自己的需要,在該命令后加各種參數(shù)。prometheus官方為了統(tǒng)一項目(包括 prometheus、alertmanager和各種官方的 exporter)的編譯和打包,開發(fā)了 promu 工具。
官方對 promu 工具的介紹:
`promu?is?the?utility?tool?for?building?and?releasing?Prometheus?projects``#?promu是一個構(gòu)建和發(fā)行Prometheus項目的實用工具`
promu工具的獲取
源碼編譯:
git?clone?https://github.com/prometheus/promu.git
make?build
直接下載可執(zhí)行文件:
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,但是,官網(wǎng)上除了對promu工具參數(shù)的簡單解釋外,沒有對 .promu.yml的編寫進行說明,下面我們對一些常用的配置進行說明(可能官方覺得既然都要去編譯prometheus項目了,那肯定會去看代碼的,所以就不寫文檔了)
下面這個.promu.yml文件,就是在我的一個go項目中使用promu工具進行打包的配置文件
#?go相關(guān)的基本配置
go:
??cgo:?true
repository:
??#?module?name
??path:?woqutech.com/jianqiang.zhu/my-golang
#?構(gòu)建
build:
??binaries:
??????#?輸出的二進制包名稱
????-?name:?woqu
??????#?main方法所在go文件的位置
??????path:?./
??flags:?-a?-tags?netgo
??#?編譯時注入變量,結(jié)合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代碼中直接調(diào)用C的庫函數(shù),大大提高了效率,減少了重復開發(fā)工作,如果你的項目中引用了用CGO寫成的庫,在編譯時要把CGO_ENABLED=1開起來。如在使用go-sqlite3

(2)Oracle exporter 需要oracle提供的OCI或ODPI動態(tài)鏈接庫支持,需要開啟CGO特性
(3)網(wǎng)上說使用CGO的庫,會使整個系統(tǒng)的性能大大降低。goroutine 通過 CGO 進入到 C 接口的執(zhí)行階段后,已經(jīng)脫離了 golang 運行時的調(diào)度并且會獨占線程,此時實際上變成了多線程同步的編程模型。如果 C 接口里有阻塞操作,這時候可能會導致所有線程都處于阻塞狀態(tài)?
repository標簽
(1)path
- path后所填的變量為你的模塊,go語言在1.11后,官方支持了模塊,即Go Modules,使用go mod命令實現(xiàn)
- 當你在你項目的根目錄執(zhí)行 go mod init woqutech.com/jianqiang.zhu/my-golang后,當前目錄就變成了一個go模塊,并會生成一個go.mod文件
- 若path后所填不是模塊名,promu工具編譯時則會去GOPATH或GOROOT目錄下找,如下圖:

build標簽
(1)binaries
- 輸出的二進制包的名字:name
- 指定main包的位置:path
- 可以以yml列表的形式編寫多個,執(zhí)行build命令后生成多個二進制包
(2)flags
-a:強制重新構(gòu)建
-tags:TODO,還不清楚具體干啥
(3)ldflags
編譯時加上ldflags屬性,可以設置變量的值,在prometheus項目中通常用來設置版本等基礎信息(當前項目必需被git所管理,否則編譯時獲取不到分支等信息),并結(jié)合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支持交叉編譯,我們生產(chǎn)環(huán)境均為linux/amd64環(huán)境,無需使用該功能,不然多環(huán)境的使用會引入不必要的麻煩。
但是某些依賴庫在操作系統(tǒng)上安裝部署非常麻煩,可以借助crossbuild在docker環(huán)境中構(gòu)建可執(zhí)行程序。
原文鏈接:http://blog.lujianxin.com/x/art/mwuvnoldjj83
