天天看點

搭建hudson/jenkins+cppcheck+cpplint+cccc持續內建環境1 Jenkins介紹2準備3安裝4插件安裝5全局配置6建立job

1 Jenkins介紹

Jenkins是基于Java開發的一種持續內建工具,Hudson是它的前身。Jenkins用于監控程式重複的工作,包括:

1、持續的軟體版本釋出/測試項目。

2、監控外部調用執行的工作。

l  Jenkins的特性

1、易于安裝-隻要把jenkins.war部署到servlet容器,不需要資料庫支援。

2、易于配置-所有配置都是通過其提供的web界面實作。

3、內建RSS/E-mail/IM-通過RSS釋出建構結果或當建構失敗時通過e-mail實時通知。

4、生成JUnit/TestNG測試報告。

5、分布式建構支援-Jenkins能夠讓多台計算機一起建構/測試。

6、檔案識别- Jenkins能夠跟蹤哪次建構生成哪些jar,哪次建構使用哪個版本的jar等。

7、插件支援-Jenkins可以通過插件擴充,你可以開發适合自己團隊使用的工具。

2準備

²  JDK安裝包((jdk-8u11-windows-i586_14459_BDdl.exe)

²  tomcat安裝包(apache-tomcat-8.0.15.exe)

²  jenkins war包或hudson war包(jenkins.war)

²  VC或者visual studio(VS2013_RTM_ULT_CHS.iso)

²  cppcheck安裝包(cppcheck-1.68-x86-Setup.msi)

²  cccc安裝包(CCCC_3.1.4_setup.exe)

²  python2.7安裝包(python-2.7.msi)

²  cpplint.py

注:cpplint 必須在python2.7下執行

3安裝

3.1安裝JDK

1.安裝:輕按兩下運作exe,按照提示安裝即可。

2.配置環境變量

3.驗證是否安裝成功:點選“開始”->“運作”,輸入“cmd”進入指令行界面,打入“java -version”,如果安裝成功将會顯示所安裝的版本。

參考配置JDK環境變量.doc

3.2安裝Apache

1.安裝:一路預設安裝即可。

2配置:修改配置為開機自啟動:找到 Configure Tomcat,修改啟動類型為“自動”,并确定。

3.驗證是否安裝成功:在浏覽器中輸入http://localhost:8080,顯示界面如下

搭建hudson/jenkins+cppcheck+cpplint+cccc持續內建環境1 Jenkins介紹2準備3安裝4插件安裝5全局配置6建立job

3.3安裝Jenkins

将war包放在tomcan安裝路徑下的webapps目錄下。在浏覽器中輸入http://localhost:8080/jenkins(或http://localhost:8080/hudson),顯示界面如下:

搭建hudson/jenkins+cppcheck+cpplint+cccc持續內建環境1 Jenkins介紹2準備3安裝4插件安裝5全局配置6建立job

建議使用Jenkins,Hudson-3.2.1 warning插件不能很好的內建cpplint結果。

3.4安裝VC或visual studio

建議通過DAEMON Tools Lite安裝visual studio。

3.5安裝cppcheck

建議直接安裝在C槽下或c:\cppcheck目錄下。

3.6安裝cccc

建議直接安裝在C槽下或c:\cccc目錄下。

3.7安裝python2.7

預設安裝即可。

4插件安裝

jenkins的好用基本展現在其衆多而強大的插件上,在“系統管理”中可以找到“插件管理”,為了更好的使用jenkins,還需要安裝一些插件,在“可選插件”中進行選擇,本文中建議安裝以下插件:

² Subversion Plug-in:支援Subversion作為配置伺服器

² Cppcheck Plug-in:使用其生成cppcheck報告

² CCCC Plugin:使用其生成cccc報告

² Warnings Plug-in:從控制台或本地檔案中讀取警告資訊并生成報告

² Violations plugin:生成靜态代碼檢查報告,

² Email Extension Plugin:如果希望部署完成後能将結果以郵件的形式進行

通知,可以安裝該插件

 jenkins支援兩種方式的插件安裝,一種是線上自動安裝。另一種是本地手動安裝。安裝完插件需要重新啟動jenkins。即關閉tomcat服務,再啟動。

4.1.線上自動安裝

 點選【系統管理】,再點選【管理插件】。在【Available】頁籤裡選擇想要安裝的插件。

搭建hudson/jenkins+cppcheck+cpplint+cccc持續內建環境1 Jenkins介紹2準備3安裝4插件安裝5全局配置6建立job

點選下面的install 然後等一段時間. 

搭建hudson/jenkins+cppcheck+cpplint+cccc持續內建環境1 Jenkins介紹2準備3安裝4插件安裝5全局配置6建立job

 顯示打勾的狀态就是這個插件已經安好了

如果插件太多,可以通過Search找到想要安裝的插件。

搭建hudson/jenkins+cppcheck+cpplint+cccc持續內建環境1 Jenkins介紹2準備3安裝4插件安裝5全局配置6建立job

4.2本地手動安裝

手動将插件下載下傳到本地,然後點選【系統管理】,再點選【管理插件】。在【進階】頁籤裡上傳插件,然後點選Upload。

搭建hudson/jenkins+cppcheck+cpplint+cccc持續內建環境1 Jenkins介紹2準備3安裝4插件安裝5全局配置6建立job

如果是jenkins,也可将hpi檔案拷貝至jenkins home目錄下的WEB-INF/plugins目錄下。

5全局配置

jenkins的總體配置,都是在“系統管理”中進行配置的,hudson“系統管理”提供了如下功能:

 l 系統設定 

全局設定&路徑,這是jenkins最核心的功能,jdk,ant,maven,scp,郵件等等,都 是在這裡設定的。 

l讀取設定

放棄目前記憶體中所有的設定資訊并從配置檔案中重新讀取,僅用于當您手動修改配置文 件時重新讀取設定。

 l管理插件

 添加、删除、禁用或啟用Hudson功能擴充插件。

 l系統資訊

 顯示系統環境資訊以幫助解決問題。該功能會列出系統屬性,環境變量以及Plugins資訊。

 l系統日志

 系統日志從java.util.logging 捕獲Hudson相關的日志資訊。

 l負載統計

 檢查您的資源利用情況,看看是否需要更多的計算機來幫助您建構。

 lHudson CLI 

從您指令行或腳本通路或管理您的Hudson。

感興趣的話可以通過指令行嘗試一下

 l腳本指令行

 執行用于管理或故障探測或診斷的任意腳本指令。這就是Groovy scripts。

 l管理節點

 添加、删除、控制和監視系統運作任務的節點。

 l管理使用者

 建立/删除/修改Hudson使用者,系統的登入使用者都是在這裡建立的。

 l準備關機

 停止執行新的建構任務以安全關閉計算機

全局設定中很多是我們用不到的,這裡隻介紹安全設定和郵件設定。

5.1郵件通知

1. 點選系統管理,選系統設定

搭建hudson/jenkins+cppcheck+cpplint+cccc持續內建環境1 Jenkins介紹2準備3安裝4插件安裝5全局配置6建立job

2. 最後一項——郵件通知,填入以下資訊,注,系統管理者郵件位址是事先申請的一個郵箱,相當于郵件中轉站的作用,每次項目build後都會從這個中轉站發郵件到項目相關人員的郵箱中。Hudson URL可以使http://127.0.0.1:8080,也可以是http:localhost:8080,貌似也可以用自己的ip位址,但是如果用自己的ip的話别人就進不來了,不曉得我的這個了解有誤沒。

點選advanced,勾選使用SMTP認證,将中轉站郵箱賬号及密碼填入,且smtp端口為25,charset值按系統預設不變。點選用系統管理者測試郵件設定,若設定成功,該郵箱會收到一封系統确認郵件。

搭建hudson/jenkins+cppcheck+cpplint+cccc持續內建環境1 Jenkins介紹2準備3安裝4插件安裝5全局配置6建立job
搭建hudson/jenkins+cppcheck+cpplint+cccc持續內建環境1 Jenkins介紹2準備3安裝4插件安裝5全局配置6建立job
搭建hudson/jenkins+cppcheck+cpplint+cccc持續內建環境1 Jenkins介紹2準備3安裝4插件安裝5全局配置6建立job

3. 系統郵件設定弄好後就可以去設定單個項目的郵件設定,因為每個項目的人員是非固定的,是以需要對該項目人員設定郵箱,隻有該項目人員才能收到該項目的相關郵件。

選中要設定的項目,點選設定,勾選EditableEmail Notification,将項目相關人的郵箱錄入,用逗号分開。點save。

搭建hudson/jenkins+cppcheck+cpplint+cccc持續內建環境1 Jenkins介紹2準備3安裝4插件安裝5全局配置6建立job
搭建hudson/jenkins+cppcheck+cpplint+cccc持續內建環境1 Jenkins介紹2準備3安裝4插件安裝5全局配置6建立job

4. 可能還需要下載下傳郵件的插件才能正常運作,是以,需要在系統管理中選中管理插件,找到

搭建hudson/jenkins+cppcheck+cpplint+cccc持續內建環境1 Jenkins介紹2準備3安裝4插件安裝5全局配置6建立job

點選安裝

5. 回到項目設定中,在Editable Email Notification,下面勾選無論build失敗還是成功都要發送郵件給項目相關人員,去掉send tocommitters的選項,且add a trigger全選:select。

點save儲存。

搭建hudson/jenkins+cppcheck+cpplint+cccc持續內建環境1 Jenkins介紹2準備3安裝4插件安裝5全局配置6建立job

 6. 至此,jenkins郵件設定完成,

回到項目,點選立即建構,無論成功或失敗都會有郵件發送到項目組成員的郵箱中,說明郵件設定成功。

5.2安全設定

1.在系統管理中的系統設定有一項:啟用安全,選中它,并在hudson專有使用者資料庫中勾選允許使用者注冊這一選項,表明系統允許添加使用者,若去掉這個勾選,則說明系統不允許使用者注冊。

搭建hudson/jenkins+cppcheck+cpplint+cccc持續內建環境1 Jenkins介紹2準備3安裝4插件安裝5全局配置6建立job

 2. 緊接其後的是授權政策,選中安全矩陣,在添加使用者/組後面填入要注冊的使用者的名字,如Leanna,點選添加,則該使用者就在使用者/組的清單中了,但此時并沒有注冊成功。可根據實際需要勾選該使用者的使用權限,是最高權限還是隻讀隻寫,可勾選。最後點save。

搭建hudson/jenkins+cppcheck+cpplint+cccc持續內建環境1 Jenkins介紹2準備3安裝4插件安裝5全局配置6建立job
搭建hudson/jenkins+cppcheck+cpplint+cccc持續內建環境1 Jenkins介紹2準備3安裝4插件安裝5全局配置6建立job

3. 可先退出之前的登陸使用者,右上角

搭建hudson/jenkins+cppcheck+cpplint+cccc持續內建環境1 Jenkins介紹2準備3安裝4插件安裝5全局配置6建立job

4. 點選建立賬戶create anaccount

搭建hudson/jenkins+cppcheck+cpplint+cccc持續內建環境1 Jenkins介紹2準備3安裝4插件安裝5全局配置6建立job

5. 填入相關資訊

搭建hudson/jenkins+cppcheck+cpplint+cccc持續內建環境1 Jenkins介紹2準備3安裝4插件安裝5全局配置6建立job

6. 因為之前已經有注冊過這個賬号,是以這個名字不能用了,可換其他的比如Amy,注冊成功後會有郵件發送至該人員的電子郵箱。

搭建hudson/jenkins+cppcheck+cpplint+cccc持續內建環境1 Jenkins介紹2準備3安裝4插件安裝5全局配置6建立job

3. 項目相關人員都注冊好了之後就可取消允許使用者注冊這一選項,以避免其他非項目相關人員進來。

搭建hudson/jenkins+cppcheck+cpplint+cccc持續內建環境1 Jenkins介紹2準備3安裝4插件安裝5全局配置6建立job

6建立job

6.1建立一個Jenkins作業。

1.點選建立任務連結。建立一個自由風格的軟體項目,輸入任務名稱。

搭建hudson/jenkins+cppcheck+cpplint+cccc持續內建環境1 Jenkins介紹2準備3安裝4插件安裝5全局配置6建立job

6.2 Jenkins任務的基本配置

        Discard OldBuilds選項配置如何抛棄舊的建構。如果每次建構相關的檔案都儲存下來,磁盤空間将被漸漸消耗光。Hudson為此提供了兩種方式讓使用者選擇保留哪些建構任務的相關檔案:

1) Days to keep builds:如果其值為非空的N,就僅保留N天之内的建構檔案。

