从零开始,一个人,从连jenkins是什么都不知道到基本完成持续集成,可以初步服务于公司的开发环境,用时大约一个月的时间,中间碰坑无数,每一个点击,每一个配置都被卡过很长时间,还好这之前对脚本还算熟悉,用脚本完成了jenkins的一些docker方面的功能,不然还需要再耗时一两周,以下是我完成的流程图(没怎么画过,不规范),希望初学者能在我这里得到一些灵感,不至于入门无路。
jenkins,maven,gitlab,docker的安装以后再写
持续集成流程图
流程:
为防止意外,使用半自动集成方式,因为研发人员太多,经常把gitlab当vpn使,随笔改点啥就提交,很容易出问题,所以基本思路是提交代码自动触发流程maven打jar包,手动选择需要更新的服务打包docker镜像发布到docker,当然也可以发布到kubernetes,多写一段脚本的事。
使用gitlab作为代码仓库,配置jenkins,创建一个自由风格的软件项目,配置流程gitlab触发器-maven打包-移动jar包到指定位置,再创建一个带参数的流程-选择需要更新的服务-打包docker镜像-发布服务,这个带参数的流程需手动选择需要更新的服务,这个流程是上图中的??标记内容
1.gitlab上传代码
gitlab创建一个用户上传代码,由于和本文关系不大,省略
2.配置jenkins
安装好jenkins以后还需要对jenkins进行配置,包括jdk,maven,gitlab等
jdk配置
点击系统管理-全局工具配置-JDK安装-新增JDK
不要选择自动安装,选择本地的jdk路径,如果jdk都不会安装的话建议就不要看这篇文章了,先看看鸟哥的linux私房菜,或者linux从入门到精通……
git配置
点击系统管理-全局工具配置-add git
这个配置可以让你使用git获取gitlab的代码
gitlab配置
系统管理-系统配置-gitlab
这里添加的是gitlab的API token
打开gitlab-setting-acces tokens-name api-create
生成了一个apitoken,复制到上面的API token位置保存即可
maven配置
点击系统管理-全局工具配置-maven
点击系统管理-全局工具配置-maven配置
这个配置可以让你使用mvn命令
3.配置jenkins流程
jenkins的安装参考我之后的博文
安装好jenkins以后,首页是这样的
点击新建任务-创建一个自由风格的软件项目project1-源码管理git-构建触发器-构建
点击新建任务
创建一个自由风格的软件项目project1
源码管理git
填写URL,凭证,触发分支,这里选择的是master
添加gitlab凭证-username with password
构建触发器
记下标红的URL,后面会用到
点击高级-Generate 生成的Secret token记下来,待会配置gitlab会用到
配置gitlab
使用管理员账户登录-configure gitlab-用户设置-网络-外发请求
点击项目-settings-webhooks
填入上面记录的url token ADD webhooks
构建
构建maven打包-移动jar包-构建执行shell
相关配置如下图所示
Maven版本是上面配置的maven,目标是mvn打包命令,POM是pom.xml文件在项目中的位置,默认是/root/.jenkins/workspace/project1/
这个目录是jenkins项目流程的代码的根目录,执行过一遍流程以后代码就会下载到这个位置,你上传到gitlab的代码都在这个目录,pom.xml是相对位置,如果pom文件没有在gitlab的根目录,那就要根据实际情况来写,如果pom.xml在项目的test文件夹中,那这里应该写test/pom.xml
[root@localhost project1]# ll
total 24
drwxr-x--- 5 root root 97 Jul 8 16:05 business-service
drwxr-x--- 3 root root 83 Jul 8 13:57 business-service-api
drwxr-x--- 4 root root 69 Jul 8 18:50 kcmd-common
drwxr-x--- 4 root root 67 Jul 8 18:50 kcmd-util
-rw-r----- 1 root root 80 Jul 8 13:57 pie.iml
drwxr-x--- 3 root root 69 Jul 8 13:57 platform-service
drwxr-x--- 3 root root 77 Jul 8 13:57 platform-service-api
-rw-r----- 1 root root 17233 Jul 8 18:50 pom.xml
drwxr-x--- 2 root root 36 Jul 8 18:50 target
drwxr-x--- 3 root root 66 Jul 8 16:04 thirdbroker-service
drwxr-x--- 3 root root 70 Jul 8 16:05 thirdbroker-service-api
[root@localhost project1]# pwd
/root/.jenkins/workspace/project1
执行shell将maven打包的jar包移动到指定位置,后续进行镜像制作
移动jar包的脚本
# !/bin/sh
filelist=`ls /root/.jenkins/workspace/project1/target`
for file in $filelist
do
echo $file
filename=${file%%-*}
echo $filename
if [ -f /home/pie/jar/$filename/$file ]
then
localtime=$(date "+%Y%m%d%H%M%S")
mkdir /home/pie/jar/$filename/$localtime
mv /home/pie/jar/$filename/$file /home/pie/jar/$filename/$localtime
cp /root/.jenkins/workspace/project1/target/$file /home/pie/jar/$filename
else
cp /root/.jenkins/workspace/project1/target/$file /home/pie/jar/$filename
fi
done
第一部分的流程到这里就结束了,它的作用是gitlabpush代码自动触发流程打包成jar包并移动到jar到到指定位置,为后续的流程服务
第二部分流程
创建一个带参数的流程-选择需要更新的服务-打包docker镜像-发布服务
创建一个带参数的流程,和上面创建流程一样
在General标签中点击-参数化构建过程-添加参数-extended choice parameter-Basic Parameter Types-Check Boxes
选择框显示条数为5,分隔符为",",在choose source for value中点击value在内容中写下你们微服务的服务名,用逗号隔开
构建标签,选择执行shell,脚本内容
保存,结束
cd /home/pie
OLD_IFS="$IFS"
IFS=","
service=($PROJECT_SERVICE)
IFS="$OLD_IFS"
for var in ${service[@]}
do
if [ var = "all" ]
then
docker-compose up -d --build
else
docker-compose up -d --build $var
fi
done
扩展内容
如果不使用docker-compose,使用kubernetes也是可以的,可以把docker-compose换成kubernetes的命令
上面一套流程是为别的项目组打造的,我自己使用的不是这一套,如果不用docker-compose,可以使用kubernetes,我还是比较倾向于kubernetes,因为它的功能可比compose强多了,参数构建流程选择服务-将选择服务的jar包移动到相应位置-执行如下脚本
启动kubernetes的脚本如下,思路是把需要更新的服务jar包复制到对应目录下,脚本读取目录中需要更新的jar,对jar包进行打包制作镜像,上传到本地镜像仓库,更新kubernetes服务,将jar包移走,清空jar包存放目录,等待下一次的更新
[root@linux1 bin]# cat start.sh
#! /bin/bash
# 获取目录中的jar包名称
ls -l /sga/kubernetes/autostart/jar/ | awk '{print $9}' > /sga/kubernetes/autostart/name/jars
sed -i '1d' /sga/kubernetes/autostart/name/jars
sed -i 's/.jar//g' /sga/kubernetes/autostart/name/jars
sed -i 's/kcmd-//g' /sga/kubernetes/autostart/name/jars
# 遍历所有在目录中的jar包
for line in $(cat /sga/kubernetes/autostart/name/jars)
do
#echo $line
docker images | grep kcmd-${line} | awk '{print $2}' > /sga/kubernetes/autostart/name/tag-${line}
sed -i 's/^....//' /sga/kubernetes/autostart/name/tag-${line}
i=$(head -n 1 /sga/kubernetes/autostart/name/tag-${line})
echo "原来docker版本为:1.0.$i"
j=`expr $i + 1`
echo "要新建的docker版本为:1.0.$j"
# 对每个新jar包都执行创建镜像的命令,并将镜像推送到本地仓
docker build -t 192.168.0.11:5000/kcmd-$line:1.0.$j -f /sga/kubernetes/autostart/dockerfile/Dockerfile$line /sga/kubernetes/autostart/jar/
docker push 192.168.0.11:5000/kcmd-$line:1.0.$j
done
# 遍历所有在目录中的jar包
for line in $(cat /sga/kubernetes/autostart/name/jars)
do
# 获取当前版本号,并生成需要创建的版本号
i=$(head -n 1 /sga/kubernetes/autostart/name/tag-${line})
echo "原本的版本=$i"
j=`expr $i + 1`
echo "需要创建的版本=$j"
# 更改yaml文件中的版本信息
sed -i "18c \ image: 192.168.0.11:5000/kcmd-$line:1.0.$j" /sga/kubernetes/autostart/yaml/kcmd-${line}.yaml
# 替换yaml文件中的image信息并运行新的镜像
kubectl apply -f /sga/kubernetes/autostart/yaml/kcmd-${line}.yaml # --record $j
#kubectl set image deployment/kcmd-${line} 192.168.0.11:5000/kcmd-${line}=192.168.0.11:5000/kcmd-{$line}:1.0.$j
done
#备份jar包
echo "备份jar包到/sga/kubernetes/autostart/backup"
time=$( date +%Y%m%d_`date +%H%M%S`)
echo $time
mkdir /sga/kubernetes/autostart/backup/"jar_${time}"
mv /sga/kubernetes/autostart/jar/* /sga/kubernetes/autostart/backup/"jar_${time}"
echo "备份完成"