目标:当有代码提交到了gitlab以后,自动部署新的代码。
1 准备工作
1.1 汉化(如果安装好就已经是中文了,跳过这一步)
manage jenkins -> manage plugins ->可选插件 -> 搜索 locale -> 直接安装
ps: 插件如果搜不到,表示你已经安装了。
安装完成后去配置:
manage jenkins ->Configure system
1.2 安装git和gitlab插件
- manage jenkins -> manage plugins ->可选插件
- 分别搜索git和gitlab,如果没搜到表示已经装好了,在 已安装 里能找到。
- 安装
1.3 配置gitlab 插件
-
manage jenkins ->Configure system -> 填写gitlab配置 ->保存
1.4 配置git插件
-
manage jenkins ->Configure system -> 填写git plugin配置 ->保存
1.5 jenkins的服务器的sshkey需要添加到gitlab
- 在jenkins生成key:
ssh-keygen -t rsa -C "your.email@example.com" -b 4096
这里需要注意,如果你jenkins启动用户不是root,则需要用你的启动用户去生成key。
- 拷贝到gitlab
1.5 安装jenkins的服务器需要安装git:
yum install git
1.6 安装jenkins的服务器需要安装maven:
- 官网下载
- 解压
- 配置环境变量
- 验证是否成功
[root@kvm15 ~]# mvn -version
Apache Maven 3.6.1 (d66c9c0b3152b2e69ee9bac180bb8fcc8e6af555; 2019-04-05T03:00:29+08:00)
Maven home: /home/maven/apache-maven-3.6.1
Java version: 1.8.0_151, vendor: Oracle Corporation, runtime: /usr/java/jdk1.8.0_151/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-693.17.1.el7.x86_64", arch: "amd64", family: "unix"
[root@kvm15 ~]#
2 创建jekins job
2.1 拉代码
起一个任务名字
填写描述和git相关信息
我们保存,然后构建一下,查看工作日志:
大概可以看出来,jenkins把代码clone到了指定的工作目录下,可以去工作目录核实一下:
[root@kvm15 lib]# cd /var/lib/jenkins/workspace/deploy_merchat_open_api
[root@kvm15 deploy_merchat_open_api]# ls
pom.xml README.MD src
2.2 打包
在 构建 下新建一个execute shell命令,命令为打包:
mvn package -Dmaven.test.skip=true -f pom.xml
保存,构建。
这个时候你会发现构建失败了,找不到mvn命令。 其实是因为jenkins没有使用系统的环境变量,需要单独配置环境变量(配置一次以后,所有job共用。)。在manage jenkins ->Configure System ->全局属性:
在此构建,已经成功,并且已经生成了可运行jar包(因为我是springboot项目):
pom.xml README.MD src target
[root@kvm15 deploy_merchat_open_api]# ls target/
classes generated-sources maven-archiver maven-status merchant-open-api-1.0.0.RELEASE.jar merchant-open-api-1.0.0.RELEASE.jar.original
[root@kvm15 deploy_merchat_open_api]#
2.3 推到远程服务器
用scp命令把可运行的jar包推到应用服务器。我这里只有一台机器,所以就用cp命令拷贝到指定目录下模拟推送到别的服务器。
2.4 重启
我们还需要判断一下是否有进程再杀进程,否则当没有进程的时候,执行kill命令会报错,完整的脚本:
mvn package -Dmaven.test.skip=true -f pom.xml
cp ./target/merchant-open-api-1.0.0.RELEASE.jar /home/exter/merchant/war/
pid=$(ps -ef|grep merchant-open-api|grep -v grep|cut -c 9-15|xargs)
if [ "$pid"x = ""x ]; then
echo "no old pid"
else
kill -9 $pid
echo "$pid been killed"
fi
nohup java -jar /home/exter/merchant/war/merchant-open-api-1.0.0.RELEASE.jar -Xms256m -Xmx256m --spring.profiles.active=test &
构建的日志看出已经成功:
去目录查看jar包,创建时间是刚刚:
[root@kvm15 deploy_merchat_open_api]# ll /home/exter/merchant/war/
total 35908
-rwxrwxrwx 1 root root 36768901 May 21 15:48 merchant-open-api-1.0.0.RELEASE.jar
但是。。。却没有进程:
[root@kvm15 deploy_merchat_open_api]# ps -ef|grep merchant
root 14575 13172 0 15:55 pts/1 00:00:00 grep --color=auto merchant
这其实是我把jenkins和应用弄在了一台上面引起的,不推荐这么做。 官方也有这个问题的描述:
https://wiki.jenkins.io/display/JENKINS/ProcessTreeKiller
其实就是jenkins默认会清理job产生的子进程,避免留下太对僵尸进程。解决方案是设置一下build_id:
或者
启动jenkins的时候禁用该功能:
java -Dhudson.util.ProcessTree.disable=true -jar jenkins.war
如果只是手动触发的话,到此就可以了。当我们需要自动的持续集成环境的时候,需要用到自动触发构建:比如定时(每天自动拉一下代码部署)或者每次有代码提交到代码仓库就自动部署一次。
2.5 设置代码提交时触发构建
构建触发器:
- 触发远程构建 (例如,使用脚本):暴露一个带token的url,访问该url则触发构建。
- Build after other projects are built:指定在一个别的job之后触发。
- Build periodically : 周期性触发,比如 :每个月第一天触发。
- Build when a change is pushed to GitLab. :当有代码push到git上触发,利用了git的hook
- GitHub hook trigger for GITScm polling:通过github的hook触发
- Poll SCM:定期检查,如果有更新则触发,没有则不触发。
我们这里选择用git的hook触发:
当push事件发生或者accepted merge request 事件发生时触发。