Git+Jenkins之自动构建

一、起因

公司的服务端维护一份错误码文件:errorCode.json,同时客户端也需要根据这样一份错误码对用户进行提示,错误码Sample如下:

1
2
3
4
5
6
7
8
9
{
"200": {
"0": {"msg": "成功"}
},
"300": {
"100": {"msg": "错误1"},
"101": {"msg": "错误2"}
}
}

平时都是服务器的同学在群里说 “加了xxx协议,更新了错误码 -。-” 客户端的同学才会去errorCode.json所在的项目(项目计划)更新项目,然后复制出来放到自己的应用项目中。

这么操作,一来可能会让错误码更新不及时;二来这份文件返回的msg对用户并不友好,有时候需要我们手动设置对应的错误提示,代码中设置并不是一个好的选择,所以我们打算改造这份错误码,添加一些自定义的消息,如果存在自定义消息则使用自定义消息(这些不在本篇文章的讨论范围),改造后的json如下:

1
2
3
4
5
6
7
8
9
10
11
12
{
"200": {
"0": {"msg": "成功"}
},
"300": {
"100": {
"msg": "错误1",
"cmsg": "这是给用户看的消息"
},
"101": {"msg": "错误2"}
}
}

然后就出现了这么一个需求:

自动更新我们项目中的errorCode.json文件,同时要把我们的自定义消息合并进去。

后来想想正好用git + jenkins hooks的方式:当有更新push到GitLab(我们内部使用的git管理平台)的时候,调用jenkins的project hook去自动执行相应的job,这个job是个shell脚本,有三步操作:

  1. update git project
  2. merge errorCode.json(此处是使用java做的,怎么方便怎么弄)
  3. push to git project

二、经过

安装插件

安装git插件
进入【插件管理】界面安装以下插件:

Git client plugin
Git plugin
GitLab Plugin
AnsiColor(可选)这个插件可以让Jenkins的控制台输出的log带有颜色(就和linux控制台那样)

配置本地Git环境和Jenkins

配置Git

  1. 先在Jenkins所在机器 安装Git
    安装好以后,添加git用户:

    1
    2
    git config --global user.name "jenkins"
    git config --global user.email "jenkins@your-company.com"

    PS:GitLab中需要有一个对应的jenkins账号,用来拉取代码

  2. 生成本地账号的ssh秘钥
    在命令行下(window下,使用Git Bash)进入主目录,执行以下命令:

    1
    2
    ssh-keygen -t rsa -C "jenkins@your-company.com"
    cat ~/.ssh/id_rsa.pub

    然后复制出公钥,添加到GitLab对应账号(jenkins)的SSH Keys中,这个公钥是为了让jenkins在拉取代码的时候有相应权限

  3. 生成jenkins的ssh秘钥
    在命令行下进入 jenkins的安装目录\.ssh,执行以下命令:

    1
    2
    ssh-keygen -t rsa
    cat id_rsa.pub

    然后复制出公钥,添加到GitLab对应账号(jenkins)的SSH keys中,这个公钥是为了让jenkins执行shell脚本时,如果shell脚本中有git命令,使其有拉取、提交代码的权限

配置Jenkins

  1. 在Jenkins中配置Git
    进入【系统管理】->【系统设置

    • 设置使用的Git命令行
      设置Git

    • 配置Git账号
      配置Git账号

    • 配置Gitlab信息
      配置Gitlab

    • API Token获取方式
      API Token获取方式

  2. 在Jenkins中配置Git账号
    进入Credentials】->【Global credentials(unrestricted】->【Add Credentials
    配置Git账号

添加Job

新建一个【构建一个自由风格的软件项目】的Job

  • 配置这个Job所用的Git项目信息
    Job Git Info
    这里的Credentials就是在配置Git账号中设置的账号;如果不配置Git项目信息,Git Push之后这个Job不会自动执行

  • 配置触发器
    Job Trigger
    这里的圈出来的URL,需要配置到Gitlab对应项目的Web Hooks中

  • 配置errorCode所在项目的Web Hooks
    Gitlab】->【选择项目】->【Settings】->【Web Hooks
    Gitlab Web Hooks
    设置只有在收到push消息时才自动执行jenkins的job

  • 配置构建环境(可选)
    Job Xterm Evn
    shell脚本中如果会输出带颜色的文字,可以设置这个,使Jenkins的Web Console也输出相同的颜色

  • 配置执行的脚本并保存
    Job Execute Shell

update.sh脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#!/bin/bash
###################################################################
#
# 目录结构:
# .../ErrorCode
# tools/
# ECode.jar //用java写的转换json工具
# color.sh
# config.properties //ECode.jar用的配置文件,配置json文件路径什么的
# update.sh
# plan_project/
# ....../clientErrorCode.json
# android_application_project/
# ....../clientErrorCode.json
#
#
# 注意:
# 需要把 ErrorCode/下的所有文件的所有者设置为jenkins,
# 否则jenkins执行这个脚本的时候,会因为缺乏读写权限导致更新、提交git失败
#
###################################################################
source /Users/compile/ErrorCode/tools/color.sh
cd /Users/compile/ErrorCode/
cd tools
echoBlue "update plan_project.."
cd ../plan_project
git pull origin master
if [ $? -ne 0 ]; then
echoError "update plan_project(clientErrorCode.json) from git failed"
exit 1
fi
echoBlue "update android_application_project.."
cd ../android_application_project
git checkout develop
git pull origin develop
if [ $? -ne 0 ]; then
echoError "update android_application_project from git failed"
exit 1
fi
cd ../tools
java -jar ECode.jar
if [ $? -eq 0 ]; then
cd ../android_application_project
git commit -am "update clientErrorCode.json by jenkins auto script"
if [ $? -ne 0 ]; then
echoError "commit android_application_project failed"
exit 1
fi
git push origin develop
if [ $? -ne 0 ]; then
echoError "push android_application_project failed"
exit 1
fi
exit 0
else
echoError "merge clientErrorCod.json failed"
exit 1
fi

[color.sh] on Github

ECode.jar

[ECode.jar] on Github

三、结果

一劳永逸,快哉。

参考

百度经验:打包可执行jar
百度经验:Eclipse jar打包
CNBlog:可执行jar引用其他jar