2) Max # of builds to keep:如果#非空,就僅保留最多#個最近建構的相關檔案。

  如:保留10個最近的建構,在Max # of buildsto keep一欄中輸入“10”即可。

搭建hudson/jenkins+cppcheck+cpplint+cccc持續內建環境1 Jenkins介紹2準備3安裝4插件安裝5全局配置6建立job

6.3設定工作目錄

點選 “Advanced Job Options”下的“Advanced...”按鈕,選中“Use custom workspace”,設定Directory為我們的工作目錄(例如我設定為E:\Hudson\mytest)。

搭建hudson/jenkins+cppcheck+cpplint+cccc持續內建環境1 Jenkins介紹2準備3安裝4插件安裝5全局配置6建立job

6.4 Jenkins任務的源碼倉庫配置

  在項目配置頁面Source CodeManagerment部分,選擇Subversion,然後在Repository URL文本框中輸入項目的Subversion倉庫位址(如:svn://127.0.0.1/account/trunk)。

  然後單擊entercredential填寫配置倉庫的認證資訊。

搭建hudson/jenkins+cppcheck+cpplint+cccc持續內建環境1 Jenkins介紹2準備3安裝4插件安裝5全局配置6建立job

在上圖紅色警告部分,點選【enter credential】輸入使用者名密碼。

搭建hudson/jenkins+cppcheck+cpplint+cccc持續內建環境1 Jenkins介紹2準備3安裝4插件安裝5全局配置6建立job

6.5 Jenkins任務的建構觸發配置

    Hudson 支援三種方式觸發建構:

1) Build after otherprojects are built:在其他項目建構完成後建構本項目。

