jenkins+git+maven 增量部署思路以及相关脚本
之前通过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脚本进行文件的替换代码见下,如果使用过程中有问题或者优化建议欢迎留言讨论。
- # !/bin/sh
- # auth andre.yang
- dir=$1
- workspace=$2
- cd $workspace
- str=$(sed -n '1,1p' $workspace/version.txt)
- cd $dir
- cat ${str#*:}.log change.log > change2.log
- mv change2.log ${str#*:}.log
- sort ${str#*:}.log |uniq > ${str#*:}_2.log
- mv ${str#*:}_2.log ${str#*:}.log
python 脚本见下,注非本人原创在征得同事允许后上传
------------------------------------------------------------------------------华丽的分割线----------------------------------------------------------------
- # coding=utf-8
- # !/usr/bin/env python
- # __author__ = 'Caroline'
- import os
- import glob
- import shutil
- import time
- # 用于查找指定文件的路径
- def find_path(filedir, filename):
- file_path = []
- for root, dirs, files in os.walk(filedir):
- if filename in files:
- path = root + '/' + filename
- file_path.append(path)
- if len(file_path) == 1:
- return file_path[0]
- else:
- return file_path
- # 对应项目的changelog目录
- CHANGES_DIR = '/var/lib/jenkins/changes/tools'
- # 最新的代码包目录,代码包目录命名要求,
- # 路径中不能出现相同的目录名
- # 即 /var/lib/jenkins/changes/changes/tools/monkey不允许
- # 存在相同的目录名字changes
- SOURCE_DIR = '/var/lib/jenkins/changes/tools/monkey'
- #存放源码的目录的名称
- #切记!!!!和需要替换的源码的目录级别要相同
- SOURCE_DIR_NAME = 'monkey'
- # 需要替换的代码包目录
- # 路径中不能出现相同的目录名
- # 即 /var/lib/jenkins/changes/changes/tools/monkey不允许
- # 存在相同的目录名字changes
- #切记!!!!和需要替换的源码的目录级别要相同
- TARGET_DIR = '/home/test/ROOT'
- # 获取需要删除的文件
- delete_files = glob.glob('%s/D*.log' % CHANGES_DIR)
- # 读取删除文件内容
- delete_lines = []
- if len(delete_files) == 1:
- f = open(delete_files[0], "r")
- delete_lines = f.readlines()
- else:
- raise Exception('Dfile is not one')
- # 解析文件内容,获取要删除的文件名字
- d_names = []
- for line in delete_lines:
- # 解析line,获取文件名
- file_names = line[:-1].split('/')
- d_name = file_names[-1]
- d_names.append(d_name)
- # 获取需要替换的文件
- modify_files = glob.glob('%s/[!D]*.log' % CHANGES_DIR)
- # 读取文件内容
- modify_lines = []
- if len(modify_files) == 1:
- f = open(modify_files[0], "r")
- modify_lines = f.readlines()
- else:
- raise Exception('Mfile is not one')
- # 解析文件内容,获取要替换的文件名字
- m_names = []
- for line in modify_lines:
- # 解析line,获取文件名
- file_names = line[:-1].split('/')
- m_name = file_names[-1]
- m_names.append(m_name)
- # step1:替换修改的文件
- # 创建目录用于存放修改前的文件
- modify_dir = '%s/modify' % CHANGES_DIR
- os.mkdir(modify_dir)
- # 记录替换的文件
- f = open('%s/modify.log' % modify_dir, 'w')
- # 开始进行文件替换,并将未替换的文件记录下来,作为增加的文件增加,新建一个列表用于存储替换的文件名字
- m_file_names = []
- for root, dirs, files in os.walk(TARGET_DIR):
- for file in files :
- if file in m_names:
- # 拼接路径
- full_path = root + '/' + file
- # 把修改的文件的全路径写入到modifylogs文件中
- f.write('modify : %s\n' % full_path)
- # mv原来的文件到modify文件夹中
- shutil.move(full_path, '%s/%s' %(modify_dir, file))
- #更换文件,首先遍历,获取新文件路径
- new_file_path = find_path(SOURCE_DIR, file)
- #将新文件换到对应target的目录下
- shutil.copy(new_file_path, full_path)
- #将该file的名字,写入到m_file_names列表
- m_file_names.append(file)
- # 将待添加的文件名字取出
- a_file_names = list(set(m_names) - set(m_file_names))
- print a_file_names
- # 获取在最新的代码包目录中这个文件的绝对路径
- for name in a_file_names:
- #需要增加的文件的绝对路径
- full_path = find_path(SOURCE_DIR, name)
- print full_path
- #截取该文件的上级路径
- file_dirs= full_path.split('/')
- #找到第一个sourcedirname,获取其索引
- num = file_dirs.index(SOURCE_DIR_NAME)
- #对列表进行切片,获取相对路径
- relative_path = '/'.join(file_dirs[(num+1):])
- #获取相对文件夹路径
- relative_dir_path = '/'.join(file_dirs[(num+1):-1])
- #需要增加至的绝对路径
- real_path = TARGET_DIR + '/' + relative_path
- #需要增加至的绝对文件夹路径
- real_dir_path = TARGET_DIR+ '/' + relative_dir_path
- #创建文件夹
- os.popen('mkdir -p %s' % real_dir_path)
- #记录增加文件的全路径
- f.write('add:%s -- %s \n' %(full_path, real_path))
- #copy 文件至指定位置
- shutil.copy(full_path, real_path)
- f.close()
- # step2:删除指定文件
- #创建目录用于存放删除的文件
- delete_dir = '%s/delete' % CHANGES_DIR
- os.mkdir(delete_dir)
- # 获取删除文件的全路径并删除
- f = open('%s/delete.log' % delete_dir, 'w')
- for root, dirs, files in os.walk(TARGET_DIR):
- for file in files:
- if file in d_names:
- # 拼接路径
- full_path = root + '/' + file
- # 把删除的文件的全路径写入到deletelogs文件中
- f.write('%s\n' % full_path)
- #将删除的文件转移到指定目录:
- new_path = '%s/%s' % (delete_dir, file)
- shutil.move(full_path, new_path)
- f.close()
- # step3:处理log文件
- # 最终将所有的log信息打包并加上时间戳
- # 根据时间戳定义压缩文件夹的名字
- log_dir_name = '%s/%s' % (CHANGES_DIR, time.strftime('%Y-%m-%d-%H-%M',time.localtime(time.time())))
- os.mkdir(log_dir_name)
- # 将modify的log文件转移至新文件夹内
- shutil.copytree(modify_dir, '%s/%s' % (log_dir_name, 'modify'))
- shutil.rmtree(modify_dir)
- # 将delete的log文件转移至新文件夹内
- shutil.copytree(delete_dir, '%s/%s' % (log_dir_name, 'delete'))
- shutil.rmtree(delete_dir)
- # 将文件夹里的后缀名为log的文件转移到新文件夹内
- shutil.move(delete_files[0], log_dir_name)
- shutil.move(modify_files[0], log_dir_name)
jenkins+git+maven 增量部署思路以及相关脚本的更多相关文章
- jenkins+git+maven搭建自动化部署项目环境
简介 折腾了两个晚上,趁着今晚比较有空,把jenkins+git+maven搭建自动化部署项目环境搭建的过程记录一下,这里我把github作为git的远程仓库(https://github.co ...
- Jenkins+Git+Maven构建并部署war包到tomcat
主要思路:1.jenkins从git中拉取项目源码:jenkins使用maven构建并将生成的war部署到tomcat容器下. 环境:Centos7.Maven3.5.3.git(单机) 安装Git ...
- Jenkins+Git+Maven构建并部署springboot(构建多模块中的单个模块)
主要思路:1.jenkins从git中拉取项目源码:jenkins使用maven构建并将生成的jar包通过shell脚本启动. 环境:环境:Centos7.Maven3.5.3.git(单机) 准备工 ...
- Jenkins+Git+Docker+K8s部署
准备工作 Jenkins已安装 Docker和K8s部署运行成功 代码管理工具使用Git 最近公司项目使用Jenkins+Git+Docker+K8s进行持续化构建部署,这里笔者整理了一下构建部署的相 ...
- centos 搭建jenkins+git+maven
git+maven+jenkins持续集成搭建 发布人:[李源] 2017-12-08 04:33:37 一.搭建说明 系统:centos 6.5 jdk:1.8.0_144 jenkins ...
- 服务器构建CentOS+Jenkins+Git+Maven之爬坑
ssh端口变更后,git如何访问远端中央代码库 参考来源: http://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin http://blog.csdn ...
- Jenkins + git + maven 安装
1.jenkins安装 sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo ...
- jenkins+git+maven
这个有参考:https://blog.csdn.net/xlgen157387/article/details/50353317 主要针对一些错误记录一下 1.如果要不想用系统的jdk等,可以在全局工 ...
- Windows版Jenkins+SVN+Maven自动化部署环境搭建【转】
前言 因今年公司新产品线较多,为了降低耦合,达到业务分离.重用,提高内部开发效率的目的,采用了基于服务组件.前后端分离的架构体系.与之前传统单应用架构相比,系统部署.配置更加复杂,为了能够频繁地将软件 ...
随机推荐
- 使用Windows命令行启动关闭服务(net,sc用法)
下面两个命令最好以管理员方式启动cmd窗口,否则出现权限问题. 1.net用于打开没有被禁用的服务, NET命令是功能强大的以命令行方式执行的工具. 它包含了管理网络环境.服务.用户.登陆大部分重要的 ...
- ClassNotFoundException和NoClassDeFoundError
ClassNotFoundException:反射时(类加载时)类名写错了(属于可捕获的异常) NoClassDeFoundError:编译时依赖的类(jar包)在运行环境机器中不存在(属于无法处理的 ...
- Spring重温(一)--Spring快速入门
1.spring官网(https://repo.spring.io)下载依赖jar. 2.配置spring环境时还需要commons-logging相关jar. 3.打开eclise创建一个工程,并将 ...
- basic.js
1.数组 ① 删除内容 Array.prototype.removeByValue = function(val) { for(var i=0; i<this.length; i++) { if ...
- Hadoop环境准备
1. 集群简介 HADOOP集群具体来说包含两个集群:HDFS集群和YARN集群,两者逻辑上分离,但物理上常在一起. HDFS集群负责海量数据的存储,集群中的角色主要有: NameNode.DataN ...
- Solr 7.7.0 部署到Tomcat
第一步 1.Solr 解压后server/solr-webapp下一个webapp目录,它就是Solr的Web项目,把它复制到tomcat的webapps目录下并改名为solr # 进入Solr的se ...
- SFTP远程连接服务器上传下载文件-qt4.8.0-vs2010编译器-项目实例
本项目仅测试远程连接服务器,支持上传,下载文件,更多功能开发请看API自行开发. 环境:win7系统,Qt4.8.0版本,vs2010编译器 qt4.8.0-vs2010编译器项目实例下载地址:CSD ...
- Queue和BlockingQueue的使用以及使用BlockingQueue实现生产者-消费者
Java提供了两种新的容器类型:Queue和BlockingQueue. Queue用于保存一组等待处理的元素.它提供了几种实现,包括:ConcurrentLinkedQueue,这是一个先进先出的并 ...
- 20165231 2017-2018-2 《Java程序设计》第6周学习总结
教材学习内容总结 第八章 String类 Java专门提供了用来处理字符序列的String类. String类在java.lang包中,由于java.lang包中的类被默认引入,因此程序可以直接使用S ...
- Dubbo--基于Zookeeper服务与Spring集成
Dubbo Zookeeper Spring 1.部署dubbo服务管理中心 2.搭建dubbo服务环境 2.1 pom.xml 依赖 2.2 log4j.properties 日志打印 3.api ...