add release actions (#133)

This commit is contained in:
dxfeng10
2021-04-20 16:00:08 +08:00
committed by GitHub
parent ec1a6a49c6
commit 9c78faf876
4 changed files with 41 additions and 5 deletions

243
fizz-bootstrap/js/common.js Normal file
View 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);
}
}
};

View 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
View 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