2) Buildperiodically:周期性的建構本項目。

3) Poll SCM:周期性的輪詢源碼倉庫,發現有更新時建構本項目。

一般使用第三種。

 Hudson使用著名的 UNIX任務調試工具Cron(http://en.wikipedia.org/wiki/Cron)所使用的配置方式來配置輪詢代碼倉庫的頻率:用 5 個字段表示不同的時間機關,字段之間用空格分隔:分(0-59) 時(0-23) 日(1-31) 月(1-12)星期幾(0-7,0、7都表示周日)。

  幾種特殊比對符:

  1) * :比對範圍内任何值

  2) M-N :比對 M-N 範圍内任何值

  3) A , B , … , Z :逗号比對多個值

  4) */X 或 M-N/X :範圍内能被 X 整除的

  星期幾與日期是或的關系。

  對于一個健康的項目,常見的做法是:每隔10分鐘輪詢代碼倉庫,Schedule對應的配置為:*/10 * * * *。

  可以用“#”在Schedule配置文本框中進行注釋。

6.6 Jenkins任務的建構配置

6.6.1建構編譯

1)單擊Build部分的Add build step,選擇Execute Windowsbatch command;

2)然後輸入建構編譯指令,例如:

call "C:\ProgramFiles (x86)\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT"

msdev E:\Hudson\mytest\FtpClient.dsp /MAKE "FtpClient - DEBUG"

