0%

由于最近拓展视野,发现了splinter和 Hp Utf 两个东西,很想去学习,基于django的自动发版系统又不能半途而非(实属自我约束,不能太没有恒心)。故而,更新日志的就不用django的web方式了,因为我尝试了很久,python本来就不熟悉,困难那是重重的,直接上python提供的mysql接口更新git的log日志。以下是代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import time,datetime

#import config as config
from pygit2 import Repository
from pygit2 import GIT_SORT_NONE,GIT_SORT_TOPOLOGICAL, GIT_SORT_REVERSE,GIT_SORT_TIME
import mysql.connector

# noinspection PyArgumentList
cnx = mysql.connector.connect(user='root',password='我的密码吧告诉你',host='127.0.0.1',database='gitlog')
argslog=[]
cursor = cnx.cursor()
cursor.execute("SELECT UNIX_TIMESTAMP(commit_date) FROM gitlog.gitlog_commits order by id desc limit 1")

dataNewtime=1357006210
for (datetimelog) in cursor:
if (datetimelog[0]!=''):
dataNewtime= datetimelog[0]
idnum=0
for (i) in cursor:
idnum=i[0]

repo = Repository('/home/chaosbom/git/ArhasMK/.git')

for commit in repo.walk(repo.head.target,GIT_SORT_TOPOLOGICAL | GIT_SORT_REVERSE):

if(commit.author.time > dataNewtime):
#print (commit.author.time, dataNewtime, commit.author.time > dataNewtime, commit.author.time - dataNewtime)
logtmp=[]
idnum += 1
logtmp.append(idnum)
logtmp.append(commit.author.name)
logtmp.append(commit.message)
logtmp.append('')
logtmp.append(commit.tree.id.hex)
logtmp.append(datetime.datetime.utcfromtimestamp(commit.author.time).strftime("%Y-%m-%d %H:%M:%S"))
<!-- more -->
print(logtmp)
argslog.append(logtmp)
#log=(commit.author.name,commit.message,commit.tree.id.hex,datetime.datetime.utcfromtimestamp(commit.author.time).strftime("%Y-%m-%d %H:%M:%S"))
##以下两句放在for循环中的时候,会增加海量的数据。是由于argslog的不断变大,递增处理。
##但是如果直接在for循环中传递logtmp给cursor,又包参数不足的错误。此处留个大大的疑问。
add_log="INSERT INTO gitlog.gitlog_commits (id,author,message,commitsFile,nvalue,commit_date) VALUES (%s,%s,%s,%s,%s,%s)"
cursor.executemany(add_log, argslog)
cursor.close()
cnx.commit()
cnx.close()

在mysqlworkbench里执行了下统计:

1
SELECT count(author) FROM gitlog.gitlog_commits;

得到:’4438’条记录

1、Django throws django.core.exceptions.AppRegistryNotReady: Models aren’t loaded yet
或者报错:
django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

1
2
3
4
import django 
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "PROJECT_NAME.settings")
django.setup()
from APP_NAME.models import *

PROJECT_NAME,是自己django项目名

2016-02-16 18:16:32

2、分时系统。把处理机的时间分为时间片,时间片分配给作业使用。片期内未完成则暂时中断等待下一轮分配,并把控制权交给其他作业使用。

3、操作系统功能:处理机管理、存储器(主存)管理、文件管理、作业管理、设备管理。

4、进程:关于某个数据集合的可并发、具备独立功能的执行过程,是操作系统进行资源分配和保护的基本单元。进程和进程之间具有制约关系,在关键点上需要互相等待或互通消息,可以并发执行以改进资源利用率。
每个进程有且只有一个PCB(process control block),是操作系统记录和刻画进程有关信息的数据结构,控管的主要依据。
进程可以进创建新的进程,PCB中有记录进程关系。
进程创建过程:申请空白PCB—>为新进程(含程序及数据、用户栈)分配资源(内存)—->初始化PCB—-进程插入就绪队列。

5、程序执行三种状态:
占用处理器,运行态;
等待某个事件发生,等待态(阻塞、睡眠);
等待条件已满足但未占用处理器,就绪态。

