# 为 Gitlab 和 Jenkins 添加 InfluxDB 支持

## 概述

量化和监控对现在的开发运维工作的重要性是毋庸置疑的。在大肆鼓吹 DevOps 的今天，一体化的数据采集和可视化展示就尤为重要了。

为了能在同一视图下对 Jenkins 和 Gitlab 的操作进行监控，本来写了一些数据采集的脚本，后发现这两个系统都有实现向 InfluxDB 发送指标数据的能力，虽说结构和数据的细致程度可能不及定制脚本，但懒人方案始终是更快的解决办法。

> 非常对不起各位的是，下面的内容主要是堆代码了。

## 环境准备

### Docker

为方便部署，这里采用 Docker 作为执行环境，过程中需要下载一些镜像，所以这里可能要配置代理或者其他途径来获得镜像文件并导入。

> 这里假设宿主机 IP 为 10.211.55.5

### 网络

因为几个组件之间互相需要访问，因此我们首先用如下命令创建一个虚拟网络：

`docker network create devops`

## InfluxDB

### 启动

首先启动我们的 InfluxDB，因为 GitLab 只能连接 InfluxDB 的 udp 端口，而官方版本的镜像并未提供这一功能的方便设置，所以这里采用了一个第三方镜像。

> 这也是 DockerHub 上的常态 —— 嫡出被庶出灭了。

~~~bash
#!/bin/sh
docker run -d --name=influxdb \
--restart=always \
--network=devops \
-v /var/volume/influxdb:/data \
-p 20002:8083 \
-p 20003:8086 \
-p 20004:8089/udp \
-e UDP_PORT=8089 \
-e UDP_DB=gitlab \
appcelerator/influxdb
~~~

稍微做一下解释：

- 使用了上文创建的虚拟网络
- 镜像为 appcelerator/influxdb
- 宿主机上的 `/var/volume/influxdb` 目录被加载到容器的 `/data` 目录，用于数据存储的持久化。
- 开放了三个端口：
  - 8083：管理界面，可用浏览器访问
  - 8086：HTTP API
  - 8089：UDP 端口
- UDP 端口对应的数据库名为 gitlab

### 初始化

镜像成功启动之后，就可以使用浏览器打开 `http://10.211.55.5:20002`，用户名密码缺省为 `admin`，主机和端口分别为 `10.211.55.5` 和 `20003`，这些填写结束后，就可以对 influxdb 进行管理了。

分别为 gitlab 和 jenkins 创建数据库：

~~~sql
CREATE DATABASE "gitlab"
CREATE DATABASE "jenkins"
~~~

## Gitlab

### 启动

类似的，我们用如下脚本启动 Gitlab：

~~~bash
#!/bin/sh
docker run -d --name=gitlab \
--restart=always \
--network=devops \
-v /var/volume/gitlab/data:/var/opt/gitlab \
-v /var/volume/gitlab/conf:/etc/gitlab \
-v /var/volume/gitlab/log:/var/log/gitlab \
-p 21001:80 \
gitlab/gitlab-ce
~~~

跟前面的 InfluxDB 类似，或者说更加简单，连环境变量也不需要了。映射端口为 21001，加入同一个网络。

### 配置

浏览器登录页面之后，进入 URL： `http://10.211.55.5:21001/admin/application_settings`，对 Gitlab 进行设置。

在 Metrics 一节，会看到 InfluxDB 的配置信息，选中 Enable 之后，只需要填写主机和 UDP 端口即可，因为有虚拟网络的配置，这里主机我们直接填写 influxdb，端口就是 8089 了。

**变更配置后，利用 `docker kill/rm` 命令停止 gitlab，并重新启动。**

### 验证

接下来我们可以选择一个项目进行 commit/push 操作，然后进入前面提到的 InfluxDB 控制台。
页面右上角的数据库选择 `gitlab`，在查询输入框中输入 `SHOW MEASUREMENTS` 并执行，会看到 gitlab 在这一数据库中建立了各个数据表。

继续输入 `select * from events`，会看到我们刚刚进行的提交记录。

## Jenkins

### 启动

这里用了我自己的 Jenkins 镜像，完成的还是映射端口、挂接存储的任务。

~~~bash
#!/bin/sh
docker run -d --name=jenkins \
--restart=always \
--network=devops \
-v /var/volume/jenkins/data:/data/jenkins \
-v /var/volume/jenkins/maven:/data/maven \
-v /var/volume/jenkins/sonar:/data/sonar \
-v /var/volume/jenkins/kube:/data/kube \
-v /var/volume/jenkins/robot:/data/robot \
-p 21003:8080 \
dustise/jenkins
~~~

### 配置

启动之后访问`http://10.211.55.5:21003`，对 Jenkins 进行配置。

`http://10.211.55.5:21003/pluginManager/available` 在这一界面查找 `InfluxDB` 插件，进行安装启用。

InfluxDB 插件启用之后，就可以在 `http://10.211.55.5:21003/configure` 找到其配置内容，这里也就是设置一个 InfluxDB 连接到我们之前启动的数据库。

点击 `New InfluxDB Target` 按钮，在弹出的输入项目中，URL 填写为 `http://influxdb:8086`，用户名密码同上，数据库为 `jenkins`。

`retentionPolicy` 一项可以清空。

`exposeExceptions` 这一项目表示，向 InfluxDB 汇报数据的任务如果失败，是否标记所属 Build 过程为失败。

### 验证

首先我们创建一个新的 FreeStyle 项目，内容很简单，执行一个 `echo "Hello world"`。

在构建后步骤中，可以看到 `Post Build Actions` 新增了 `Publish build data to InfluDB`的动作。

添加这一动作之后，选择我们刚才建立的 InfluxDB Target。

Job 创建完成，就可以开始 Build 了。

Build 成功之后，我们可以在 InfluxDB 控制台上，切换到 Jenkins 数据库，执行 `SHOW MEASUREMENTS`，可以看到 Jenkins 创建的数据表。运行 `SELECT * FROM jenkins_data` 进行查询，就会看到我们刚才的 Build 数据。

> Robot 等插件也会将结果插入 InfluxDB

## 展示

有了这些数据，我们就可以以项目为单位，利用 Grafana 或者其他可视化工具，对结果进行叠加和展示了。