其中dsp是工程檔案,也可使用工作區檔案dsw,"FtpClient - DEBUG"中的FtpClient表示FtpClient編譯FtpClient工程。

注:也可将上述指令存成一個bat檔案,例如E:\Hudson\hudson.bat。其中hudson.bat内容為上述指令。建構指令就是檔案位址,即E:\Hudson\hudson.bat。

6.6.2 Cppcheck檢查

1)單擊Build部分的Add build step,選擇Execute Windowsbatch command;

2)然後輸入靜态代碼檢查指令,例如:

C:\Cppcheck\cppcheck.exe--enable=all --xml-version=2 e:\Hudson\mytest 2>E:\Hudson\mytest\cppcheck-result.xml 1>E:\Hudson\cppcheck.log

注:其中cppcheck-result.xml儲存的是cppcheck代碼檢查結果。

6.6.3 CCCC檢查

1)單擊Build部分的Add build step,選擇Execute Windows batchcommand;

 2)然後輸入靜态代碼檢查指令,例如:

C:\CCCC\cccc.exeE:\Hudson\mytest\*.cpp --outdir=E:\Hudson\cccc--xml_outfile=E:\Hudson\mytest\cccc-result.xml 2>E:\Hudson\cccc.log注:其中cccc-result.xml儲存的是cppcheck代碼檢查結果。