6、分页存储管理:作业地址空间和存储空间,用相同长度等分。即作业的一页对应物理的块或页框。页表记录了这种对应关系。

7、分段存储管理。作业的地址空间按照一定逻辑分段,如主程序段、子程序段、数据段、堆栈段。段内地址连续,段间不连续。段表记录了进程的逻辑到物理内存的映射关系。

8、虚拟存储器:辅助存储器空间,用于暂存主存中的程序和数据,自动实现本分装入和部分对换功能。大小与计算机地址结构及可用辅助存储器的容量。

9、I/O设备是计算机与外界进行信息交换的装置。设备管理中制程技术—缓冲技术,是解决CPU与外设之间速度不匹配的矛盾,提高CPU通过及外设之间的并行性能。

10、一次磁盘的IO操作时间由,柱面号、磁头号(扇面)、扇区号共同决定。

单位的应用是微信商城,若使用LD对商城进行性能测试,微信的鉴权是个大问题,除了让研发去掉鉴权的代码来测试外,LD自身提供的特性也可以达到录制的目的。下面简单介绍录制的方法和思路。

方法一:fiddler代理+手机代理录制

方法二:fiddler代理+微信开发者助手录制。

都需要fiddler中Tools—>Fiddler Options—>connections—>勾选“Allow remote computers to connect”,重启fiddler。
然后录制。

作为测试研发进阶的初级菜鸟,最近看公司研发写的工程代码,有些规则的命名,然不知道具体意义。以下内容来自网络。
PO(persistant object)持久对象
在o/r映射的时候出现的概念,如果没有o/r映射,就没有这个概念存在了.通常对应数据模型(数据库),本身还有部分业务逻辑的处理.可以看成是与数据库中的表相映射的java对象.最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合,只能存活在一个数据库连接中,断开连接即被销毁。
O/R映射:层是持久层的一个特例,它的数据模型是对象模型(Object),存储模型是关系模型(Relational),cmp和Hibernate是对象模型到关系模型之间转换的两种不同实现。
VO(value object)值对象
精确点讲它是业务对象,是存活在业务层的,是业务逻辑使用的,它存活的目的就是为数据提供一个生存的地方。
BO(business object)业务对象
从业务模型的角度看,见UML元件领域模型中的领域对象。封装业务逻辑的java对象,通过调用DAO方法,结合PO,VO进行业务操作。 主要作用是把业务逻辑封装为一个对象。这个对象可以包括一个或多个其它的对象。比如一个简历,有教育经历、工作经历、社会关系等等。 我们可以把教育经历对应一个PO,工作经历对应一个PO,社会关系对应一个PO。 建立一个对应简历的BO对象处理简历,每个BO包含这些PO。 这样处理业务逻辑时,我们就可以针对BO去处理。
POJO(plain ordinary java object)简单无规则java对象
纯的传统意义的java对象.就是说在一些Object/Relation Mapping工具中,能够做到维护数据库表记录的persisent object完全是一个符合Java Bean规范的纯Java对象,没有增加别的属性和方法.我的理解就是最基本的Java Bean,只有属性字段及setter和getter方法!.
DAO(data access object)数据访问对象
是sun的一个标准j2ee设计模式,这个模式中有个接口就是DAO,它负责持久层的操作.为业务层提供接口.此对象用于访问数据库.通常和PO结合使用,DAO中包含了各种数据库的操作方法.通过它的方法,结合PO对数据库进行相关的操作.夹在业务逻辑与数据库资源中间.配合VO,提供数据库的CRUD操作。
DTO (Data Transfer Object)数据传输对象
主要用于远程调用等需要大量传输对象的地方。
比如我们一张表有100个字段,那么对应的PO就有100个属性。
但是我们界面上只要显示10个字段,
客户端用WEB service来获取数据,没有必要把整个PO对象传递到客户端,
这时我们就可以用只有这10个属性的DTO来传递结果到客户端,这样也不会暴露服务端表结构.到达客户端以后,如果用这个对象来对应界面显示,那此时它的身份就转为VO。
TO(Transfer Object),数据传输对象
在应用程序不同tie(关系)之间传输的对象

