add release actions (#133)
This commit is contained in:
243
fizz-bootstrap/js/common.js
Normal file
243
fizz-bootstrap/js/common.js
Normal file
@@ -0,0 +1,243 @@
|
||||
/**
|
||||
* context 上下文便捷操作函数
|
||||
*
|
||||
*/
|
||||
var common = {
|
||||
/* *********** private function begin *********** */
|
||||
|
||||
/**
|
||||
* 获取上下文中客户端请求对象
|
||||
* @param {*} ctx 上下文 【必填】
|
||||
*/
|
||||
getInputReq: function (ctx){
|
||||
if(!ctx || !ctx['input'] || !ctx['input']['request']){
|
||||
return {};
|
||||
}
|
||||
return ctx['input']['request']
|
||||
},
|
||||
|
||||
/**
|
||||
* 获取上下文步骤中请求接口的请求对象
|
||||
* @param {*} ctx 上下文 【必填】
|
||||
* @param {*} stepName 步骤名称 【必填】
|
||||
* @param {*} requestName 请求名称 【必填】
|
||||
*/
|
||||
getStepReq: function (ctx, stepName, requestName){
|
||||
if(!ctx || !stepName || !requestName){
|
||||
return {};
|
||||
}
|
||||
if(!ctx[stepName] || !ctx[stepName]['requests'] || !ctx[stepName]['requests'][requestName] ||
|
||||
!ctx[stepName]['requests'][requestName]['request']){
|
||||
return {};
|
||||
}
|
||||
return ctx[stepName]['requests'][requestName]['request'];
|
||||
},
|
||||
|
||||
/**
|
||||
* 获取上下文步骤中请求接口的响应对象
|
||||
* @param {*} ctx 上下文 【必填】
|
||||
* @param {*} stepName 步骤名称 【必填】
|
||||
* @param {*} requestName 请求名称 【必填】
|
||||
*/
|
||||
getStepResp: function (ctx, stepName, requestName){
|
||||
if(!ctx || !stepName || !requestName){
|
||||
return {};
|
||||
}
|
||||
if(!ctx[stepName] || !ctx[stepName]['requests'] || !ctx[stepName]['requests'][requestName] ||
|
||||
!ctx[stepName]['requests'][requestName]['response']){
|
||||
return {};
|
||||
}
|
||||
return ctx[stepName]['requests'][requestName]['response'];
|
||||
},
|
||||
|
||||
/* *********** private function end *********** */
|
||||
|
||||
/* *********** input begin ************ */
|
||||
|
||||
/**
|
||||
* 获取客户端请求头
|
||||
* @param {*} ctx 上下文 【必填】
|
||||
* @param {*} headerName 请求头字段名 【选填】,不传时返回所有请求头
|
||||
*/
|
||||
getInputReqHeader: function (ctx, headerName){
|
||||
var req = this.getInputReq(ctx);
|
||||
var headers = req['headers'] || {};
|
||||
return headerName ? headers[headerName.toUpperCase()] : headers;
|
||||
},
|
||||
|
||||
/**
|
||||
* 获取客户端URL请求参数(query string)
|
||||
* @param {*} ctx 上下文 【必填】
|
||||
* @param {*} paramName URL参数名 【选填】,不传时返回所有请求参数
|
||||
*/
|
||||
getInputReqParam: function (ctx, paramName){
|
||||
var req = this.getInputReq(ctx);
|
||||
var params = req['params'] || {};
|
||||
return paramName ? params[paramName] : params;
|
||||
},
|
||||
|
||||
/**
|
||||
* 获取客户端请求体
|
||||
* @param {*} ctx 上下文 【必填】
|
||||
* @param {*} field 字段名 【选填】,不传时返回整个请求体
|
||||
*/
|
||||
getInputReqBody: function (ctx, field){
|
||||
var req = this.getInputReq(ctx);
|
||||
var body = req['body'] || {};
|
||||
return field ? body[field] : body;
|
||||
},
|
||||
|
||||
/**
|
||||
* 获取返回给客户端的响应头
|
||||
* @param {*} ctx 上下文 【必填】
|
||||
* @param {*} headerName 响应头字段名 【选填】,不传时返回所有响应头
|
||||
*/
|
||||
getInputRespHeader: function (ctx, headerName){
|
||||
var req = this.getInputReq(ctx);
|
||||
var headers = req['headers'] || {};
|
||||
return headerName ? headers[headerName.toUpperCase()] : headers;
|
||||
},
|
||||
|
||||
/**
|
||||
* 获取返回给客户端的响应体
|
||||
* @param {*} ctx 上下文 【必填】
|
||||
* @param {*} field 字段名 【选填】,不传时返回整个响应体
|
||||
*/
|
||||
getInputRespBody: function (ctx, field){
|
||||
var req = this.getInputReq(ctx);
|
||||
var body = req['body'] || {};
|
||||
return field ? body[field] : body;
|
||||
},
|
||||
|
||||
/* *********** input begin ************ */
|
||||
|
||||
/* *********** step request begin ************ */
|
||||
|
||||
/**
|
||||
* 获取步骤中调用的接口的请求头
|
||||
* @param {*} ctx 上下文 【必填】
|
||||
* @param {*} stepName 步骤名【必填】
|
||||
* @param {*} requestName 请求的接口名 【必填】
|
||||
* @param {*} headerName 请求头字段名 【选填】,不传时返回所有请求头
|
||||
*/
|
||||
getStepReqHeader: function (ctx, stepName, requestName, headerName){
|
||||
var req = this.getStepReq(ctx, stepName, requestName);
|
||||
var headers = req['headers'] || {};
|
||||
return headerName ? headers[headerName.toUpperCase()] : headers;
|
||||
},
|
||||
|
||||
/**
|
||||
* 获取步骤中调用的接口的URL参数
|
||||
* @param {*} ctx 上下文 【必填】
|
||||
* @param {*} stepName 步骤名【必填】
|
||||
* @param {*} requestName 请求的接口名 【必填】
|
||||
* @param {*} paramName URL参数名 【选填】,不传时返回所有URL参数
|
||||
*/
|
||||
getStepReqParam: function (ctx, stepName, requestName, paramName){
|
||||
var req = this.getStepReq(ctx, stepName, requestName);
|
||||
var params = req['params'] || {};
|
||||
return paramName ? params[paramName] : params;
|
||||
},
|
||||
|
||||
/**
|
||||
* 获取步骤中调用的接口的请求体
|
||||
* @param {*} ctx 上下文 【必填】
|
||||
* @param {*} stepName 步骤名【必填】
|
||||
* @param {*} requestName 请求的接口名 【必填】
|
||||
* @param {*} field 字段名 【选填】,不传时返回整个请求体
|
||||
*/
|
||||
getStepReqBody: function (ctx, stepName, requestName, field){
|
||||
var req = this.getStepReq(ctx, stepName, requestName);
|
||||
var body = req['body'] || {};
|
||||
return field ? body[field] : body;
|
||||
},
|
||||
|
||||
/**
|
||||
* 获取步骤中调用的接口的响应头
|
||||
* @param {*} ctx 上下文 【必填】
|
||||
* @param {*} stepName 步骤名【必填】
|
||||
* @param {*} requestName 请求的接口名 【必填】
|
||||
* @param {*} headerName 响应头字段名 【选填】,不传时返回所有响应头
|
||||
*/
|
||||
getStepRespHeader: function (ctx, stepName, requestName, headerName){
|
||||
var resp = this.getStepResp(ctx, stepName, requestName);
|
||||
var headers = resp['headers'] || {};
|
||||
return headerName ? headers[headerName.toUpperCase()] : headers;
|
||||
},
|
||||
|
||||
/**
|
||||
* 获取步骤中调用的接口的响应头
|
||||
* @param {*} ctx 上下文 【必填】
|
||||
* @param {*} stepName 步骤名【必填】
|
||||
* @param {*} requestName 请求的接口名 【必填】
|
||||
* @param {*} field 字段名 【选填】,不传时返回整个响应头
|
||||
*/
|
||||
getStepRespBody: function (ctx, stepName, requestName, field){
|
||||
var resp = this.getStepResp(ctx, stepName, requestName);
|
||||
var body = resp['body'] || {};
|
||||
return field ? body[field] : body;
|
||||
},
|
||||
|
||||
/**
|
||||
* 获取步骤结果
|
||||
* @param {*} ctx 上下文 【必填】
|
||||
* @param {*} stepName 步骤名【必填】
|
||||
* @param {*} field 字段名 【选填】,不传时返回整个步骤结果对象
|
||||
*/
|
||||
getStepResult: function (ctx, stepName, field){
|
||||
if(!ctx || !stepName || !ctx[stepName]){
|
||||
return {};
|
||||
}
|
||||
var result = ctx[stepName]['result'] || {};
|
||||
return field ? result[field] : result;
|
||||
}
|
||||
|
||||
/* *********** step request end ************ */
|
||||
|
||||
,/**
|
||||
** 乘法函数,用来得到精确的乘法结果
|
||||
** 说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
|
||||
** 调用:accMul(arg1,arg2)
|
||||
** 返回值:arg1乘以 arg2的精确结果
|
||||
**/
|
||||
accMul:function (arg1, arg2) {
|
||||
var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
|
||||
try {
|
||||
m += s1.split(".")[1].length;
|
||||
} catch (e) {
|
||||
}
|
||||
try {
|
||||
m += s2.split(".")[1].length;
|
||||
} catch (e) {
|
||||
}
|
||||
return Number(s1.replace(".", "")) * Number(s2.replace(".", ""))
|
||||
/ Math.pow(10, m);
|
||||
},
|
||||
|
||||
/**
|
||||
** 除法函数,用来得到精确的除法结果
|
||||
** 说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
|
||||
** 调用:accDiv(arg1,arg2)
|
||||
** 返回值:arg1除以arg2的精确结果
|
||||
**/
|
||||
accDiv:function (arg1, arg2) {
|
||||
var t1 = 0, t2 = 0, r1, r2;
|
||||
try {
|
||||
t1 = arg1.toString().split(".")[1].length;
|
||||
} catch (e) {
|
||||
}
|
||||
try {
|
||||
t2 = arg2.toString().split(".")[1].length;
|
||||
} catch (e) {
|
||||
}
|
||||
with (Math) {
|
||||
r1 = Number(arg1.toString().replace(".", ""));
|
||||
r2 = Number(arg2.toString().replace(".", ""));
|
||||
return (r1 / r2) * pow(10, t2 - t1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
71
fizz-bootstrap/js/context.js
Normal file
71
fizz-bootstrap/js/context.js
Normal file
@@ -0,0 +1,71 @@
|
||||
// 上下文数据结构设计
|
||||
// 上下文,用于保存客户输入输出和每个步骤的输入与输出结果
|
||||
var context = {
|
||||
// 是否DEBUG模式
|
||||
debug:false,
|
||||
|
||||
// 各个操作的耗时
|
||||
elapsedTimes: [{
|
||||
[actionName]: 123, // 操作名称:耗时
|
||||
}],
|
||||
|
||||
// exception info
|
||||
exceptionMessage: "",
|
||||
exceptionStacks: "",
|
||||
exceptionData: "", // such as script source code that cause exception
|
||||
|
||||
|
||||
// 客户输入和接口的返回结果
|
||||
input: {
|
||||
request:{
|
||||
path: "",
|
||||
method: "GET/POST",
|
||||
headers: {},
|
||||
body: {},
|
||||
params: {}
|
||||
},
|
||||
response: { // 聚合接口的响应
|
||||
headers: {},
|
||||
body: {}
|
||||
}
|
||||
},
|
||||
|
||||
// 步骤
|
||||
step1: {
|
||||
requests: {
|
||||
// 接口1
|
||||
request1: {
|
||||
// 请求相关参数
|
||||
request:{
|
||||
url: "",
|
||||
method: "GET/POST",
|
||||
headers: {},
|
||||
body: {}
|
||||
},
|
||||
// 根据转换规则转换后的接口响应
|
||||
response: {
|
||||
headers: {},
|
||||
body: {}
|
||||
}
|
||||
},
|
||||
// 接口2
|
||||
request2: {
|
||||
request:{
|
||||
url: "",
|
||||
method: "GET/POST",
|
||||
headers: {},
|
||||
body: {}
|
||||
},
|
||||
response: {
|
||||
headers: {},
|
||||
body: {}
|
||||
}
|
||||
}
|
||||
//...
|
||||
},
|
||||
|
||||
// 步骤结果
|
||||
result: {}
|
||||
|
||||
}
|
||||
}
|
||||
187
fizz-bootstrap/sh/boot.sh
Normal file
187
fizz-bootstrap/sh/boot.sh
Normal file
@@ -0,0 +1,187 @@
|
||||
#!/bin/bash
|
||||
|
||||
cygwin=false
|
||||
darwin=false
|
||||
os400=false
|
||||
case "`uname`" in
|
||||
CYGWIN*) cygwin=true;;
|
||||
Darwin*) darwin=true;;
|
||||
OS400*) os400=true;;
|
||||
esac
|
||||
|
||||
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
|
||||
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
|
||||
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/local/java
|
||||
[ ! -e "$JAVA_HOME/bin/java" ] && unset JAVA_HOME
|
||||
|
||||
if [ -z "$JAVA_HOME" ]; then
|
||||
if $darwin; then
|
||||
|
||||
if [ -x '/usr/libexec/java_home' ] ; then
|
||||
export JAVA_HOME=`/usr/libexec/java_home`
|
||||
|
||||
elif [ -d "/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home" ]; then
|
||||
export JAVA_HOME="/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home"
|
||||
fi
|
||||
else
|
||||
JAVA_PATH=`dirname $(readlink -f $(which javac))`
|
||||
if [ "x$JAVA_PATH" != "x" ]; then
|
||||
export JAVA_HOME=`dirname $JAVA_PATH 2>/dev/null`
|
||||
fi
|
||||
fi
|
||||
if [ -z "$JAVA_HOME" ]; then
|
||||
echo "ERROR: Please set the JAVA_HOME variable in your environment!!!"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
#进入脚本所在目录
|
||||
cd `dirname $0`
|
||||
|
||||
#变量定义
|
||||
APOLLO_META_SERVER=http://localhost:66
|
||||
#支持 prod/pre/test/dev 4个环境
|
||||
ENV=prod
|
||||
APP_NAME=fizz-gateway-community.jar
|
||||
APP_DEP_DIR="` pwd`"
|
||||
APP_LOG_DIR=${APP_DEP_DIR}'/logs'
|
||||
JAVA_CMD=${JAVA_HOME}'/bin/java'
|
||||
PID_FILE="${APP_LOG_DIR}/tpid"
|
||||
CHECK_COUNT=3
|
||||
|
||||
# 远程执行shell脚本初始化环境变量
|
||||
source '/etc/profile'
|
||||
|
||||
SERVER_IP="` ip a |egrep "brd" |grep inet|awk '{print $2}'|sed 's#/24##g'|head -1`"
|
||||
|
||||
#创建日志目录
|
||||
mkdir -p ${APP_LOG_DIR}
|
||||
chmod 755 ${APP_LOG_DIR}
|
||||
|
||||
#进入应用所在目录(虽然都是绝对路径,但有些应用需要进入应用目录才能启动成功)
|
||||
cd ${APP_DEP_DIR}
|
||||
|
||||
JAVA_OPTS="-Xms256m -Xmx4096m \
|
||||
-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m \
|
||||
-XX:+AggressiveOpts \
|
||||
-XX:+UseBiasedLocking \
|
||||
-XX:+UseG1GC \
|
||||
-XX:+HeapDumpOnOutOfMemoryError \
|
||||
-XX:-OmitStackTraceInFastThrow \
|
||||
-verbose:gc \
|
||||
-XX:+PrintGCDetails \
|
||||
-XX:+PrintGCDateStamps \
|
||||
-XX:+PrintHeapAtGC \
|
||||
-Xloggc:${APP_LOG_DIR}/${START_DATE_TIME}.gc \
|
||||
-XX:+HeapDumpOnOutOfMemoryError \
|
||||
-XX:HeapDumpPath=${APP_LOG_DIR}/dump.logs \
|
||||
-Dorg.jboss.netty.epollBugWorkaround=true \
|
||||
-Dio.netty.leakDetectionLevel=PARANOID -Dio.netty.leakDetection.targetRecords=60 \
|
||||
-Dio.netty.allocator.type=unpooled \
|
||||
-Dio.netty.noPreferDirect=true \
|
||||
-Dio.netty.noUnsafe=true "
|
||||
|
||||
#进程状态标识变量,1为存在,0为不存在
|
||||
PID_FLAG=0
|
||||
|
||||
#检查服务进程是否存在
|
||||
checktpid() {
|
||||
TPID=`cat ${PID_FILE} | awk '{print $1}'`
|
||||
TPID=`ps -aef | grep ${TPID} | awk '{print $2}' | grep ${TPID}`
|
||||
if [[ ${TPID} ]]
|
||||
then
|
||||
PID_FLAG=1
|
||||
else
|
||||
PID_FLAG=0
|
||||
fi
|
||||
}
|
||||
|
||||
#启动服务函数
|
||||
start() {
|
||||
#检查进程状态
|
||||
checktpid
|
||||
if [[ ${PID_FLAG} -ne 0 ]]
|
||||
then
|
||||
echo "warn: $APP_NAME already started, ignoring startup request."
|
||||
else
|
||||
echo "starting $APP_NAME ..."
|
||||
rm -f ${PID_FILE}
|
||||
${JAVA_CMD} -jar ${JAVA_OPTS} -Denv=$ENV -Dspring.profiles.active=$ENV -Dapollo.meta=${APOLLO_META_SERVER} ${APP_DEP_DIR}/${APP_NAME} > ${APP_LOG_DIR}/${APP_NAME}.log 2>&1 &
|
||||
echo $! > ${PID_FILE}
|
||||
fi
|
||||
}
|
||||
|
||||
#关闭服务函数
|
||||
stop() {
|
||||
#检查进程状态
|
||||
checktpid
|
||||
|
||||
if [[ ${PID_FLAG} -ne 0 ]]
|
||||
then
|
||||
echo "stoping $APP_NAME..."
|
||||
|
||||
#循环检查进程3次,每次睡眠2秒
|
||||
for((i=1;i<=${CHECK_COUNT};i++))
|
||||
do
|
||||
kill -9 ${TPID}
|
||||
sleep 2
|
||||
|
||||
#检查进程状态
|
||||
checktpid
|
||||
|
||||
if [[ ${PID_FLAG} -eq 0 ]]
|
||||
then
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
#如果以上正常关闭进程都失败,则强制关闭
|
||||
if [[ ${PID_FLAG} -ne 0 ]]
|
||||
then
|
||||
echo "stoping use kill -9..."
|
||||
kill -9 ${TPID}
|
||||
sleep 2
|
||||
else
|
||||
echo "$APP_NAME Stopped!"
|
||||
fi
|
||||
|
||||
else
|
||||
echo "warn:$APP_NAME is not runing"
|
||||
fi
|
||||
}
|
||||
|
||||
#检测进程状态函数
|
||||
status() {
|
||||
#检查进程状态
|
||||
checktpid
|
||||
|
||||
if [[ ${PID_FLAG} -eq 0 ]]
|
||||
then
|
||||
echo "$APP_NAME is not runing"
|
||||
else
|
||||
echo "$APP_NAME is runing"
|
||||
fi
|
||||
}
|
||||
|
||||
#####脚本执行入口#####
|
||||
case "$1" in
|
||||
'start')
|
||||
start
|
||||
;;
|
||||
'stop')
|
||||
stop
|
||||
;;
|
||||
'restart')
|
||||
stop
|
||||
start
|
||||
;;
|
||||
'status')
|
||||
status
|
||||
;;
|
||||
*)
|
||||
echo "usage: $0 {start|stop|restart|status}"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
exit 0
|
||||
Reference in New Issue
Block a user