之前通过jenkins+Git+maven这种方式打war包然后scp到测试环境使用,但是现在项目组要求打增量包,即只部署修改的文件和配置文件。

核心问题:如何获取到变动的文件???

前置条件:初始化部署需要人工进行

操作步骤:

1、配置git从远程端check代码。

2、使用maven打包

3、把class目录和war包传到部署服务器(因为我们打包和执行deploy的服务器分开的,如果是一台不需要改操作)

4、最核心的一步,记录改变的文件的日志。使用的git自带的git diff --stat 命令把修改的文件的名字写到change.log中

PS:原图中名为test.sh的shell脚本的源码在最下边

5、新增的文件和修改的通过第四步可以提取name出来但是删除的不可以,所以还要对已经部署但是删除的文件进行检测

6、现在我们的测试部署端就已经得到新增+删除的log了,在另服务器端使用Python脚本进行文件的替换代码见下,如果使用过程中有问题或者优化建议欢迎留言讨论。

  1. # !/bin/sh
  2. # auth andre.yang
  3. dir=$1
  4. workspace=$2
  5. cd $workspace
  6. str=$(sed -n '1,1p' $workspace/version.txt)
  7. cd $dir
  8. cat ${str#*:}.log change.log > change2.log
  9. mv change2.log ${str#*:}.log
  10. sort ${str#*:}.log |uniq > ${str#*:}_2.log
  11. mv ${str#*:}_2.log ${str#*:}.log

python 脚本见下,注非本人原创在征得同事允许后上传

------------------------------------------------------------------------------华丽的分割线----------------------------------------------------------------


  1. # coding=utf-8
  2. # !/usr/bin/env python
  3. # __author__ = 'Caroline'
  4. import os
  5. import glob
  6. import shutil
  7. import time
  8. # 用于查找指定文件的路径
  9. def find_path(filedir, filename):
  10. file_path = []
  11. for root, dirs, files in os.walk(filedir):
  12. if filename in files:
  13. path = root + '/' + filename
  14. file_path.append(path)
  15. if len(file_path) == 1:
  16. return file_path[0]
  17. else:
  18. return file_path
  19. # 对应项目的changelog目录
  20. CHANGES_DIR = '/var/lib/jenkins/changes/tools'
  21. # 最新的代码包目录,代码包目录命名要求,
  22. # 路径中不能出现相同的目录名
  23. # 即 /var/lib/jenkins/changes/changes/tools/monkey不允许
  24. # 存在相同的目录名字changes
  25. SOURCE_DIR = '/var/lib/jenkins/changes/tools/monkey'
  26. #存放源码的目录的名称
  27. #切记!!!!和需要替换的源码的目录级别要相同
  28. SOURCE_DIR_NAME = 'monkey'
  29. # 需要替换的代码包目录
  30. # 路径中不能出现相同的目录名
  31. # 即 /var/lib/jenkins/changes/changes/tools/monkey不允许
  32. # 存在相同的目录名字changes
  33. #切记!!!!和需要替换的源码的目录级别要相同
  34. TARGET_DIR = '/home/test/ROOT'
  35. # 获取需要删除的文件
  36. delete_files = glob.glob('%s/D*.log' % CHANGES_DIR)
  37. # 读取删除文件内容
  38. delete_lines = []
  39. if len(delete_files) == 1:
  40. f = open(delete_files[0], "r")
  41. delete_lines = f.readlines()
  42. else:
  43. raise Exception('Dfile is not one')
  44. # 解析文件内容,获取要删除的文件名字
  45. d_names = []
  46. for line in delete_lines:
  47. # 解析line,获取文件名
  48. file_names = line[:-1].split('/')
  49. d_name = file_names[-1]
  50. d_names.append(d_name)
  51. # 获取需要替换的文件
  52. modify_files = glob.glob('%s/[!D]*.log' % CHANGES_DIR)
  53. # 读取文件内容
  54. modify_lines = []
  55. if len(modify_files) == 1:
  56. f = open(modify_files[0], "r")
  57. modify_lines = f.readlines()
  58. else:
  59. raise Exception('Mfile is not one')
  60. # 解析文件内容,获取要替换的文件名字
  61. m_names = []
  62. for line in modify_lines:
  63. # 解析line,获取文件名
  64. file_names = line[:-1].split('/')
  65. m_name = file_names[-1]
  66. m_names.append(m_name)
  67. # step1:替换修改的文件
  68. # 创建目录用于存放修改前的文件
  69. modify_dir = '%s/modify' % CHANGES_DIR
  70. os.mkdir(modify_dir)
  71. # 记录替换的文件
  72. f = open('%s/modify.log' % modify_dir, 'w')
  73. # 开始进行文件替换,并将未替换的文件记录下来,作为增加的文件增加,新建一个列表用于存储替换的文件名字
  74. m_file_names = []
  75. for root, dirs, files in os.walk(TARGET_DIR):
  76. for file in files :
  77. if file in m_names:
  78. # 拼接路径
  79. full_path = root + '/' + file
  80. # 把修改的文件的全路径写入到modifylogs文件中
  81. f.write('modify : %s\n' % full_path)
  82. # mv原来的文件到modify文件夹中
  83. shutil.move(full_path, '%s/%s' %(modify_dir, file))
  84. #更换文件,首先遍历,获取新文件路径
  85. new_file_path = find_path(SOURCE_DIR, file)
  86. #将新文件换到对应target的目录下
  87. shutil.copy(new_file_path, full_path)
  88. #将该file的名字,写入到m_file_names列表
  89. m_file_names.append(file)
  90. # 将待添加的文件名字取出
  91. a_file_names = list(set(m_names) - set(m_file_names))
  92. print a_file_names
  93. # 获取在最新的代码包目录中这个文件的绝对路径
  94. for name in a_file_names:
  95. #需要增加的文件的绝对路径
  96. full_path = find_path(SOURCE_DIR, name)
  97. print full_path
  98. #截取该文件的上级路径
  99. file_dirs= full_path.split('/')
  100. #找到第一个sourcedirname,获取其索引
  101. num = file_dirs.index(SOURCE_DIR_NAME)
  102. #对列表进行切片,获取相对路径
  103. relative_path = '/'.join(file_dirs[(num+1):])
  104. #获取相对文件夹路径
  105. relative_dir_path = '/'.join(file_dirs[(num+1):-1])
  106. #需要增加至的绝对路径
  107. real_path = TARGET_DIR + '/' + relative_path
  108. #需要增加至的绝对文件夹路径
  109. real_dir_path = TARGET_DIR+ '/' + relative_dir_path
  110. #创建文件夹
  111. os.popen('mkdir -p %s' % real_dir_path)
  112. #记录增加文件的全路径
  113. f.write('add:%s --  %s \n' %(full_path, real_path))
  114. #copy 文件至指定位置
  115. shutil.copy(full_path, real_path)
  116. f.close()
  117. # step2:删除指定文件
  118. #创建目录用于存放删除的文件
  119. delete_dir = '%s/delete' % CHANGES_DIR
  120. os.mkdir(delete_dir)
  121. # 获取删除文件的全路径并删除
  122. f = open('%s/delete.log' % delete_dir, 'w')
  123. for root, dirs, files in os.walk(TARGET_DIR):
  124. for file in files:
  125. if file in d_names:
  126. # 拼接路径
  127. full_path = root + '/' + file
  128. # 把删除的文件的全路径写入到deletelogs文件中
  129. f.write('%s\n' % full_path)
  130. #将删除的文件转移到指定目录:
  131. new_path = '%s/%s' % (delete_dir, file)
  132. shutil.move(full_path, new_path)
  133. f.close()
  134. # step3:处理log文件
  135. # 最终将所有的log信息打包并加上时间戳
  136. # 根据时间戳定义压缩文件夹的名字
  137. log_dir_name = '%s/%s' % (CHANGES_DIR, time.strftime('%Y-%m-%d-%H-%M',time.localtime(time.time())))
  138. os.mkdir(log_dir_name)
  139. # 将modify的log文件转移至新文件夹内
  140. shutil.copytree(modify_dir, '%s/%s' % (log_dir_name, 'modify'))
  141. shutil.rmtree(modify_dir)
  142. # 将delete的log文件转移至新文件夹内
  143. shutil.copytree(delete_dir, '%s/%s' % (log_dir_name, 'delete'))
  144. shutil.rmtree(delete_dir)
  145. # 将文件夹里的后缀名为log的文件转移到新文件夹内
  146. shutil.move(delete_files[0], log_dir_name)
  147. shutil.move(modify_files[0], log_dir_name)

jenkins+git+maven 增量部署思路以及相关脚本的更多相关文章

  1. jenkins+git+maven搭建自动化部署项目环境

    简介    折腾了两个晚上,趁着今晚比较有空,把jenkins+git+maven搭建自动化部署项目环境搭建的过程记录一下,这里我把github作为git的远程仓库(https://github.co ...

  2. Jenkins+Git+Maven构建并部署war包到tomcat

    主要思路:1.jenkins从git中拉取项目源码:jenkins使用maven构建并将生成的war部署到tomcat容器下. 环境:Centos7.Maven3.5.3.git(单机) 安装Git ...

  3. Jenkins+Git+Maven构建并部署springboot(构建多模块中的单个模块)

    主要思路:1.jenkins从git中拉取项目源码:jenkins使用maven构建并将生成的jar包通过shell脚本启动. 环境:环境:Centos7.Maven3.5.3.git(单机) 准备工 ...

  4. Jenkins+Git+Docker+K8s部署

    准备工作 Jenkins已安装 Docker和K8s部署运行成功 代码管理工具使用Git 最近公司项目使用Jenkins+Git+Docker+K8s进行持续化构建部署,这里笔者整理了一下构建部署的相 ...

  5. centos 搭建jenkins+git+maven

      git+maven+jenkins持续集成搭建 发布人:[李源]  2017-12-08 04:33:37   一.搭建说明 系统:centos 6.5 jdk:1.8.0_144 jenkins ...

  6. 服务器构建CentOS+Jenkins+Git+Maven之爬坑

    ssh端口变更后,git如何访问远端中央代码库 参考来源: http://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin http://blog.csdn ...

  7. Jenkins + git + maven 安装

    1.jenkins安装 sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo ...

  8. jenkins+git+maven

    这个有参考:https://blog.csdn.net/xlgen157387/article/details/50353317 主要针对一些错误记录一下 1.如果要不想用系统的jdk等,可以在全局工 ...

  9. Windows版Jenkins+SVN+Maven自动化部署环境搭建【转】

    前言 因今年公司新产品线较多,为了降低耦合,达到业务分离.重用,提高内部开发效率的目的,采用了基于服务组件.前后端分离的架构体系.与之前传统单应用架构相比,系统部署.配置更加复杂,为了能够频繁地将软件 ...

随机推荐

  1. Javascript框架 - ExtJs - 类

    类(ExtJs Class) preparation! 我用的是ext-4.2,解压后会得到以下文件 学习要用到的文件很少,现在保留以下文件和整个文件夹,然后删除其它文件并保持目录结构.本页面底部有提 ...

  2. mybatis resultType resultMap 区别

    resultType 就是返回的类型 resultMap 返回的是一个结果集,这个结果集一般是用过resultMap节点来配置的,相应的type一般是一个Model. https://blog.csd ...

  3. Faster_RCNN 3.模型准备(下)

    总结自论文:Faster_RCNN,与Pytorch代码: 本文主要介绍代码第二部分:model/ , 首先分析一些主要理论操作,然后在代码分析里详细介绍其具体实现. 首先在参考文章的基础上进一步详细 ...

  4. 组合权限查询 SQL,UniGUI

    组合权限查询 SQL,UniGUI: name ,View, New, Edit, Dele      表 获取 name 的 授权. 项目         1       0       0    ...

  5. python3+selenium入门06-浏览器操作

    WebDriver主要提供元素操作的方法,但也提供了一些关于浏览器操作的方法,比如设置浏览器大小,浏览器前进,后退,刷新等 设置浏览器大小 有时候需要设置浏览器大小,比如访问收集网页,设置浏览器大小跟 ...

  6. Python3学习笔记30-datetime模块

    datetime是Python处理日期和时间的标准库 获取当前的日期和时间 from datetime import datetime now = datetime.now() print(now) ...

  7. VC常用小知识

    (1) 如何通过代码获得应用程序主窗口的 指针?主窗口的 指针保存在CWinThread::m_pMainWnd中,调用AfxGetMainWnd实现.AfxGetMainWnd() ->Sho ...

  8. 【算法】狄克斯特拉算法(Dijkstra’s algorithm)

    狄克斯特拉算法(Dijkstra’s algorithm) 找出最快的路径使用算法——狄克斯特拉算法(Dijkstra’s algorithm). 使用狄克斯特拉算法 步骤 (1) 找出最便宜的节点, ...

  9. python学习第1天

    01 cpu 内存 硬盘 操作系统 CPU:中央处理器,相当于人大脑. 飞机 内存:临时存储数据. 8g,16g, 高铁 1,成本高. 2,断电即消失. 硬盘:长期存储大量的数据. 1T 512G等等 ...

  10. Laravel 5.2响应--后台back()->with('提示信息'),前台为什么收不到?

    ### 今天遇到了个小问题,想后台判断数据的时候,返回前台,然后弹窗提示没有数据 但是前台点了有返回,咩有提示信息 ### 网上找了很9⃣️,关于这方面的都是属于验证时候的相关问题,但是我这个跟验证没 ...