分支管理
git pull origin A:B
git branch –set-upstream-to=origin/develop develop
实践:
拉取远程代码到本地:
git pull origin release/Mandy_final:Mandy_final
要更新代码,使用:git pull origin Mandy_final
提示“fatal: Couldn’t find remote ref Mandy_final”
不知道原因,假设git pull 分支的时候,origin 之后的分知名不是本地的,而是远端的。
验证假设:
git branch –set-upstream-to=origin/release/Mandy_final Mandy_final
git pull命令直接到代码
git pull origin Mandy_final还是之前提示。
因此我自动发版脚本中的拉取代码的前提是要保证本地分支名必须和远端分支名保持一致:

1
git pull origin `git status |awk '{print $4}'|head -1`

git fetch:相当于是从远程获取最新版本到本地,不会自动merge

1
2
3
Git fetch origin master
git log -p master..origin/master
git merge origin/master

git pull:相当于是从远程获取最新版本并merge到本地
执行分支拉取最好使用git fetch ,否则在多个分支当中切换会导致不必要的merge错误。

git branch -r
git branch -a
git checkout -b mybranch origin/mybranch

git status

/#清理本地分支(远程仓库已经不存在的分支)
git remote prune origin

阅读全文 »

参考:http://www.pygit2.org/install.html

依赖包:
Python 2.7, 3.2+ or PyPy 2.6+ (including the development headers)
Libgit2 v0.25.x
cffi 1.0+
six
tox (optional)

安装依赖包:

1
2
3
sudo apt-get install libssh2-1-dev
sudo apt-get install libgit2-dev
sudo apt-get install python-tox python-cffi python-six

安装:

1
2
3
4
5
6
wget https://github.com/libgit2/libgit2/archive/v0.25.0.tar.gz
tar xzf v0.25.0.tar.gz
cd libgit2-0.25.0/
cmake .
make
sudo make install

cmake .的时候会告诉你缺啥啥,缺啥装啥。

IE、chrome、firefox等按F12可以掉出它们自带的页面调试工具,作为测试当然不能非常精通在页面上修改样式,调试页面jsp,js,但是却可以很轻松的使用它来分析网页的性能优化项。

基础篇

现在的网络模式粗糙的理解,就是BS结构(客户/服务端),一个负责请求展现,一个负责响应提供内容。这个过程包括底层网络的三次握手,TCP/IP的通信巴拉巴拉的一些列低级的我们不需要了解过细的活动(大牛除外),这些活动浏览器会有记录。

客户端/服务器传输过程很多内容,可以阅读深入理解HTTP协议、HTTP协议原理分析

网络通信的链接四个基一步骤:
1、浏览器与服务器建立连接;这个建立链接,简单说通信双方需要相互确认对方的存在以及合法身份,所以会有TCP的3次握手
2、浏览器向服务器请求文档;简单理解就是url(统一资源定位符的英文缩写),资源定位符自然请求过去就是在请求文档咯,泪崩吧。
3 、服务器响应浏览器请求;把资源吐出来给浏览器,浏览器接收并显示。
4、 断开连接。

在客户端和服务端通信的过程中,还需要了解:
1、客户端请求方法,最常用的: GET,POST。get简单说,直接拿资源,服务器拿现货提供;post简单说,附带上请求信息去告诉服务器自己要拿的东西,服务器现炒现卖。
2、动态资源和静态资源:简单的说动态资源就是服务器上非现成的资源,如某商品的列表订单信息(有人买卖自然的变化的,需要实时去查);静态资源就是现成的,如各种css\html\js\jsp文件。
3、缓存。静态资源可以缓存来加快网络二次请求的响应速度。缓存也是可以在服务器上(至少apache可以)控制过期。
4、XHR(XMLHtmlRequest),一种结构化的对象,用于在后台与服务器交换数据。可理解为服务吐出来的动态资源的一种形式。

实践篇

以下,记录一次使用浏览器调试工具分析我们商城后台各类资源加载性能,发现问题,促成问题改善和优化。

