================================================================================================================================================html
需求:nginx
1.已经启动了jenkins【http://www.javashuo.com/article/p-xsubxatg-bc.html】git
2.已经启动了gitlab【http://www.javashuo.com/article/p-uwmcuwun-z.html】web
3.jenkins须要按照上面步骤,已经肯定maven插件和Git插件和GitLab插件和GitLab hook插件和Maven Integration插件和Publish Over SSH插件已经成功安装【Git插件在第一篇初始化启动,推荐安装的、其余几个插件是在第一篇末尾安装的】spring
================================================================================================================================================docker
须要了解的:shell
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自己还会有不少的触发条件能够勾选。后续步骤可见!
=================================================================正文开始====================================================================================apache
地址:http://www.javashuo.com/article/p-tduxaslh-z.html安全
进入系统管理 ------> 全局安全配置服务器
取消勾选CSRF
缘由:
webhooks与jenkins配合使用时提示:HTTPStatus403-Novalidcrumbwasincludedintherequest,这是由于jenkins在http请求头部中放置了一个名为.crumb的token。在使用了反向代理,而且在jenkins设置中勾选了“防止跨站点请求伪造(Prevent Cross Site Request Forgery exploits)”以后此token会被转发服务器apache/nginx认为是不合法头部而去掉。致使跳转失败。
【注意,本名称通常和项目名称一致,由于本名称会在jenkins工做空间下生成目录,相似于IDEA或Ecplise的工做空间的概念】
【因此,通常状况下,保证本名称=项目名称=docker镜像名称=docker容器名称 这样能尽量的减轻jenkins配置的shell命令的复杂性!从而造成必定的规范!!】
选择构建一个Maven项目【由于是spring boot的服务】
自由输入
【内网推荐使用Http地址去clone项目】
【分别使用SSH和HTTP取clone项目,能够去看:http://www.javashuo.com/article/p-tqkcvnur-cn.html】
【若是此处添加地址后报错,或者Jenkins构建报错:Please make sure you have the correct access rights and the repository exists.去看这篇:http://www.javashuo.com/article/p-xqaizlzw-bu.html】
【构建触发器中配置,会获取到文章开始提到的URL和Token,这两个东西须要记录下来,供gitlab配置webhook使用】
记录URL
http://192.168.92.130:9980/project/swapping
URL和Token都须要填写到GitLab中,去配置webhooks!!!
点击高级后,最下方能够点击生成Token
记录Token
6b2eb2c3a9d1d2f64c73784bf30a4cda
【本处,配置前一步须要作的事情是:清理swapping即本项目在jenkins的workspace中的历史文件夹】
【在本步骤配置时,你能够不用知道WORKSPACE具体的地址在哪里,由于下方有连接能够查看到当前jenkins中有哪些可用的变量供你使用】
【默认WORKSPACE地址:/var/jenkins_home/workspace】
【固然,若是你jenkins是docker启动的,而且挂载了目录在宿主机,那你在宿主机也是能够看到的】
【注意:本处选择是是,执行shell,则表示本处配置的shell命令,是默认在jenkins容器中执行的,而不是在宿主机上】
能够查看可用的全局变量
前一步要作的shell命令:
SERVER_NAME_1=swapping
echo "=========================>>>>>>>工做空间WORKSPACE的地址:$WORKSPACE "
cd $WORKSPACE
echo "=========================>>>>>>>进入工做空间WORKSPACE,清除工做空间中原项目的工做空间$SERVER_NAME_1 "
rm -rf $SERVER_NAME_1
echo "=========================>>>>>>>清除工做空间中原项目的工做空间$SERVER_NAME_1 ......成功success"
【注意:本处的SERVER_NAME_1=swapping 是配置的项目的名称】
jenkins构建项目,本处是以maven插件实现的。
所以,配置
clean package
【本处选择,只在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.jar
SOURCE_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
【本命令的详解:http://www.javashuo.com/article/p-rixjpvge-ba.html】
下来就是GitLab这边的配置!!
将从jenkins获取到的URL和Token,填写在此处
【根据本身的需求,勾选webhook的触发事件都有哪些】
最后点击添加
添加后,便可在下方看到刚刚添加的webhook!!
而后便可点击Test,选择刚刚勾选的绑定的触发事件 ,便可回到jenkins查看测试效果!!!
对于 上面勾选的权限,测试结果以下,即表明成功!!!
对于未勾选的 权限 接口,点击测试
未受权的接口 测试 是这个结果!!!!!
再次回到Jenkins,开始进行构建!!!
下方显示出构建的任务进度,能够点击进去,查看控制台输出
===========================================================================================
至此,spring boot在jenkins+gitlab+docker的自动化部署,完成!!!