gitlab+jenkins+maven+docker(kubernetes)配置持续集成(流水线+脚本方式)

2 篇文章 0 订阅
1 篇文章 0 订阅

从零开始,一个人,从连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 "备份完成"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值