运用支配是开拓、测试、上线必须面对的一个过程,尤其是微做事架构的涌现,运维支配从单体的支配逐渐分开出,并且越显繁芜。
然而,抛开多措辞,多环境,集群,分布式的支配之外。就单单谈论增量支配和全量支配
1.增量和全量支配支配,除却项目初始化支配,最空想的情形即为:新版本变动哪些内容则更新哪些内容
1.1 增量支配1.1.1 增量支配简介
增量支配一样平常指在每次支配过程中首先提取当前版本和即将支配版本之间的增量(包括代码、可实行文件或者配置等),并在支配过程中仅更新增量部分。
1.1.2 常见支配流程利用代码管理工具(SVN、GIT 等)提取两个版本之间的增量,并结合其他方面的增量变革。按照增量部分制订详细的支配办法,编写支配脚本,并准备增量支配包(包括稠浊代码等)。分发和支配增量支配包到已经运行上一版本的目标环境,完成系统的版本升级。1.1.3 增量支配优点支配速率快。每次只对增量部分进行更新,缩短支配韶光减少变革量。减少对全体系统的变革幅度,有些配置内容是不须要每次都更新迭代的提高安全性。由于每次支队增量进行更新,避免全部代码的透露1.1.4 增量支配缺陷增量支配 若存在其他外在支配环境依赖,则降落支配效率增量支配不像支配环境多的情形下,对可重复性哀求高增量支配对回滚操作变得不友好1.2 如何选择增量还是全量现有的自动化支配,大多数都 全量支配,但全量支配也有一些弊端。但可以通过一些策略进行筛选:搜索公众号:MarkerHub,关注回答[vue]获取前后端入门教程!
对付当代系统中绝大部分状态无关的支配单元(运用、模块,微做事等),全量支配一样平常应是最优的选择。而状态干系的支配单元(数据库等)则依然适宜增量支配逻辑。
2.进入主题前面讲述了一些关于增量和全量支配的情形。接下来讲述如何通过 shell 脚本结合 Git Log 进行增量支配
2.1 条件环境Java 项目Maven 进行管理Git 作为代码仓库2.2 shell 脚本shell 新手,写得不足完美,轻喷。
2.2.1 全体 shell 脚本的模块Git 环境准备Maven 对欲构建项目进行编译创建增量支配文件夹检索项目 target 目录通过 git diff 检索两次 commit 之间的差异,再通过检索将对应文件拷贝到 “增量文件夹” 中2.2.2 Git 环境准备# git环境if [[ ! -d ".git" ]]; then ECHO error: please init Git Repository exit 1;fiif [[ ! -z ${branch} ]]; then git checkout ${branch}fi# 获取默认commit-hashif [[ -z "$begin_hash" ]] && [[ -z "$end_hash" ]] ; then for p in $(git log --pretty=oneline -2) ; do if [[ ${#p} -eq 40 ]]; then if [[ -z ${begin_hash} ]]; then begin_hash=${p} else end_hash=${p} break fi fi donefiis_begin_has=false# 是否当前最新commitif [[ $(git log --pretty=oneline -1) == ${begin_hash} ]]; then is_begin_has=truefi# 非当前最新分支commit,回滚到原始版本,可能当时maven原始配置不支持compile或会涌现构建失落败(如:利用本地仓/私有仓库等)if [[ ${is_begin_has} = false ]]; then project_path=$(pwd) project_name=${project_path##/} cd .. build_project_name=${project_name}_build_temp_project if [[ ! -d ${build_project_name} ]]; then mkdir ${build_project_name} fi \cp -rf ${project_name}/. ${build_project_name} cd ${build_project_name} git reset --hard ${begin_hash}fi
2.2.2.1 校验是否 git 仓库代码
if [[ ! -d ".git" ]]; then ECHO error: please init Git Repository exit 1;fi
2.2.2.2 检讨是否须要切换分支
if [[ ! -z ${branch} ]]; then git checkout ${branch}fi
2.2.2.3 是否须要设置默认构建的 commit 值
若实行构建时,没给添加 --begin_hash= 和 --end_hash= 进行赋值,则默认利用最新的两次 commit 来进行增量支配。
通过 git log --pretty=oneline -2 获取最近两次 commit 的 hash
# 获取默认commit-hashif [[ -z "$begin_hash" ]] && [[ -z "$end_hash" ]] ; then for p in $(git log --pretty=oneline -2) ; do if [[ ${#p} -eq 40 ]]; then if [[ -z ${begin_hash} ]]; then begin_hash=${p} else end_hash=${p} break fi fi donefi复制代码
2.2.2.4 校验传参的 begin_hash 值是否为当前分支最新 commit hash
若非当前分支最新 commit hash,则须要回滚到对应 commit,进行项目构建编译
if [[ $(git log --pretty=oneline -1) == ${begin_hash} ]]; then is_begin_has=truefi复制代码
2.2.2.5 若 begin_hash 非当前最新 commit hash
若传参 begin_hash 的值非当前最新 commit hash。则须要回滚到对应 commit 进行构建编译。搜索"大众号:MarkerHub,关注回答[vue]获取前后端入门教程!
if [[ ${is_begin_has} = false ]]; then project_path=$(pwd) project_name=${project_path##/} cd .. build_project_name=${project_name}_build_temp_project if [[ ! -d ${build_project_name} ]]; then mkdir ${build_project_name} fi \cp -rf ${project_name}/. ${build_project_name} cd ${build_project_name} git reset --hard ${begin_hash}fi复制代码
2.2.3 Maven 对欲构建项目进行编译
对项目进行编译,天生对应 class 文件以及干系配置文件
mvn clean compile -q -DskipTest复制代码
若历史版本中存在利用本地仓库,而 maven 中没有配置好的情形可以重新配置, 通过 scope 以及 systemPath 进行引入,如:
<dependency> <groupId>cn.catalpaflat</groupId> <artifactId>core</artifactId> <version>1.0.0</version> <scope>system</scope> <systemPath>${project.basedir}/lib/core-1.0.jar</systemPath></dependency>复制代码
2.2.4 创建增量支配文件夹
为了防止增量文件夹被删除或者被 commit 到 git 仓库,可以统一化到一个目录中,并通过 .gitignore 对其进行忽略。可以比对每次增量支配的差异
build_path=build-path/current_date=`date +%Y%m%d%H%m%s`if [[ ! -d "$build_path$current_date" ]]; then mkdir -p ${build_path}${current_date}else rm -rf ${build_path}${current_date} mkdir -p ${build_path}${current_date}fi复制代码
2.2.5 检索项目 target 目录
若项目为 Maven 项目,并且是 Java 项目,由于存在 Maven 多模块情形,须要检索每个模块下的编译后的代码路径,用于后续进行 class 等文件的拷贝。
default_target_paths=()default_java_file=javamodule_index=0# 检索当前项目是否maven多模块开拓,递归检索,并设置其编译后的代码位置(暂只供应了java类型)obtain_module(){ for module in ` cat ./pom.xml | grep '<module>' | awk -F '>' '{print $2}' | awk -F '<' '{print $1}' ` do cd ${module} if [[ ! -d "/pom.xml" ]]; then module_exist=`cat ./pom.xml | grep '<module>' | awk -F '>' '{print $2}' | awk -F '<' '{print $1}'` if [[ -z ${module_exist} ]]; then if [[ ! -d "/target" ]]; then if [[ -z $1 ]]; then default_target_paths[module_index]=${module}/target/classes else default_target_paths[module_index]=$1/${module}/target/classes fi ((module_index++)) fi else if [[ -z $1 ]]; then obtain_module ${module} else obtain_module $1/${module} fi fi fi cd .. done}obtain_module复制代码
2.2.6 检索并拷贝变更文件到增量文件夹git diff --name-only 排查两次 commit 之间文件差异并将 begin_hash 的 commit 编译后的代码拷贝到增量文件夹中,以备后续打包进行支配
# 通过git diff --name-only实现两次commit之间文件差异,并且将begin_hash的代码进行编译后,将差异的文件拷贝到“增量文件夹”中,以备后续进行增量支配for file_path in $(git diff --name-only ${begin_hash} ${end_hash}) ; do package_path=${file_path%/} file_name=${file_path##/} file_type=${file_name##.}# 文件所在校验文件夹是否创建 if [[ ${package_path} != . ]]; then if [[ ! -d "./${build_path}${current_date}/$package_path" ]] ; then mkdir -p ./${build_path}${current_date}/${package_path} fi fi# 是否java if [[ ${file_type} = ${default_java_file} ]]; then module_path=${package_path##java} file_class_name=${file_name%.} module_type=${package_path%%/}# 排查在哪个maven模块路径下 for default_target_path in ${default_target_paths[@]}; do target_module_path=$(echo ${default_target_path} | awk -F '/target/' '{print $1}') file_target_module_path=$(echo ${package_path} | awk -F '/src/' '{print $1}') file_target_package_path=$(echo ${package_path} | awk -F '/src/main/java/' '{print $2}') default_module_type=${default_target_path%%/} if [[ ${target_module_path} = ${file_target_module_path} ]]; then # 排查到对应maven模块的target目录,进行cp操作 cp -afx ${default_target_path}/${file_target_package_path}/${file_class_name} ./${build_path}${current_date}/${package_path} fi done else # 非java文件,直接拷贝文件到对应目录下 if [[ ${package_path} != . ]]; then if [[ ! -d "./${build_path}${current_date}/$package_path" ]] ; then mkdir -p ./${build_path}${current_date}/${package_path} fi else package_path=${package_path%/} fi cp -afx ${file_path} ./${build_path}${current_date}/${package_path} fidone
源码直通车!
!
!
:https://github.com/CatalpaFlat/build-maven-project-shell
到此为止,1.0 版本的简陋版本初步完成,目测可以利用,哈哈哈哈
(完)