Jenkins+TortoiseSVN+Shell进行代码库周期统计分析

一、主体脚本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.报告详情页:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绿蜡客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值