6.6.4 Cpplint檢查

1、檢查單個檔案

1)單擊Build部分的Add build step,選擇Execute Windows batchcommand;

 2)然後輸入代碼規範檢查指令,例如:

C:\Python27\python.exec:\cpplint\cpplint.py E:\Hudson\mytest\FtpClient.cpp  2>E:\Hudson\mytest\cpplint-result.xml

set errorlevel=0

注:因為cpplint的傳回值會是1,是以重置下傳回值。否則任務總顯示失敗

2、檢查整個目錄

如果要對目錄周遊,對所有檔案都進行檢查,可以用另一個python來檢索然後調cpplint檢查。代碼如下:

import os, fnmatch, sys 

def all_files(root, patterns = '*', single_level = False,yield_folders=False): 

        patterns = patterns.split(';') 

        for path, subdirs, files in os.walk(root): 

            if yield_folders: 

               files.extend(subdirs) 

            files.sort() 

            for name in files: 

                for pattern in patterns: 

                    if fnmatch.fnmatch(name, pattern): 

                        yield os.path.join(path,name) 

                        break 

            if single_level: 

                break 

if __name__ == '__main__': 

        if len(sys.argv) <2: 

            print 'Please set theabsolute path as the first parameter for parse.' 

            sys.exit() 

        cmd="c:\cpplint.py"

        for path inall_files(sys.argv[1],'*.cpp;'):

            cmd=''.join([cmd,path])

        os.system(cmd) 

代碼另存為lintfordir.py,

1)單擊Build部分的Add build step,選擇Execute Windows batchcommand;

 2)然後輸入代碼規範檢查指令,例如:

C:\Python27\python.exec:\lintfordir.py E:\Hudson\mytest\ 2>E:\Hudson\mytest\cpplint-result.txt

seterrorlevel=0

6.7 釋出結果

每次執行完任務以後将檢查結果釋出,生成的報告進行彙總。

6.7.1 CCCC報告

1)選中Post-build Actions下的Publish CCCC report

2)輸入cccc 報告檔案名,注意,這裡需要使用相對路徑,basedir是工作目錄,例如這裡的basedir是E:\Hudson\mytest,結果儲存在E:\Hudson\mytest下,是以輸入檔案名cccc-result.xml。

6.7.2 Cppcheck報告

1)選中Post-build Actions下的Publish Cppcheck results

2)輸入Cppcheck報告檔案名,注意,這裡需要使用相對路徑,basedir是工作目錄,例如這裡的basedir是E:\Hudson\mytest,結果儲存在E:\Hudson\mytest下,是以輸入檔案名cppcheck-result.xml。

6.7.3 Cpplint報告

1)選中Post-build Actions下的Scan for compiler warnings

2)在Scan workspace files下File pattem中輸入cpplint報告檔案名,注意,這裡需要使用相對路徑,basedir是工作目錄,例如這裡的basedir是E:\Hudson\mytest,結果儲存在E:\Hudson\mytest下,是以輸入檔案名cpplint-result.xml。

3)Parser選擇Cpplint

6.8配置郵件

勾選【Editable Email Notification】,【Global Recipient List】裡填寫郵件的抄送位址。然後點選【Add a Trigger】增加【Unstable】和【Fixed】。那麼就會在建構失敗,不穩定和恢複正常的時候發送郵件。

展開【expand】,可以定制每次建構以後,狀态分别是失敗,不穩定,恢複的時候發送郵件的模闆。例如:

6.9儲存

點選【save】按存設定。不久就會自動執行建構。也可手動點選【立即建構】。

備注:

1、定時檢測,建構

Build Triggers

Buildperiodically:(定期建構)此選項 (也是使用定時作業表達式)僅僅通知Hudson按指定的頻率對項目進行建構,而不管SCM是否有變化。我這個作業就屬于目标測試環境是按某種方式定期修訂的而SCM卻是靜态的情況。如果您想在這個作業中運作一些測試用例的話,它可能就很有幫助。

PollSCM:這是CI 系統中常見的選項。當您選擇此選項,您可以指定一個定時作業表達式來定義Hudson每隔多久檢查一下您源代碼倉庫的變化。如果發現變化,就執行一次建構。例如,表達式中填寫0,15,30,45 * * * *将使Hudson每隔15分鐘就檢查一次您源碼倉庫的變化。

