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


从零开始,一个人,从连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的命令

我的思路是,参数构建流程选择服务-将选择服务的jar包移动到相应位置-执行如下脚本

启动kubernetes的脚本如下

[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 "备份完成"

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM