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

需求:

1.已经启动了jenkins【https://www.cnblogs.com/sxdcgaq8080/p/10489369.html

2.已经启动了gitlab【https://www.cnblogs.com/sxdcgaq8080/p/10484576.html

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

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

需要了解的:

  1. 1.webhook网络钩子
  2.  
  3. 可以看成是一个callback 回调方法
  4. 本回调方法核心即包含:
  5. 触发条件+可供触发的URL+密码(可选)
  6. 触发条件为:pushmergePR(即 New Pull Request)等等git操作,
  7. 比如你提交一个push操作,就会触发URL请求,会以POST请求去请求这个URL
  8.  
  9. 除此以外,你还可以自己指定这个POST请求的数据格式。(JSONx-www-form-urlencoded等)。
  1. 2.webhookgitlab端的
  2.  
  3. 触发webhook的条件,可以自行配置,都是本地对gitlabgit操作
  4.  
  5. 触发后去请求的URL地址,是Jenkins提供的。也就是触发后是去请求Jenkins
  1. 3.而实现代码从gitlabjenkins到自动部署,webhook就是gitlabjenkins之间的关键点。
  2.  
  3. 后续会先配置jenkins,以获取到URLToken,拿着这两个东西去gitlab配置webhook,即可。
  4.  
  5. 同时,webhook本身还会有很多的触发条件可以勾选。后续步骤可见!

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

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

地址:https://www.cnblogs.com/sxdcgaq8080/p/10571718.html

2.jenkins全局安全配置

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

取消勾选CSRF

原因:

  1. webhooksjenkins配合使用时提示:HTTPStatus403-Novalidcrumbwasincludedintherequest,这是因为jenkinshttp请求头部中放置了一个名为.crumbtoken。在使用了反向代理,并且在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项目,可以去看:https://www.cnblogs.com/sxdcgaq8080/p/10577252.html

【如果此处添加地址后报错,或者Jenkins构建报错:Please make sure you have the correct access rights and the repository exists.去看这篇:https://www.cnblogs.com/sxdcgaq8080/p/10577241.html

3.4 Build Triggers 构建触发器的配置

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

记录URL

  1. http://192.168.92.130:9980/project/swapping

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

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

记录Token

  1. 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命令:

  1. SERVER_NAME_1=swapping
  2. echo "=========================>>>>>>>工作空间WORKSPACE的地址:$WORKSPACE "
  3. cd $WORKSPACE
  4.  
  5. echo "=========================>>>>>>>进入工作空间WORKSPACE,清除工作空间中原项目的工作空间$SERVER_NAME_1 "
  6. rm -rf $SERVER_NAME_1
  7.  
  8. echo "=========================>>>>>>>清除工作空间中原项目的工作空间$SERVER_NAME_1 ......成功success"

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

3.7 Build 构建的配置

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

因此,配置

  1. clean package

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

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

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

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

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

shell命令如下:

  1. #=====================================================================================
  2. #=================================定义初始化变量======================================
  3. #=====================================================================================
  4.  
  5. #操作/项目路径(Dockerfile存放的路劲)
  6. BASE_PATH=/apps/swapping
  7.  
  8. # jenkins构建好的源jar路径
  9. SOURCE_PATH=/apps/Devops/jenkins/workspace
  10.  
  11. #【docker 镜像】【docker容器】【Dockerfile同目录下的jar名字[用它build生成image的jar]】【jenkins的workspace下的项目名称】
  12. #这里都以这个命名[微服务的话,每个服务都以ms-swapping这种格式命名]
  13. #注意统一名称!!!!!
  14. SERVER_NAME=swapping
  15.  
  16. #容器id [grep -w 全量匹配容器名] [awk 获取信息行的第一列,即容器ID] [无论容器启动与否,都获取到]
  17. CID=$(docker ps -a | grep -w "$SERVER_NAME" | awk '{print $1}')
  18.  
  19. #镜像id [grep -w 全量匹配镜像名] [awk 获取信息行的第三列,即镜像ID]
  20. IID=$(docker images | grep -w "$SERVER_NAME" | awk '{print $3}')
  21.  
  22. #源jar完整地址 [jenkins构建成功后,会在自己的workspace/项目/target 下生成maven构建成功的jar包,获取jar包名的完整路径]
  23. #例如:/apps/Devops/jenkins/workspace/swapping/target/swapping-0.0.1-SNAPSHOT.jar
  24. SOURCE_JAR_PATH=$(find "$SOURCE_PATH/$SERVER_NAME/target/" -name "*$SERVER_NAME*.jar" )
  25.  
  26. DATE=`date +%Y%m%d%H%M%S`
  27.  
  28. #=====================================================================================
  29. #============================对原本已存在的jar进行备份================================
  30. #=====================================================================================
  31.  
  32. # 备份
  33. function backup(){
  34. if [ -f "$BASE_PATH/$SERVER_NAME.jar" ]; then
  35. echo "=========================>>>>>>>$SERVER_NAME.jar 备份..."
  36. mv $BASE_PATH/$SERVER_NAME.jar $BASE_PATH/backup/$SERVER_NAME-$DATE.jar
  37. echo "=========================>>>>>>>备份老的 $SERVER_NAME.jar 完成"
  38.  
  39. else
  40. echo "=========================>>>>>>>老的$BASE_PATH/$SERVER_NAME.jar不存在,跳过备份"
  41. fi
  42. }
  43.  
  44. #=====================================================================================
  45. #=========================移动最新源jar包到Dockerfile所在目录=========================
  46. #=====================================================================================
  47.  
  48. # 查找源jar文件名,进行重命名,最后将源文件移动到项目环境
  49. function transfer(){
  50.  
  51. echo "=========================>>>>>>>源文件完整地址为 $SOURCE_JAR_PATH"
  52.  
  53. echo "=========================>>>>>>>重命名源文件"
  54. mv $SOURCE_JAR_PATH $SOURCE_PATH/$SERVER_NAME/target/$SERVER_NAME.jar
  55.  
  56. echo "=========================>>>>>>>最新构建代码 $SOURCE_PATH/$SERVER_NAME/target/$SERVER_NAME.jar 迁移至 $BASE_PATH"
  57. cp $SOURCE_PATH/$SERVER_NAME/target/$SERVER_NAME.jar $BASE_PATH
  58.  
  59. echo "=========================>>>>>>>迁移完成Success"
  60.  
  61. }
  62.  
  63. #=====================================================================================
  64. #==================================构建最新镜像=======================================
  65. #=====================================================================================
  66.  
  67. # 构建docker镜像
  68. function build(){
  69.  
  70. #无论镜像存在与否,都停止原容器服务,并移除原容器服务
  71. echo "=========================>>>>>>>停止$SERVER_NAME容器,CID=$CID"
  72. docker stop $CID
  73.  
  74. echo "=========================>>>>>>>移除$SERVER_NAME容器,CID=$CID"
  75. docker rm $CID
  76.  
  77. #无论如何,都去构建新的镜像
  78. if [ -n "$IID" ]; then
  79. echo "=========================>>>>>>>存在$SERVER_NAME镜像,IID=$IID"
  80.  
  81. echo "=========================>>>>>>>移除老的$SERVER_NAME镜像,IID=$IID"
  82. docker rmi $IID
  83.  
  84. echo "=========================>>>>>>>构建新的$SERVER_NAME镜像,开始---->"
  85. cd $BASE_PATH
  86. docker build -t $SERVER_NAME .
  87. echo "=========================>>>>>>>构建新的$SERVER_NAME镜像,完成---->"
  88.  
  89. else
  90. echo "=========================>>>>>>>不存在$SERVER_NAME镜像,构建新的镜像,开始--->"
  91.  
  92. cd $BASE_PATH
  93. docker build -t $SERVER_NAME .
  94. echo "=========================>>>>>>>构建新的$SERVER_NAME镜像,结束--->"
  95. fi
  96. }
  97.  
  98. #=====================================================================================
  99. #==============================运行docker容器,启动服务===============================
  100. #=====================================================================================
  101.  
  102. # 运行docker容器
  103. function run(){
  104. backup
  105. transfer
  106. build
  107.  
  108. docker run --name $SERVER_NAME -itd --net=host -v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro $SERVER_NAME
  109.  
  110. }
  111.  
  112. #入口
  113. run

【本命令的详解:https://www.cnblogs.com/sxdcgaq8080/p/10599166.html

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的自动化部署,完成!!!