舉例:

Poll SCM:定時檢查源碼變更(根據SCM軟體的版本号),如果有更新就checkout最新code下來,然後執行建構動作。我的配置如下:

*/5 ** * *  (每5分鐘檢查一次源碼變化)

Buildperiodically:周期進行項目建構(它不care源碼是否發生變化),我的配置如下:

0 2 ** *  (每天2:00 必須build一次源碼)

 2、cppcheck介紹

 cppcheck 是一個靜态代碼檢查工具,支援c, c++ 代碼;作為編譯器的一種補充檢查,隻檢測那些編譯器通常無法檢測到的bug類型。cppcheck對産品的源代碼執行嚴格的邏輯檢查。執行的檢查包括:

   1.  自動變量檢查

   2.  數組的邊界檢查

   3.  class類檢查

   4.  過期的函數,廢棄函數調用檢查

   5.  異常記憶體使用,釋放檢查

   6.  記憶體洩漏檢查,主要是通過記憶體引用指針

   7.  作業系統資源釋放檢查,中斷,檔案描述符等

   8.  異常STL 函數使用檢查

   9.  代碼格式錯誤,以及性能因素檢查

示例:

C:\Cppcheck\cppcheck.exe --enable=all--xml-version=2 e:\Hudson\mytest 2>E:\Hudson\mytest\cppcheck-result.xml 1>E:\Hudson\cppcheck.log

1:一般輸出如Checking e:\Hudson\mytest\FtpClient.cpp..

2:檢查的錯誤輸出

<errorid="purgedConfiguration" severity="information"msg="The configuration &amp;#039;APSTUDIO_INVOKED&amp;#039; wasnot checked because its code equals another one." verbose="Theconfiguration &amp;#039;APSTUDIO_INVOKED&amp;#039; was not checkedbecause its code equals another one.">

           <location file="FtpClient.cpp" line="0"/>

3、CCCC介紹

cccc( C and C++ Code Counter),檢查c/c++代碼複雜度的工具

C:\CCCC\cccc.exe E:\Hudson\mytest\*.cpp --outdir=E:\Hudson\cccc--xml_outfile=E:\Hudson\mytest\cccc-result.xml 2>E:\Hudson\cccc.log

會産生html和xml兩種格式的檢查輸出

4、cpplint介紹

cpplint是一個python腳本cpplint.py,是google推出的C++編碼規範檢查工具。

常見問題:

1.如果是xp系統,解析cppcheck report時可能出現javax.xml.bind.UnmarshalException的問題。

解決辦法:将cppcheck檢查語句改為:

C:\Cppcheck\cppcheck.exe --enable=all --xml--xml-version=2 --errorlist e:\Hudson\mytest  >E:\Hudson\mytest\cppcheck-result.xml

2.如果涉及工作區dsw,且工作區中包含多個項目,可用編譯指令(舉例):

msdevE:\Hudson\mytest\FtpClient.dsw /MAKE "ALL - DEBUG"

其中FtpClient.dsw為工作區檔案,ALL表示表示所有工程,也可指定編譯單個工作,例如有工程Client,可指定為msdev E:\Hudson\mytest\FtpClient.dsw /MAKE "Client -DEBUG"

3.如果jenkins中要建構cppchek等report,可将報告存儲在workspace中,将svn中的Local module directory設定為check out目錄,就不至于将report與開發代碼混在一起。

(jenkins中若設定workspace,則workspace為job根目錄)

4.若要使用svn ci将源碼送出,可下載下傳subversion至本地,然後在windows batch command中輸入指令:

"C:\Program Files (x86)\Subversion\bin\svn.exe" ci tt.txt -m"xpp"

5.若svn指令出現svn:E155036: 請參閱指令 'svn upgrade'的提示。

解決辦法:将本地subversion版本更新至與jenkins中subversion版本相同. jenkins中subversion版本在系統管理->系統設定->Subversion->Subversion Workspace Version中進行設定。      

6.若cpplint檢查時出現錯誤:

UnicodeDecodeError: 'ascii' codec can'tdecode byte 0xe0 in position 0

解決辦法:在執行的python檔案中加入(即cpplint.py)

import sys

reload(sys)

sys.setdefaultencoding('gb18030')