发现问题

虽然是主打移动微信电商,但是商户的管理端使用的还是PC电脑,浏览器,每天测试商户后台,我有个习惯,就是使用chrome的第三方插件清理缓存(当然是关闭浏览器自动的清),一次发版前,产品+前端+后端一起把登陆主页给优化了,简单的说界面比上一个版本更好看,内容也更丰富。当然这个是优化项,没有提交给测试这边验证。但是……我发现这页面加载很久,开始因为是网络和测试服务器性能不行也没深究,但是多几次我就觉得不太对劲,F12打开一看,加载10s+了,这性能自然是不行的。然后反馈研发,推动修改。

分析问题

下面以另一个商品管理页面作为实例(写文章的时候还没修改),手动清空浏览器缓存,打开F12,刷新并访问首页。
非常明晰的时间加载曲线展现,如下图(仅示意):
这里写图片描述
图中显示了2个时间消耗大户都在800ms以上。
点击开文件的响应内容包含了若干object,都是按商品的productID分类的,这个数据是从后台数据库查询得到的动态数据(xhr),点开一个object的内容如下:

1
{"pId":5989,"name":"聚实惠测试商品01","status":"shelve_on","imgUrl":"http://×××××××××××.aliyuncs.com/sgc/200015/image/145c1974fdaa4a9f81d20614a4af1327.jpg","shopId":null,"inventory":1464,"maxPrice":1.11,"minPrice":1.11,"createdWhen":"2016-12-01 11:10:55","modifyWhen":null,"salesNum":0,"pv":2,"uv":2,"itemCatId":null,"shortDesc":"聚实惠测试商品01","salesLimited":null,"saleStartTime":null,"saleStartSeconds":null,"stockReduceType":null,"freightType":null,"shippingFee":null,"shippingTemplateId":null,"displayInventory":false,"displaySoldQty":false,"shareImg":null,"shareTitle":null,"shareContent":null,"imgs":null,"delSkuIds":null,"productCode":null,"modifyWhenDate":null,"productSizeTemplateId":null,"taxRate":null,"toInactive":false,"spec":null,"maxquto":121.00,"minquto":121.00,"onStatus":null,"offStatus":null,"selectedIds":null,"defaultImg":null,"indexCode":null,"selIds":null,"groupId":null,"sortNo":null,"skus":null,"querySelInType":null,"commissionRate":0.2000,"commissionTemplateId":null,"notQueryPids":null,"imgShape":null,"orderStatus":null,"oldStockType":null,"shelveOnWhen":null,"shelveOffWhen":null,"minFrontPrice":null,"minBackPrice":null,"maxFrontPrice":null,"maxBackPrice":null,"qrCodeUrl":"http://XXXXXXXX200015/product/productDetailPage?pId=","groupIds":null,"statusComments":"上架","rectImgUrl":"1abc808b34884fcbb78b187e533bfaa1.jpg","activityId":null,"activityUniqueId":null,"activityName":null,"fansQuantity":null,"fansCount":null,"activityStartTime":null,"activityEndSeconds":null,"activityLabel":null,"activityLabelStyle":null,"activityMinPrice":null,"activitySalesLimited":0,"activityRemark":null,"noticeActivityId":null,"noticeActivityUniqueId":null,"noticeActivityName":null,"noticeActivityStartTime":null,"noticeActivityEndSeconds":null,"noticeActivityLabel":null,"noticeActivityMinPrice":null,"noticeActivitySalesLimited":0,"groupActivityId":null,"groupActivityUniqueId":null,"groupActivityName":null,"groupActivityStartTime":null,"groupActivityEndSeconds":null,"groupActivityLabel":null,"groupActivityLabelStyle":null,"groupActivitySalesLimited":null,"groupActivityRemark":null,"fulfilActivityLadders":null,"fulfilActivityDiscountList":null,"fulfilActivityPointsList":null,"fulfilActivityCouponList":null,"crowdActivityLadders":null,"quantityLimited":0,"productGivePoints":null,"productSizeRowString":null,"productSizeRowData":[],"pids":null,"packageDiscountAmout":null,"imprestPrice":null,"imprestFrontPrice":null,"imprestBackPrice":null,"currentPrice":null,"crowdCurrentPersons":null,"crowdMaxPersons":null,"returnImprest":null,"payLimitHours":null,"showCartFlag":true}
阅读全文 »