【Devops】【docker】【CI/CD】3.Jenkins+GitLab+docker+springboot 实现自动化部署的更多相关文章

  1. Devops、CI\CD、Jenkins

    Devops DevOps对应用程序发布的影响 在很多企业中,应用程序发布是一项涉及多个团队.压力很大.风险很高的活动.然而在具备DevOps能力的组织中,应用程序发布的风险很低,原因如下 [2] : ...

  2. CI Weekly #6 | 再谈 Docker / CI / CD 实践经验

    CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成.持续交付,持续部署.自动化测试. DevOps 等实践教程.工具与资源,以及一些工程师文化相关的程序员 Ti ...

  3. Docker / CI / CD

    CI Weekly #6 | 再谈 Docker / CI / CD 实践经验   CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成.持续交付,持续部署.自动 ...

  4. Azure Data Factory(三)集成 Azure Devops 实现CI/CD

    一,引言 由于上一节文章内容过长,无法分享Azure Data Factory 的持续集成,持续发布.今天将着重介绍一下在使用 Azure DevOps Pipeline 发布,自动进行持续集成,并且 ...

  5. AWS DevOps – 配合Jenkins和CodeDeploy实现代码自动化部署

    AWS DevOps – 配合Jenkins和CodeDeploy实现代码自动化部署 Amazon ElastiCache 连接至 Redis 节点 通过 AWS Command Line Inter ...

  6. 持续集成之⑤:jenkins结合脚本实现代码自动化部署及一键回滚至上一版本

    持续集成之⑤:jenkins结合脚本实现代码自动化部署及一键回滚至上一版本 一:本文通过jenkins调用shell脚本的的方式完成从Git服务器获取代码.打包.部署到web服务器.将web服务器从负 ...

  7. jenkins结合脚本实现代码自动化部署及一键回滚至上一版本

    持续集成之⑤:jenkins结合脚本实现代码自动化部署及一键回滚至上一版本 一:本文通过jenkins调用shell脚本的的方式完成从Git服务器获取代码.打包.部署到web服务器.将web服务器从负 ...

  8. 【Devops】【docker】【CI/CD】Jenkins源代码管理 添加gitlab项目地址,报错Failed to connect to repository : Error performing command: ls-remote -h git@192.168.92.130:8090/root/swapping.git HEAD

    Jenkins源代码管理 添加gitlab项目地址 报错如下: Failed to connect to repository : Error performing command: ls-remot ...

  9. k8s Gitlab CI/CD 之自动编译Docker镜像并推送到指定的Registry

    环境介绍: 说明 节点 ip 系统 Gitlab Server git.ds.com 10.0.1.179 CentOS 7.5.1804 Gitlab Runner   10.0.1.178 Cen ...

随机推荐

  1. Python_oldboy_自动化运维之路_paramiko,mysql(十二)

    本节内容: paramiko mysql 1.paramiko http://www.cnblogs.com/wupeiqi/articles/5095821.html paramiko是一个模块,s ...

  2. fedroa20中将ssh,ssl升级到当前最新版本

    Fedroa20下手工安装openssh-server 本例以Fedroa20为例,需要下载:zlib-1.2.8.tar.openssl-1.0.2e.tar. openssh-7.1p1.tar. ...

  3. javaweb笔记三

    //写了注解,就不用在web.xml里进行注册@WebServlet(urlPatterns="/my",name="my",loadOnStartup=1,i ...

  4. Little-endian和Big-endian

    谈到字节序的问题,必然牵涉到两大CPU派系.那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU.PowerPC系列采用big endian方式存储数据,而x86系列则采用l ...

  5. Java编程的逻辑 (27) - 剖析包装类 (中)

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  6. vSphere Web Client 6.5 如何上传ISO文件

    vSphere Web Client 6.5 如何上传ISO文件? 1,先开启SSH功能. WEB登陆管理端,选中一台主机,配置-安全配置文件-服务编辑-SSH项-起动. 2,用SFTP上传ISO文件 ...

  7. CSS------制作一个带+-的input框

    如图: 代码:(div和input之间要连续写在一起,不能换行) <div style="font-size:36px;margin-top:30px"> <di ...

  8. spring过滤器

    什么是过滤器 Spring 中不能处理用户请求,但可以用来提供过滤作用的一种Servlet规范.在请求进入容器之后,还未进入Servlet之前进行预处理,并且在请求结束返回给前端这之间进行后期处理.具 ...

  9. 纯css滚动视差

    1.何为滚动视差 视差滚动(Parallax Scrolling)是指让多层背景以不同的速度移动,形成立体的运动效果,带来非常出色的视觉体验. 作为网页设计的热点趋势,越来越多的网站应用了这项技术.效 ...

  10. ServletContextListener作用

    ServletContext 被 Servlet 程序用来与 Web 容器通信.例如写日志,转发请求.每一个 Web 应用程序含有一个Context,被Web应用内的各个程序共享.因为Context可 ...