一、主体脚本StatisticsNum.sh
#!/bin/bash
echo "get cuurnt path"
basePath=$(cd $(dirname $0);pwd)
echo $basePath
# define variables
# 统计起始时间
BEGIN_TIME=$1
# 统计截止时间
END_TIME=$2
# 统计分析的SVN路径
SVN_URL=$3
echo "clean up old data"
cd $basePath
rm -rf FinalResult
# 初始化相关路径
mkdir -p $basePath/report
mkdir -p $basePath/log
# 定义统计总天数函数(参数:起始日期、截止日期)
function CountEffectiveDays(){
BEGIN_SECONDS=$(date -d "$1" "+%s")
END_SECONDS=$(date -d "$2" "+%s")
DIFF_SECONDS=$[$END_SECONDS-$BEGIN_SECONDS]
expr $DIFF_SECONDS / 86400
}
# 定义计算时保留小数函数(参数:分子、分母、小数位数)
function KeepDecimal(){
# 分子
MEMBER=$1
# 分母
DENMOINATOR=$2
# 小数位数
DECIMAL_PLACES=$3
cat KeepDecimal.sh > countfile.sh
if [ ! -n "$DECIMAL_PLACES" ] ;then
DNUMBER="2"
echo "$AUTHOR DELETE IS NULL!"
fi
if [ ! -n "$DECIMAL_PLACES" ] ;then
DECIMAL_PLACES="2"
fi
sed -i "s#2#$DECIMAL_PLACES#g;" countfile.sh
# 更新表达式
COUNTMET=$MEMBER/$DENMOINATOR
sed -i "s#countmet#$COUNTMET#g;" countfile.sh
# 返回结果
echo $( sh countfile.sh)
rm -rf countfile.sh
}
# 计算统计总天数
TOTAL_DAYS=$( CountEffectiveDays $BEGIN_TIME $END_TIME )
# define add message function
function ShowMessage(){
echo "规则说明:"
echo "提交:统计周期内用户提交commit的总次数"
echo "日均提交:统计周期内用户平均每日提交commit的次数"
echo "新增:统计周期内新增目录&文件总条数"
echo "删除:统计周期内删除目录&文件总条数"
echo "更新:统计周期内更新文件总条数"
echo "有效变更:统计周期内更新和新增总条数"
echo "日均变更:统计周期平均每日有效变更数"
echo "变更度:(新增+更新)/提交"
echo "Statistics time [$BEGIN_TIME $END_TIME)"
echo "Statistics total days $TOTAL_DAYS"
echo "Statistics URL $SVN_URL"
}
# 文本转化格式化HTML函数(参数:名称 账号 提交次数 日均提交 新增 删除 更新 有效变更 日均变更 变更度 )
function HTMLFormat(){
HTML_PATH="$basePath/report/RESULT.html"
echo "<tr>" >> $HTML_PATH
echo "<th align="center">$1</th>" >> $HTML_PATH
echo "<th align="center">$2</th>" >> $HTML_PATH
echo "<th align="center">$3</th>" >> $HTML_PATH
echo "<th align="center" style="color:green">$4</th>" >> $HTML_PATH
echo "<th align="center">$5</th>" >> $HTML_PATH
echo "<th align="center">$6</th>" >> $HTML_PATH
echo "<th align="center">$7</th>" >> $HTML_PATH
echo "<th align="center">$8</th>" >> $HTML_PATH
echo "<th align="center" style="color:green">$9</th>" >> $HTML_PATH
echo "<th align="center">${10}</th>" >> $HTML_PATH
echo "</tr>" >> $HTML_PATH
}
# 定义记录日志函数
function logger(){
printf "%s\n" "$*" >> $basePath/log/StatisticsNum.log
}
echo "get Metedata and Statistics"
# 获取有效用户提交次数数据
svn log -r {$BEGIN_TIME}:{$END_TIME} --quiet $SVN_URL | \
awk '/^r/ {print $3}' | \
awk '{a[$1]++}END{for(i in a){print i,a[i] | "sort -r -k 2"}}' | \
sort -n -b -t" " -r -k2 | \
awk '{printf "%-20s%-15s\n",$1,$2}' > $basePath/FrequencyResult
echo "get user list and Metedata"
# 分用户获取新增&更新&删除元数据
cat $basePath/FrequencyResult | awk '{print $1}' | while read USER
do
if [ ! -n "$USER" ] ;then
echo "empty USER..."
else
# get metadata messages and Statistics
echo "Statistics $USER"
# 获取元数据
svn log -v -r {$BEGIN_TIME}:{$END_TIME} $SVN_URL | \
sed -n "/${USER}/,/--$/ p" | \
grep / | \
awk '/A|D|M/' | \
awk '{print $1}' > $basePath/MetadataMessages
# clean up old data
rm -rf $basePath/MessagesResult
# get Statistics Num
statisticsNum=$(cat $basePath/FrequencyResult | grep -w $USER | awk '{print $2}')
# 添加用户标识
echo "${USER} C ${statisticsNum}" > $basePath/MessagesResult
# 汇总计算总数
cat $basePath/MetadataMessages | \
awk '{a[$1]++}END{for(i in a){print i,a[i] | "sort -r -k 2"}}' | \
sort >> $basePath/MessagesResult
# 格式化汇总输出
cat $basePath/MessagesResult | paste -d" " -s >> $basePath/FinalResult
echo "Statistics $USER END!"
fi
logger "Run by user " $(id -un) "at " $(/bin/date)
done
echo "information Statistics And Generate RESULT"
# 添加表头信息
echo "名称 账号 提交次数 日均提交 新增 删除 更新 有效变更 日均变更 变更度" > $basePath/report/RESULT
# HTML格式化头
echo "<table border="1">" > $basePath/report/RESULT.html
HTMLFormat 名称 账号 提交次数 日均提交 新增 删除 更新 有效变更 日均变更 变更度
cat $basePath/FinalResult | while read LINE
do
# 获取用户名信息
AUTHOR=$( echo $LINE | awk '{print $1}' )
# 获取名称信息
AUTHOR_NAME=$( cat $basePath/userlist | grep -w $AUTHOR | awk '{print $2}' | head -1 )
if [ ! -n "$AUTHOR_NAME" ] ;then
AUTHOR_NAME="已清除账号"
fi
# 获取用户名新增文件&目录总数
ANUMBER=$( echo $LINE | awk -F"A " '{print $2}' | awk '{print $1}' )
# 获取用户名删除文件&目录总数
DNUMBER=$( echo $LINE | awk -F"D " '{print $2}' | awk '{print $1}' )
# 获取用户名更新文件总数
MNUMBER=$( echo $LINE | awk -F"M " '{print $2}' | awk '{print $1}' )
# 获取用户提交总次数
CNUMBER=$( echo $LINE | awk -F"C " '{print $2}' | awk '{print $1}' )
# 美化数据,将空值填充为o
if [ ! -n "$ANUMBER" ] || [ ! -n "$MNUMBER" ] ;then
if [ ! -n "$ANUMBER" ]|| [ -n "$MNUMBER" ];then
ANUMBER="0"
echo "$AUTHOR ADD IS NULL!"
elif [ -n "$ANUMBER" ]|| [ ! -n "$MNUMBER" ];then
MNUMBER="0"
echo "$AUTHOR MODIFY IS NULL!"
else
ANUMBER="0"
MNUMBER="0"
echo "$AUTHOR ADD AND MODIFY IS NULL!"
fi
fi
if [ ! -n "$DNUMBER" ] ;then
DNUMBER="0"
echo "$AUTHOR DELETE IS NULL!"
fi
# 计算日均提交次数
PREDAY_CNUMBER=$( KeepDecimal $CNUMBER $TOTAL_DAYS 2 )
# 获取有效变更总数
CRNUMBER=$[$ANUMBER+$MNUMBER]
# 计算日均变更(日均变更=变更总数/统计总天数)
PREDAY_Eff=$( KeepDecimal $CRNUMBER $TOTAL_DAYS 3 )
# 计算变更度(变更度=(新增+更新)/提交次数)
MET=$( KeepDecimal $CRNUMBER $CNUMBER 2 )
# 归集生成最终结果文件
echo "$AUTHOR_NAME $AUTHOR $CNUMBER $PREDAY_CNUMBER $ANUMBER $DNUMBER $MNUMBER $CRNUMBER $PREDAY_Eff $MET" >> $basePath/report/RESULT
HTMLFormat $AUTHOR_NAME $AUTHOR $CNUMBER $PREDAY_CNUMBER $ANUMBER $DNUMBER $MNUMBER $CRNUMBER $PREDAY_Eff $MET
logger "Run by user " $(id -un) "at " $(/bin/date)
done
# 获取总人数
TOTAL_PERSION=$( cat $basePath/report/RESULT | wc -l )
# HTML格式化尾
echo "</table>" >> $basePath/report/RESULT.html
echo "<p>($TOTAL_PERSION rows)<br /></p>" >> $basePath/report/RESULT.html
echo "<p>Statistics time [$BEGIN_TIME $END_TIME)<br /></p>" >> $basePath/report/RESULT.html
echo "<p>Statistics total days $TOTAL_DAYS<br /></p>" >> $basePath/report/RESULT.html
echo "<p>Statistics URL $SVN_URL<br /></p>" >> $basePath/report/RESULT.html
echo "clean up temp files"
rm -rf FrequencyResult MessagesResult MetadataMessages FinalResult
# 格式化展示最终统计分析数据
echo "--------------------------------- EXPLAIN MESSAGES --------------------------------"
ShowMessage
echo "--------------------------- FORMAT SHOW DATA ---------------------------"
column -t $basePath/report/RESULT
echo "--------------------------- FORMAT SHOW END ----------------------------"
if [ $? -eq 0 ]; then
echo "successed."
else
echo "failed , please check this script ."
exit 1
fi
二、计算保留变更度脚本(KeepDecimal.sh)内容如下
#!/bin/bash
basePath=$(cd $(dirname $0);pwd)
cd $basePath
awk 'BEGIN{printf "%0.2f",countmet}'
#userlist用户对应一览表
zhangsan 张三
lisi 李四
wangwu 王五
三、全部脚本及文件展示:
[root@localhost Statistics_SVN_Frequency]# ll
总用量 24
-rw-r--r-- 1 root root 95 12月 24 14:10 KeepDecimal.sh
drwxr-xr-x 2 root root 31 12月 24 14:10 log
-rw-r--r-- 1 root root 1082 12月 24 14:10 README
drwxr-xr-x 2 root root 39 12月 24 14:10 report
-rw-r--r-- 1 root root 7659 12月 27 11:08 StatisticsNum.sh
-rw-r--r-- 1 root root 6832 12月 27 11:08 userlist
四、jenkins工程配置及HTML报告展示
1.构建参数设置:
2.源码(脚本工具)配置:
3.运行及报告展示配置:
4.报告查看链接:
5.报告详情页: