gitinspector+jenkins 開發代碼統計CI

gitinspector是一個python語言開發的開源的命令行下的代碼統計工具,一般用於開發人員對自己的代碼做統計。

命令行的一般用法:

# gitinspector -wTHL /path/code/repository    // 自行執行看下效果,這裏不再綴述

# gitinspector --format=html --timeline --localize-output -w /path/code/repository > /save/path/result.html // 生成html文件(可生成多種類型的文件)自行執行看下效果,這裏不再綴述

也可去http://www.jiechic.com/archives/using-gitinspector-git-commits-statistics看效果。


今天主要是與大家交流一下gitinspector與jenkins如何結合:

環境爲Centos 7.1。

如果是Centos 6.X請自行安裝python2.7.5以上版本;下面提供安裝命令:

# wget https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tar.xz
# mv /usr/bin/python /usr/bin/python26
# tar xf Python-2.7.9.tgz
# cd Python-2.7.9
# ./configure 
# make && make install
# ln  -s /usr/local/bin/python2.7 /usr/bin/python
# sed -i "s#\#\!/usr/bin/python#\#\!/usr/bin/python26#g" /usr/bin/yum

一、部署jenkins CI環境

網上到處都是,過程不做綴述。


二、安裝gitinspcetor
# wget https://raw.github.com/pypa/pip/master/contrib/get-pip.py --no-check-certificate
# python get-pip.py

# pip install gitinspector

我的jenkins與gitinspector在同一臺服務器上


三、我用的gitlab,把代碼clone到本地一份

# cd /local/code/repo/path

# git clone git@address:user/coderepo.git


四、編寫python或其它語言的腳本,jenkins去執行的;不建議用shell。

我的腳本:

#!/usr/bin/python

# -*- encoding: utf-8 -*-


import sys

import os

import re

import time

import commands   # 不要用os.system,用了的話你會很意外的*_*


# 我們有三個版本庫,所以下面是三個repo。你用一個就可以了

credit = "/path/code/repo"   # 本地clone代碼庫路徑的上層目錄

datahub = "/path/code/repo"

scoreweb = "/path/code/repo"

HtmlTarget = "/jenkins/url"  # 我是藉助jenkins新建一個目錄保存html文件,訪問方法:http://ip:port/html/save/path/result.html

CreateDate = time.strftime("%Y%m%d%H%M%S")

ViewURL = "http://ip:port/jenkins/"  # 我保存html文件的目錄爲jenkins

ProjectList = []

ProjectList.append(credit)

ProjectList.append(datahub)

ProjectList.append(scoreweb)

# tmpfile = "/tmp/temp.txt"   # 如果用os.system執行shell命令最好是把結果放到一個臨時文件中

count = 0


def delFile(PATH):


    os.chdir(PATH)

    S, R = commands.getstatusoutput("find . -type f -ctime +1 | xargs rm -f")

    if S == 0:

        print "Delete html file 1 days ago."

    else:

        print "Delete file failed"


def historyHtml(PATH, project):


    print "\033[34m#################\033[0m"

    print "\033[34m#    History    #\033[0m"

    print "\033[34m#################\033[0m"

    for file in os.listdir(PATH):

        print os.path.join(ViewURL, file)

    print "\033[31m============%s END============\033[0m" % project

    print ""


for projectPATH in ProjectList:

    os.chdir(r"%s" % projectPATH)

    item = projectPATH.split('/')[4]

    gitStatus, gitResult = commands.getstatusoutput("git pull")

    if gitStatus == 0:

        print "\033[31m============Update Project %s Code============\033[0m" % item

        print "Code update complete. %s" % gitResult

        print ""


        try:

            simpleStatus, simpleResult = commands.getstatusoutput("gitinspector -wTHL %s" % projectPATH)

            #os.system("gitinspector -wTHL %s > %s" % (projectPATH, tmpfile))

        except Exception as e:

            count += 1

            print e

        else:

            if simpleStatus == 0:

                print "\033[34m#################\033[0m"

                print "\033[34m# Simple INFO   #\033[0m"

                print "\033[34m#################\033[0m"

                print ""

                print simpleResult

            else:

                count += 1

                print "\033[34m#################\033[0m"

                print "\033[34m# Simple INFO   #\033[0m"

                print "\033[34m#################\033[0m"

                print ""

                print simpleResult



        try:

            viewStatus, viewResult = commands.getstatusoutput("gitinspector --format=html --timeline --localize-output -w %s" % projectPATH)

        except Exception as e:

            count += 1

            print e

        else:

            print viewStatus

            if viewStatus == 0:

                try:

                    htmlFile = open("%s/%s/%s_%s.html" % (HtmlTarget, item, item, CreateDate), 'w+')

                   # gitinspector生成的html文件中有一個google的jquery文件,我把它替換爲本地

                    htmlFile.writelines(viewResult.replace("https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js", "../../gitinspector/jquery.js"))

                except Exception as e:

                    count += 1

                    htmlFile.close()

                    print "\033[34m#################\033[0m"

                    print "\033[34m#   View INFO   #\033[0m"

                    print "\033[34m#################\033[0m"

                    print e

                    print ""

                else:

                    htmlFile.close()

                    print "\033[34m#################\033[0m"

                    print "\033[34m#   View INFO   #\033[0m"

                    print "\033[34m#################\033[0m"

                    print "Access the following URL to view details"

                    print "%s%s/%s_%s.html" % (ViewURL, item, item, CreateDate)

                    print ""

            else:

                count += 1

                print "Exception:"

                print viewStatus

                print viewResult

                print ""

        delFile("%s/%s" % (HtmlTarget, item))

        historyHtml("%s/%s" % (HtmlTarget, item), item)

    else:

        print "\033[31m============Update Project %s Code============\033[0m" % item

        time.sleep(2)

        print "Code update failed."

        print ""

        sys.exit(5)


if count == 0:

    sys.exit()

else:

    sys.exit(126)



五、最重要的一步,修改gitinspector的源代碼

# vim /usr/lib/python2.7/site-packages/gitinspector/terminal.py +122


#註釋的這一行是源代碼,註釋的上一行是修改後的;因爲gitrepector在命令行執行命令會獲取你的終端輸出,會先檢驗你的終端字符集,而用jenkins去執行腳本時,sys.stdin.encoding這一名獲取不到終端字符集,所以直接寫死爲'utf-8'就行了。

117 def convert_command_line_to_utf8():

118         try:

119                 argv = []

120 

121                 for arg in sys.argv:

122                         argv.append(arg.decode("utf-8", "replace"))

123                         # argv.append(arg.decode(sys.stdin.encoding, "replace"))

124 

125                 return argv

126         except AttributeError:

127                 return sys.argv


六、添加jenkins自由風格的工程

勾選Build periodically定時執行

在構建標籤中先Execute shell 這個應該都會吧,因爲我是jenkins本地所以我的是

/usr/bin/python /root/code/statistical_code.py

保存

搞定

jenkins效果:

wKiom1al2dWD3UJxAAOkHwrAfs8628.jpg

點擊鏈接後:

wKioL1al2meTMAEfAAPtZJl5nDs735.jpg

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章