重构前代码

代码关键字被批量替换。仅供参考。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
#!/bin/sh
sitesPath="/ggcall/sites/"
DATE=$(date +%Y%m%d%H%M)
softfile="/home/ggstar/Arhasgg/"
sitesbackup="/home/ggstar/sitesbackup/"
githome="/home/ggstar/Arhasgg/"
#设置环境变量
source /etc/profile
echo "请确认使用该命令,已经从git库拉取了最新的代码,使用了正确的分支"
cd $githome
echo "git分支名称:"+`git branch |awk '{print $4}'|head -3`
echo "编译工程,静默方式,过程如果报错会提示,提示需检查错误后重新编译!"
echo "默认gg-sdk-wx未编译,如更新需本地上传/home/ggstar/.m2/repository/com/gg/sdk/gg-sdk-wx/0.0.1/gg-sdk-wx-0.0.1.jar"
echo "依赖包编译"
cd $githome"gg-aggregator"
mvn -q -ff clean install

echo "编译gg-passport"
cd $githome"gg-passport"
mvn -q -ff clean install -P st
cd $githome"gg-openApi"
echo "编译gg-opanApi"
mvn -q -ff clean install -P st
echo "编译gg-imgr-webbent"
cd $githome"gg-imgr-webent"
mvn -q -ff clean install -P st
echo "编译gg-wm-webent"
cd $githome"gg-wm-webent"
mvn -q -ff clean install -P st
echo "编译gg-img-webent"
cd $githome"gg-img-webent"
mvn -q -ff clean install -P st
echo "编译gg-job-webent"
<!-- more -->
cd $githome"gg-job-webent"
mvn -q -ff clean install -P st
echo "编译gg-sn-webent"
cd $githome"gg-sn-webent"
mvn -q -ff clean install -P st
echo "编译gg-app-webent"
cd $githome"gg-app-webent"
mvn -q -ff clean install -P st
echo "编译gg-yum-webent"
cd $githome"gg-yum-webent"
mvn -q -ff clean install -P st
echo "编译发布完成"

#删除需要更新的原文件
if [ -f $softfile"gg-imgr-webent/target/gg-imgr-webent.war" ]; then
#echo "back-un--to--"$sitesbackup
#tar -zcf $sitesbackup"imgr"/$DATE.tar.gz -P $sitesPath"imgr/ROOT"
#echo "备份完成!"
echo "imgr update---------------------"
cd $sitesPath"imgr/ROOT"
rm -fr `ls $sitesPath"imgr/ROOT" -I shopInfo`
echo "删除完成!"
unzip -q $softfile"gg-imgr-webent/target/gg-imgr-webent.war" -d $sitesPath"imgr/ROOT"
echo "imgr解压完成!"
fi

if [ -f $softfile"gg-passport/target/gg-passport.war" ]; then

#echo "back-un-------------"
#tar -zcf $sitesbackup"passport"/$DATE.tar.gz -P $sitesPath"passport/ROOT"


echo "passport update---------------------"
cd $sitesPath"passport/ROOT"

rm -fr `ls $sitesPath"passport/ROOT" -I shopInfo`
echo "删除完成!"
unzip -q $softfile"gg-passport/target/gg-passport.war" -d $sitesPath"passport/ROOT"
echo "passport解压完成!"
fi

if [ -f $softfile"gg-job-webent/target/gg-job-webent.war" ]; then
#echo "back-un-------------"
#tar -zcf $sitesbackup"job"/$DATE.tar.gz -P $sitesPath"job/ROOT"

echo "job update------------"
cd $sitesPath"job/ROOT"
rm -fr `ls $sitesPath"job/ROOT" -I shopInfo`
echo "删除完成!"
unzip -q $softfile"gg-job-webent/target/gg-job-webent.war" -d $sitesPath"job/ROOT"
echo "job解压完成!"
fi

