CentOS 上搭建 grafana 开发环境

主要过程参考grafana/grafana 的github主页

环境要求

设置代理(必须,多个包依赖的源需要FQ才能访问)

预先安装依赖

yum install -y git bison gcc

需要预先安装 go1.7(官方要求,go 1.6 编译存在问题)

这里通过 gvm 这个go语言多版本工具安装,首先安装 gvm

bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
source /root/.gvm/scripts/gvm

如果要安装 go1.7,必须先安装 go1.4编译自举

gvm install go1.4 --source=http://xxx.xxx/go.git
gvm use go1.4
export GOROOT_BOOTSTRAP=$GOROOT
gvm install go1.7 --source=http://xxxx.com/ops/go.git
gvm use go1.7 --default

gvm 其他指令见 moovweb/gvm: Go Version Manager

需要预先安装 node(v4+), npm(v2.5.0), grunt(v0.4.5)

这里通过 creationix/nvm: Node Version Manager 安装

wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | bash

安装无误后,通过 nvm 安装 node

nvm install v5.11.1

安装好之后检查 node 和 npm 版本

npm -v
node -v

组织项目结构

创建 go 开发目录

首先确认 go 版本是 1.7

go version

创建项目目录结构

cd ~
mkdir -p ~/repo/grafana
cd ~/repo/grafana

创建 golang 隔离开发环境

gvm pkgset create --local
gvm pkgset use --local
go get github.com/grafana/grafana

后端编译

cd ~/repo/grafana/src/github.com/grafana/grafana
go run build.go setup
go run build.go build

前端编译

yum -y install bzip2  # phantomjs 解压缩
cnpm install -g grunt-cli # to do only once to install grunt command line interface

这里 npm 配置淘宝的镜像源 https://npm.taobao.org/,配置过程略;**注意这里使用alias的方式配置,不要使用安装cnpm的方式,否则可能会引起内存泄漏的问题(未确认原因)。**

配置完后,我们使用 cnpm 安装

cnpm install
cnpm run build

项目开发

开发支持工具

cd ~/repo/grafana
gvm pkgset use --local
go get github.com/Unknwon/bra

cd ~/repo/grafana/src/github.com/grafana/grafana
bra run

保持这个命令行,任何 golang 代码的变动都会被检测到,然后 bra 会自动执行编译和执行

另启动一个命令行

cd ~/repo/grafana/src/github.com/grafana/grafana
grunt watch

grunt 会检测前端代码的变动并执行编译

生成 rpm 包

生成 rpm 包需要 fpm

yum -y install ruby-devel gcc make rpm-build fontconfig # gem 安装 fpm

这里要将Ruby源替换为 ruby-china 的,按照这个链接的提示配置

注意:fpm 必须安装 v1.4 版本的,否则可能安装会有问题

gem install fpm -v 1.4 -V

fpm 安装好之后就可以制作分发包了。

go run build.go package latest

生成的包在 dist 目录中

打包的细节可以看官方的 grafana-packer 仓库的 build.sh

几个要注意的点

  1. 依赖的组件的各版本一定要和README文件中一致,如果不知道具体版本,可以去 circle CI配置里看,比如 node js 版本这里用的是 5.11.1 ,而如果直接安装最新版 v7.0.0,会导致编译失败 - 准则:任何搞不清楚版本的组件都去CI配置里面找版本号
  2. npm 使用 ruby-china 源,目前来看,没有 side-effect
  3. gem 源用淘宝的
  4. golang 的安装则比较简单了,通过 govendor 做了第三方包的版本锁定,安装的时候直接从 vendor 目录导入,所以只需要安装 golang 时需要FQ