🌓

写在前面:公司代码发布体系总结

本人是测试人员,包括我在内,团队中有2名测试,整个研发不含测试大概10名(后台前端)。除了负责测试工作,还兼任负责发布公司测试环境及生产环境的代码。

代码环境及架构

公司所属行业为微信电商,使用java流行的MVC框架(这个我还不是很懂,不知道用了Spring哪些东西),这个了解过,只是并不深入,可以参考我的另一篇入门摘抄的java web基础。言归正传:
后台编程语言:java、UI框架kendo ui
web容器:tomcat
微信端:js、html、vue、css、jsp等
代码管理:git
构建工具:maven
部署操作系统:CentOS7
数据库:MySQL
其他数据库或工具:Redis、Memche、RPC、activemq、阿里云sso
桌面开发工具:eclipse

代码发布的主要流程

Created with Raphaël 2.1.0 研发编码/修改 发版到测试环境 测试确认 发版到生产环境 yes no

流程中两次发版目前都是执行我手动写的脚本。

Created with Raphaël 2.1.0 发版需求 git pull代码 maven编译构建 发布代码到tomcat 重启tomcat 开始测试

当然git由于有分支管理,发布的代码需要根据实际情况进行切换。这里git的分支管理就不再赘述。

由于手工发版实属重复劳动,后来约定定时测试环境每日定时发版2次,一次是中午12点10分,一次是晚上7点30.使用Linux的crontab。解放后的双手就是生产力。

1
2
3
crontab -e #编辑任务,进入文本编辑窗口,输入以下内容。两个脚本分别是拉取代/构建maven项目和发版代码用
10 12 * * 1-5 bash ~/mvn.sh && bash ~/updateSites.sh
30 19 * * 1-5 bash ~/mvn.sh && bash ~/updateSites.sh

PS:此处有坑一个,mvn.sh和updateSites.sh中存在git和mvn这两个非系统自带命令,使用crontab定时运行会缺乏环境变量,导致不能执行。解决办法:在脚本中添加:source /etc/profile。

生产环境的代码严格执行测试环境的代码为基准,所以发布的代码直接从tomcat的webent下面打包,唯一的不同是执行打包的时候会讲配置文件替换为生产。配置文件在代码库中做了统一的管理。
Created with Raphaël 2.1.0 发起发版任务 配置文件check 配置文件替换 代码打包 sftp方式拉取代码包 备份源代码发布代码包 发布代码包 上线回归测试

阅读全文

Ubuntu密码正确,一直处于登录界面

if you had used “apt-get update”….the new update contains some bugs for nvidia drivers….To slove:1.get the nvidia software 1sudo dpkg -l |grep nvidia 123rc nvidia-304 ...

阅读全文

基于git maven的自动构建系统系列一

前言受《分布式自动化版本发布系统》启发,决定对我们公司现有的shell脚本发版进行升级。业余时间研究,主要达到以下目的: 前二个做完,可以了解python的一些基本语法数据类型,把更新记录写入到数据库便于日常查看。第三个,续用当前测试环境发布代码的shell脚本。 python3.5 and mysql5.7mysql5.7 install参考:官网安装方法...

阅读全文

linux shell 基础整理

特殊变量

变 量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。 $/# 传递给脚本或函数的参数个数。 $/* 传递给脚本或函数的所有参数。 $@ 传递给脚本或函数的所有参数。被双引号(” “)包含时,与 $/* 稍有不同,下面将会讲到。 $? 上个命令的退出状态,或函数的返回值。 $$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。

转义字符

转义字符 含义 \ 反斜杠 \a 警报,响铃 \b 退格(删除键) \f 换页(FF),将当前位置移到下页开头 \n 换行 \r 回车 \t 水平制表符(tab键) \v 垂直制表符

变量替换

变量替换可以根据变量的状态(是否为空、是否定义等)来改变它的值。
转义字符 含义 ${var} 变量本来的值 ${var:-word} 如果变量 var 为空或已被删除(unset),那么返回 word,但不改变 var 的值。 ${var:=word} 如果变量 var 为空或已被删除(unset),那么返回 word,并将 var 的值设置为 word。 ${var:?message} 如果变量 var 为空或已被删除(unset),那么将消息 message 送到标准错误输出,可以用来检测变量 var 是否可以被正常赋值。若此替换出现在Shell脚本中,那么脚本将停止运行。 ${var:+word} 如果变量 var 被定义,那么返回 word,但不改变 var 的值。

Shell 传递参数

在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
参数处理 说明 $/# 传递到脚本的参数个数 $/* 以一个单字符串显示所有向脚本传递的参数。如”$/*”用「”」括起来的情况、以”1、$2…n”的形式输出所有参数。跟0,表示执行脚本自己的名称。 $$ 脚本运行的当前进程ID号 $! 后台运行的最后一个进程的ID号 $@ 与∗相同,但是使用时加引号,并在引号中返回每个参数。如”@”用「”」括起来的情况、以”1”“2” … “$n” 的形式输出所有参数。 $- 显示Shell使用的当前选项,与set命令功能相同。 $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