if [ -f $softfile"gg-wm-webent/target/gg-wm-webent.war" ]; then

#echo "back-un-------------"
#tar -zcf $sitesbackup"wm"/$DATE.tar.gz -P $sitesPath"wm/ROOT"

echo "wm update-----------------"
cd $sitesPath"wm/ROOT"
rm -fr `ls $sitesPath"wm/ROOT" -I shopInfo`
echo "删除完成!"
unzip -q $softfile"gg-wm-webent/target/gg-wm-webent.war" -d $sitesPath"wm/ROOT"
echo "wm解压完成!"
fi
#司南
if [ -f $softfile"gg-sn-webent/target/gg-sn-webent.war" ]; then

#echo "back-un-------------"
#tar -zcf $sitesbackup"sn"/$DATE.tar.gz -P $sitesPath"sn/ROOT"

echo "sn update-----------------"
cd $sitesPath"sn/ROOT"
rm -fr `ls $sitesPath"sn/ROOT" -I shopInfo`
echo "删除完成!"
unzip -q $softfile"gg-sn-webent/target/gg-sn-webent.war" -d $sitesPath"sn/ROOT"
echo "sn解压完成!"
fi

#img
if [ -f $softfile"gg-img-webent/target/gg-img-webent.war" ]; then

#echo "back-un-------------"
#tar -zcf $sitesbackup"img"/$DATE.tar.gz -P $sitesPath"img/ROOT"

echo "img update-----------------"
cd $sitesPath"img/ROOT"
rm -fr `ls $sitesPath"img/ROOT" -I shopInfo`
echo "删除完成!"
unzip -q $softfile"gg-img-webent/target/gg-img-webent.war" -d $sitesPath"img/ROOT"
echo "img解压完成!"
fi

#yum
if [ -f $softfile"gg-yum-webent/target/gg-yum-webent.war" ]; then
echo "yum update-----------------"
cd $sitesPath"yum/ROOT"
rm -fr `ls $sitesPath"yum/ROOT" -I shopInfo`
echo "删除完成!"
unzip -q $softfile"gg-yum-webent/target/gg-yum-webent.war" -d $sitesPath"yum/ROOT"
echo "yum解压完成!"
fi


#webapp
if [ -f $softfile"gg-app-webent/target/gg-app-webent.war" ]; then
echo "app update-----------------"
cd $sitesPath"app/ROOT"
rm -fr `ls $sitesPath"app/ROOT" -I shopInfo`
echo "删除完成!"
unzip -q $softfile"gg-app-webent/target/gg-app-webent.war" -d $sitesPath"app/ROOT"
echo "app解压完成!"
fi

#openApiAPI
if [ -f $softfile"gg-openApiApi/target/gg-openApi.war" ]; then
echo "openApi update-----------------"
cd $sitesPath"openApi/ROOT"
rm -fr `ls $sitesPath"openApi/ROOT" -I shopInfo`
echo "删除完成!"
unzip -q $softfile"gg-openApiApi/target/gg-openApi.war" -d $sitesPath"openApi/ROOT"
echo "openApiAPI解压完成!"
fi

#mock
#if [ -f $softfile"gg-mock-webent/target/gg-mock-webent.war" ]; then
#echo "mock update-----------------"
#cd $sitesPath"mock/ROOT"
#rm -fr `ls $sitesPath"mock/ROOT" -I shopInfo`
#echo "删除完成!"
#unzip -q $softfile"gg-mock-webent/target/gg-mock-webent.war" -d $sitesPath"mock/ROOT"
#echo "mock解压完成!"
#fi

#结束tomcat进程
kill -9 ${k}`ps -fe |grep tomcat |awk '{print $2}'|head -3`
#开启tomcat
cd /ggcall/servers/apache-tomcat-8.5.4-80/bin
./startup.sh
#log
#echo "Logs if ERROR show~~"
#tail -f /ggcall/servers/apache-tomcat-8.5.4-80/logs/catalina.out

重构后代码

