博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Devops】【docker】【CI/CD】3.Jenkins+GitLab+docker+springboot 实现自动化部署
阅读量:5877 次
发布时间:2019-06-19

本文共 7828 字,大约阅读时间需要 26 分钟。

 

================================================================================================================================================

需求:

1.已经启动了jenkins【】

2.已经启动了gitlab【】

3.jenkins需要按照上面步骤,已经确定maven插件Git插件GitLab插件GitLab hook插件Maven Integration插件Publish Over SSH插件已经成功安装【Git插件在第一篇初始化启动,推荐安装的、其他几个插件是在第一篇末尾安装的】

================================================================================================================================================

 需要了解的:

1.webhook网络钩子可以看成是一个callback  回调方法本回调方法核心即包含:    触发条件+可供触发的URL+密码(可选)     触发条件为:push、merge、PR(即 New  Pull Request)等等git操作,    比如你提交一个push操作,就会触发URL请求,会以POST请求去请求这个URL。除此以外,你还可以自己指定这个POST请求的数据格式。(JSON,x-www-form-urlencoded等)。
2.webhook是gitlab端的触发webhook的条件,可以自行配置,都是本地对gitlab的git操作触发后去请求的URL地址,是Jenkins提供的。也就是触发后是去请求Jenkins的

 

3.而实现代码从gitlab到jenkins到自动部署,webhook就是gitlab和jenkins之间的关键点。后续会先配置jenkins,以获取到URL和Token,拿着这两个东西去gitlab配置webhook,即可。同时,webhook本身还会有很多的触发条件可以勾选。后续步骤可见!

 

 

=================================================================正文开始====================================================================================

1.jenkins全局工具配置【docker容器Jenkins,自动安装】

地址:

 

2.jenkins全局安全配置

进入系统管理   ------> 全局安全配置

 

取消勾选CSRF

原因:

webhooks与jenkins配合使用时提示:HTTPStatus403-Novalidcrumbwasincludedintherequest,这是因为jenkins在http请求头部中放置了一个名为.crumb的token。在使用了反向代理,并且在jenkins设置中勾选了“防止跨站点请求伪造(Prevent Cross Site Request Forgery exploits)”之后此token会被转发服务器apache/nginx认为是不合法头部而去掉。导致跳转失败。

 

 

3.新建Jenkins任务

 

3.1点击新建任务,输入名称【本处输入名称注意】

【注意,本名称一般和项目名称一致,因为本名称会在jenkins工作空间下生成目录,类似于IDEA或Ecplise的工作空间的概念】

【所以,一般情况下,保证本名称=项目名称=docker镜像名称=docker容器名称  这样能尽可能的减轻jenkins配置的shell命令的复杂性!从而形成一定的规范!!】

选择构建一个Maven项目【因为是spring boot的服务】

 

 

 

3.2 General选项卡,通用设置下输入描述信息

自由输入

 

3.3 Source code manager 源码管理 选择Git

【内网推荐使用Http地址去clone项目】

【分别使用SSH和HTTP取clone项目,可以去看:】

【如果此处添加地址后报错,或者Jenkins构建报错:Please make sure you have the correct access rights and the repository exists.去看这篇:】

 

 3.4 Build Triggers 构建触发器的配置

【构建触发器中配置,会获取到文章开始提到的URLToken,这两个东西需要记录下来,供gitlab配置webhook使用】

记录URL

http://192.168.92.130:9980/project/swapping

 

URL和Token都需要填写到GitLab中,去配置webhooks!!!

 

点击高级后,最下方可以点击生成Token

记录Token

6b2eb2c3a9d1d2f64c73784bf30a4cda

 

 

3.5 Build Environment 构建环境的配置根据自己需求配置

 

 

 

 

3.6 Pre Steps 即jenkins构建前一步 需要做的事情

 【本处,配置前一步需要做的事情是:清理swapping即本项目在jenkins的workspace中的历史文件夹】

【在本步骤配置时,你可以不用知道WORKSPACE具体的地址在哪里,因为下方有链接可以查看到当前jenkins中有哪些可用的变量供你使用】

【默认WORKSPACE地址:/var/jenkins_home/workspace】