$/* 与 $@ 区别:
相同点:都是引用所有参数。
不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 ” /* ” 等价于 “1 2 3”(传递了一个参数),而 “@” 等价于 “1” “2” “3”(传递了三个参数)。

shell数组

数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小。与大部分编程语言类似,数组元素的下标由0开始。

shell运算符

文件测试运算符

文件测试运算符用于检测 Unix 文件的各种属性。

属性检测描述如下:
操作符 说明 举例 -d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。 -f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。 -k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。 -p file 检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。 -u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。 -g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。 -r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。 -w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。 -x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。 -s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。 -e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。

PS:SUID 是 Set User ID, SGID 是 Set Group ID的意思。设置了suid的程序文件,在用户执行该程序时,用户的权限是该程序文件属主的权限。例如程序文件的属主是root,那么执行该程序的用户就将暂时获得root账户的权限。sgid与suid类似,只是执行程序时获得的是文件属组的权限。

阅读全文

Java模拟计算器

一开始懂一点SWING界面皮毛,打算使用SWING绘制出了计算器的界面,花了大概2个下班业余时间,一点一点开始摸索,知道SWING界面布局的基本原理。然后开始按照教材中讲解的过程去实现,结果发现界面根本不是那么做出来的。在网上找到了java的源代码,开始研究阅读和抄写编译。墨迹一周有如下收获。1、JFrame是整个界面的底层,所有行为都给予它;2、任何界面元...

阅读全文

Java控制台五子棋编码学习

目录主要经验游戏描述参考的是《疯狂Java实战演义》——杨恩雄(文字版)中第一章内容。 Java源代码GobangGame.java123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616...

阅读全文

Java Web基础

参考来源:http://www.xuebuyuan.com/2153333.htm

1.Action/Service/DAO简介:

Action是管理业务(Service)调度和管理跳转的。

Service是管理具体的功能的。

Action只负责管理,而Service负责实施。

DAO只完成增删改查,虽然可以1-n,n-n,1-1关联,模糊、动态、子查询都可以。但是无论多么复杂的查询,dao只是封装增删改查。
至于增删查改如何去实现一个功能,dao是不管的。

总结这三者,通过例子来解释:

Action像是服务员,顾客点什么菜,菜上给几号桌,都是ta的职责;

Service是厨师,action送来的菜单上的菜全是ta做的;

Dao是厨房的小工,和原材料打交道的事情全是ta管。

相互关系是,小工(dao)的工作是要满足厨师(service)的要求,厨师要满足服务员(action)转达的客户(页面用户)的要求,服务员自然就是为客户服务喽。

现在最基本的分层方式,结合了SSH架构。Model层就是对应的数据库表的实体类。Dao层是使用了hibernate连接数据库、操作数据库(增删改查)。
Service层:引用对应的Dao数据库操作。Action层:引用对应的Service层,在这里结合Struts的配置文件,跳转到指定的页面,当然也能接受页面传递的请求数据,也可以做些计算处理。

以上的Hibernate,Struts,都需要注入到spring的配置文件中,Spring把这些联系起来,成为一个整体。

2.三大框架Struts/Hibernate/Spring

简单地说:

Struts——控制用的;

Hibernate——操作数据库的;

Spring——解耦用的。

阅读全文

静态变量与实例变量的区别

java类的成员变量有俩种:一种是被static关键字修饰的变量,叫类变量或者静态变量;另一种没有static修饰,为实例变量。在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类...

阅读全文

Java数据类型和内存分配

Java的数据类型两大类:

1、基本数据类型:定以后直接分配内存空间,存储在栈中。

又可细分为:

数值型:整数byte/short/int/long及浮点float/double;

字符型char;

布尔型boolean;

2、引用数据类型:栈中存储引用指针地址,指向实际存放的堆;

又可分为:

类class;

接口interface;

数组array;

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

Java内存管理与数据类型关系 学习

根据上面,需要了解Java内存,以下内容斜体字摘至:

http://www.cnblogs.com/whgw/archive/2011/09/29/2194997.html

Java内存分两类:栈内存和堆内存。

简单说,程序操作基本数据类型是直接操作栈内存中的数据,操作引用数据类型是通过栈中的地址访问其指向的堆内存。而管理堆内存由java 的虚拟机负责。

“堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的一个别名,或者代号。引用变量是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放。而数组&对象本身在堆中分配,即使程序运行到使用new产生数组和对象的语句所在地代码块之外,数组和对象本身占用的堆内存也不会被释放,数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因”

**

阅读全文