代码当中还增加了rpc的编译和发布内容。脚本代码数明显降低。使用了若干新学技能。
包括shell的(流程控制while、if、awk命令、&&命令状态、let和expr语句执行代数运算、数组、定向>、nohub + &)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#!/bin/bash
githome="/home/ggstar/Arhasgg/"
sitesPath="/ggcall/sites/"
DATE=$(date +%Y%m%d%H%M)
softfile="/home/ggstar/Arhasgg/"
sitesbackup="/home/ggstar/sitesbackup/"

#设置环境变量
source /etc/profile

webents=(gg-aggregator gg-img-webent gg-wm-msger gg-app-webent gg-job-webent gg-openApi gg-wm-webent gg-yum-webent gg-imgr-webent gg-passport gg-sn-webent gg-imgr-rpc gg-yum-rpc)
longth=${#webents}
RPM=0

#git拉取代码
echo "请确认使用该命令,已经从git库拉取了最新的代码,使用了正确的分支"
cd ${githome}
#echo "git分支名称:"+`git branch |awk '{print $4}'|head -3`
echo "git分支名称:"+`git status |awk '{print $4}' |head -1`
echo "拉取当前分支代码"
git pull origin `git status |awk '{print $4}'|head -1|awk -F 'in/' '{print $2}'`
echo "编译工程,静默方式,过程如果报错会提示,提示需检查错误后重新编译!"

while [ $RPM -lt $longth ] && [ $? -eq 0 ]
do
cd ${githome}${webents[$RPM]} && echo "编译${webents[$RPM]}"
mvn -q -ff clean install -P st && echo "${webents[$RPM]}编译完成!"
let RPM++
done

#更新rpc
longthpub=`expr $longth - 3`
RPM=$longthpub
while [ $RPM -lt $longth ] && [ $? -eq 0 ]
do
if [ -f $softfile"${webents[$RPM]}/target/${webents[$RPM]}.jar" ]; then
webentname=`echo ${webents[$RPM]}`
siteName=`echo ${webentname#*-}`
#判断是否存在webent,不存在则新建
if [ ! -d $sitesPath${siteName} ]; then
mkdir -p $sitesPath${siteName}
#echo ${webents[$RPM]}|awk -F '-' '{print $2}'
fi
#执行代码更新操作
echo "$siteName更新---------------------"
kill -9 ${k}`ps -fe |grep $siteName |awk '{print $2}'|head -2`
cd $sitesPath${siteName} && rm -fr `ls $sitesPath${siteName}` && echo "删除完成!"
cp -r $softfile"${webents[$RPM]}/target/lib" $softfile"${webents[$RPM]}/target/${webents[$RPM]}.jar" $sitesPath${siteName} && echo "$siteName解压完成!"
sleep 10
nohup java -Xms512m -Xmx1024m -jar ${webents[$RPM]}.jar > ${webents[$RPM]}".log" &
fi
let RPM++
done

#更新webent
RPM=1
longthpub=`expr $longth - 2`
while [ $RPM -lt $longthpub ]
do
if [ -f $softfile"${webents[$RPM]}/target/${webents[$RPM]}.war" ]; then
siteName=`echo ${webents[$RPM]}|awk -F '-' '{print $2}'`
#判断是否存在webent,不存在则新建
if [ ! -d $sitesPath${siteName}"/ROOT" ]; then
mkdir -p $sitesPath${siteName}"/ROOT"
#echo ${webents[$RPM]}|awk -F '-' '{print $2}'
fi
#执行代码更新操作
echo "$siteName 更新---------------------"
cd $sitesPath${siteName}"/ROOT" && rm -fr `ls $sitesPath${siteName}"/ROOT" -I shopInfo` && echo "删除完成!"
unzip -q $softfile"${webents[$RPM]}/target/${webents[$RPM]}.war" -d $sitesPath${siteName}"/ROOT" && echo "$siteName解压完成!"

fi
let RPM++
done
#结束tomcat进程
kill -9 ${k}`ps -fe |grep tomcat |awk '{print $2}'|head -3`
#开启tomcat
cd /ggcall/servers/apache-tomcat-8.5.4-80/bin
./startup.sh