【当然,如果你jenkins是docker启动的,并且挂载了目录在宿主机,那你在宿主机也是可以看到的】

 

【注意:本处选择是是,执行shell,则表示本处配置的shell命令,是默认在jenkins容器中执行的,而不是在宿主机上】

 

可以查看可用的全局变量

 

前一步要做的shell命令:

SERVER_NAME_1=swappingecho "=========================>>>>>>>工作空间WORKSPACE的地址:$WORKSPACE "cd $WORKSPACEecho "=========================>>>>>>>进入工作空间WORKSPACE,清除工作空间中原项目的工作空间$SERVER_NAME_1 "rm -rf $SERVER_NAME_1echo "=========================>>>>>>>清除工作空间中原项目的工作空间$SERVER_NAME_1 ......成功success"
View Code

【注意:本处的SERVER_NAME_1=swapping 是配置的项目的名称】 

 

 

 

 

3.7 Build 构建的配置

jenkins构建项目,本处是以maven插件实现的。

因此,配置

clean package

 

 

 

3.8 Post Steps 即jenkins构建完成后一步配置

【本处选择,只在jenkins构建成功后,再执行这一步】

【因为最后的构建成功的maven项目的jar包是以docker启动服务为目的,所以最后的docker操作,一定是在jenkins容器以外的服务器上运行的,可能是本机宿主机,也可能是远程的服务器】

【所以本处选择,在远程的SSH执行shell脚本】

【因此,必须要求,文章初始的第一篇中,必要安装的插件已经要安装完成。此处尤其是Publish Over SSH插件以及它的相关配置

 

 

 

 

shell命令如下:

#=====================================================================================#=================================定义初始化变量======================================#=====================================================================================#操作/项目路径(Dockerfile存放的路劲)BASE_PATH=/apps/swapping# jenkins构建好的源jar路径  SOURCE_PATH=/apps/Devops/jenkins/workspace#【docker 镜像】【docker容器】【Dockerfile同目录下的jar名字[用它build生成image的jar]】【jenkins的workspace下的项目名称】#这里都以这个命名[微服务的话,每个服务都以ms-swapping这种格式命名]#注意统一名称!!!!!SERVER_NAME=swapping#容器id  [grep -w 全量匹配容器名] [awk 获取信息行的第一列,即容器ID]  [无论容器启动与否,都获取到]CID=$(docker ps -a | grep -w "$SERVER_NAME" | awk '{print $1}')#镜像id  [grep -w 全量匹配镜像名] [awk 获取信息行的第三列,即镜像ID]IID=$(docker images | grep -w "$SERVER_NAME" | awk '{print $3}')#源jar完整地址  [jenkins构建成功后,会在自己的workspace/项目/target 下生成maven构建成功的jar包,获取jar包名的完整路径]#例如:/apps/Devops/jenkins/workspace/swapping/target/swapping-0.0.1-SNAPSHOT.jarSOURCE_JAR_PATH=$(find "$SOURCE_PATH/$SERVER_NAME/target/"  -name "*$SERVER_NAME*.jar" )DATE=`date +%Y%m%d%H%M%S`#=====================================================================================#============================对原本已存在的jar进行备份================================#=====================================================================================# 备份function backup(){    if [ -f "$BASE_PATH/$SERVER_NAME.jar" ]; then        echo "=========================>>>>>>>$SERVER_NAME.jar 备份..."            mv $BASE_PATH/$SERVER_NAME.jar $BASE_PATH/backup/$SERVER_NAME-$DATE.jar        echo "=========================>>>>>>>备份老的 $SERVER_NAME.jar 完成"    else        echo "=========================>>>>>>>老的$BASE_PATH/$SERVER_NAME.jar不存在,跳过备份"    fi}#=====================================================================================#=========================移动最新源jar包到Dockerfile所在目录=========================#===================================================================================== # 查找源jar文件名,进行重命名,最后将源文件移动到项目环境function transfer(){                    echo "=========================>>>>>>>源文件完整地址为 $SOURCE_JAR_PATH"            echo "=========================>>>>>>>重命名源文件"        mv $SOURCE_JAR_PATH  $SOURCE_PATH/$SERVER_NAME/target/$SERVER_NAME.jar    echo "=========================>>>>>>>最新构建代码 $SOURCE_PATH/$SERVER_NAME/target/$SERVER_NAME.jar 迁移至 $BASE_PATH"        cp $SOURCE_PATH/$SERVER_NAME/target/$SERVER_NAME.jar $BASE_PATH     echo "=========================>>>>>>>迁移完成Success"} #=====================================================================================#==================================构建最新镜像=======================================#===================================================================================== # 构建docker镜像function build(){        #无论镜像存在与否,都停止原容器服务,并移除原容器服务    echo "=========================>>>>>>>停止$SERVER_NAME容器,CID=$CID"    docker stop $CID    echo "=========================>>>>>>>移除$SERVER_NAME容器,CID=$CID"    docker rm $CID    #无论如何,都去构建新的镜像    if [ -n "$IID" ]; then        echo "=========================>>>>>>>存在$SERVER_NAME镜像,IID=$IID"        echo "=========================>>>>>>>移除老的$SERVER_NAME镜像,IID=$IID"        docker rmi $IID        echo "=========================>>>>>>>构建新的$SERVER_NAME镜像,开始---->"        cd $BASE_PATH        docker build -t $SERVER_NAME .        echo "=========================>>>>>>>构建新的$SERVER_NAME镜像,完成---->"    else        echo "=========================>>>>>>>不存在$SERVER_NAME镜像,构建新的镜像,开始--->"        cd $BASE_PATH        docker build -t $SERVER_NAME .        echo "=========================>>>>>>>构建新的$SERVER_NAME镜像,结束--->"    fi} #=====================================================================================#==============================运行docker容器,启动服务===============================#=====================================================================================# 运行docker容器function run(){    backup    transfer    build    docker run --name $SERVER_NAME -itd --net=host -v /etc/localtime:/etc/localtime:ro  -v /etc/timezone:/etc/timezone:ro  $SERVER_NAME } #入口run
View Code

 【本命令的详解:】

 

 

 

 

 3.9  最后,点击应用,并保存

 

 

 

 4.GitLab配置

下来就是GitLab这边的配置!!

 

4.1 打开gitlab,并进入要自动部署的项目,点击左侧setting

 

 4.2 Integration  选择集成,开始配置webhook

将从jenkins获取到的URL和Token,填写在此处

【根据自己的需求,勾选webhook的触发事件都有哪些】

 

 

最后点击添加

添加后,即可在下方看到刚刚添加的webhook!!

 

然后即可点击Test,选择刚刚勾选的绑定的触发事件 ,即可回到jenkins查看测试效果!!!

 

对于 上面勾选的权限,测试结果如下,即代表成功!!!

 

 

对于未勾选的 权限 接口,点击测试

 未授权的接口 测试 是这个结果!!!!!

 

 

 

5.回到jenkins,查看测试效果,或自行进行构建事件

再次回到Jenkins,开始进行构建!!!

 

下方显示出构建的任务进度,可以点击进去,查看控制台输出

 

 

 

 

 

 

 

 

 

 

 

===========================================================================================

至此,spring boot在jenkins+gitlab+docker的自动化部署,完成!!!

 

转载于:https://www.cnblogs.com/sxdcgaq8080/p/10569906.html

你可能感兴趣的文章
C++中调用python函数
查看>>
Nomad添加acl认证
查看>>
“TI门外汉”网路知识笔记一 OSI参考模型
查看>>
你不需要jQuery(五)
查看>>
DatanodeDescriptor说明
查看>>
ServlertContext
查看>>
eclipse编辑器生命周期事件监听
查看>>
Python WOL/WakeOnLan/网络唤醒数据包发送工具
查看>>
sizeof(long)
查看>>
pxe网络启动和GHOST网克
查看>>
ftp 虚拟用户的使用(安装)
查看>>
2.5-saltstack配置apache
查看>>
http状态响应码大全(复制转帖)
查看>>
django数据库中的时间格式与页面渲染出来的时间格式不一致的处理
查看>>
Python学习笔记
查看>>
java String
查看>>
renhook的使用
查看>>
Linux学习笔记(十二)--命令学习(用户创建、删除等)
查看>>
DOCKER windows 7 详细安装教程
查看>>
养眼美女绿色壁纸
查看>>