使用Jenkins進行Python項目的持續(xù)集成

持續(xù)集成(CI)對于軟件工程來說非常重要,它的意義在于產(chǎn)品快速迭代的同時,還能夠讓代碼保持高質(zhì)量,所以編寫高質(zhì)量的單元測試代碼也顯得十分重要。Travis可以免費做開源軟件的持續(xù)集成,但是對于閉源軟件來說,它的費用非常高昂。另外一款持續(xù)集成軟件叫Jenkins,它是Java實現(xiàn)的一款開源持續(xù)集成工具,對于Java程序的持續(xù)集成支持特別好,網(wǎng)上也有很多這方面的文章。本文主要講述怎么運用它來做Python 項目的持續(xù)集成。

這里假設(shè)大家都比較熟悉Git開發(fā)流程了。這里所講的工作流是Git+Jenkins。首先,我們在持續(xù)集成服務(wù)器上安裝JDK1.8、Git和Python3(非Python項目無需安裝),并且把Python3設(shè)置為默認(rèn)Python解釋器。由于篇幅限制,這里就不展開講了。然后我們通過pip3 install virtualenv安裝虛擬環(huán)境,安裝虛擬環(huán)境的目的是,在進行持續(xù)集成測試的時候,各個項目構(gòu)建使用不同的虛擬環(huán)境,因為項目不同可能相同依賴的版本會有沖突。

然后,在Jenkins官網(wǎng)上下載Jenkins并將其安裝到持續(xù)集成服務(wù)器上。可以直接下載.war文件,通過java -jar jenkins.war啟動。我用的是CentOS,直接使用它自帶的包管理器yum安裝。首先,需要添加jenkins源,可以在官網(wǎng)相關(guān)頁面查看

sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo

sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key

然后便可以使用yum install jenkins安裝了。安裝完成后,我們通過

sudo service jenkins start

啟動jenkins,如果啟動失敗,按照錯誤提示進行修改,比如我這里是

[root@weibo1 ~]# service jenkins start
Starting Jenkins bash: /usr/bin/java: No such file or directory
[FAILED]

那么可以先使用which java查看java所在路徑,我這里是/usr/jdk1.8.0_131/bin/java,再通過

ln -s /usr/jdk1.8.0_131/bin/java /usr/bin/java

建立軟連接,再通過service jenkins start就不會報錯了。這個時候輸入http://your_jenkins_ip:8080/便可以進入jenkins初始化頁面,如下圖

Jenkins初始化頁面

圖中提示了密碼所在文件,通過

cat /var/lib/jenkins/secrets/initialAdminPassword

可查詢到密碼,將其填入密碼框即可。

之后,Jenkins會提示我們安裝插件,我們選擇自定義安裝。除了它默認(rèn)勾選安裝的插件之外,我們還需要安裝Cobertura PluginJUnit Plugin,前者是和代碼覆蓋率相關(guān)的插件,后者是單元測試相關(guān)插件,其他暫時不用安裝,然后我們點擊install進行安裝。在安裝進度條走完之后,Jenkins會讓我們填入登錄用戶的用戶名和密碼,提示如下圖

填入登錄用戶的用戶名和密碼等信息

填入之后,我們便可以使用剛才創(chuàng)建的用戶登入系統(tǒng)了。除了在這個時候可以創(chuàng)建用戶,還可以使用超級管理員賬號(賬號為admin,密碼可以通過cat /var/lib/jenkins/secrets/initialAdminPassword查看)來創(chuàng)建普通用戶,操作路徑是Jenkins主頁=>系統(tǒng)管理=>管理用戶=>新建用戶。還可以通過讓用戶自行注冊的方式來添加用戶,不過這個功能默認(rèn)是關(guān)閉的,需要通過Jenkins主頁=>系統(tǒng)管理=>Configure Global Security=>勾選允許用戶注冊來開啟該功能,這個時候所有用戶都具有讀寫權(quán)限,如果Jenkins暴露在公網(wǎng),會很不安全。我們需要為不同用戶設(shè)置不同權(quán)限,目前Jenkins支持5種訪問控制策略,我們通過Jenkins主頁=>系統(tǒng)管理=>Configure Global Security=>授權(quán)策略選擇其中的一種,它們的區(qū)別,由于篇幅有限,就不贅述了,推薦選擇安全矩陣策略,在添加用戶/組添加需要進行訪問控制的用戶和用戶組。如下是我的設(shè)置:

Jenkins訪問控制策略

如果我們想進行Python程序的持續(xù)集成,還可能需要安裝Python Plugin(很奇怪的是,我在CentOS服務(wù)器上不安裝它也可以進行持續(xù)集成,而在我的MacBook上不安裝卻無法進行Python項目持續(xù)集成,所以為了保險起見,還是安裝吧),它的安裝路徑是Jenkins 主頁=>系統(tǒng)管理=>插件管理=>可選插件=>Python Plugin。除此之外,這個時候還可以安裝Violations plugin,它的作用是分析代碼行數(shù)。該插件依賴sloccount,因此我們這時候可以通過yum install sloccount安裝。安裝完成后,勾選空閑時重啟Jenkins。重啟之后,我們便可以進行項目構(gòu)建和持續(xù)集成測試了。


首先講公開項目的持續(xù)集成。公開項目的持續(xù)集成,操作比較簡單。我們首先通過下面的目錄結(jié)構(gòu)創(chuàng)建一個Python程序

py_jenkins/
    readme.md
    .gitignore
    tests/
        __init__.py
        auth_tests.py
    py_jenkins/
        __init__.py
        auth.py

該程序放在github上,引用的這篇博客的代碼,我改成了Python3的語法。

進入正題,我們點擊新建開始創(chuàng)建項目,這里我命名為py_jenkins,選擇“構(gòu)建一個自由風(fēng)格的軟件項目”,如下圖

構(gòu)建項目步驟1

然后點擊"OK",進入另一個頁面,如下圖

構(gòu)建項目步驟2

接下來是源碼管理,我們只需要輸入需要構(gòu)建的項目的git地址,這里是

https://github.com/ResolveWang/py_jenkins.git

注意,如果持續(xù)集成服務(wù)器上沒安裝Git客戶端,那么這一步會報錯。接下來是構(gòu)建觸發(fā)器,如下圖

構(gòu)建項目步驟4

這里H/3 * * * *表示每三分鐘,Jenkins就會去檢查一下Git服務(wù)器代碼是否有變化,有的話就會觸發(fā)構(gòu)建操作。

接下來是構(gòu)建環(huán)境,如下圖:

構(gòu)建項目步驟5

再是構(gòu)建的時候的具體操作,這里選擇Execute shell,如果你還有別的需求,可選擇適當(dāng)進行增加選項,如下圖

構(gòu)建項目步驟6

我們再填入構(gòu)建的腳本,內(nèi)容如下

/usr/local/bin/virtualenv env
. env/bin/activate
pip install --quiet nosexcover
pip install --quiet mock
nosetests --with-xcoverage --with-xunit --cover-package=py_jenkins --cover-erase
/usr/local/bin/pylint -f parseable py_jenkins / | tee pylint.out
/usr/bin/sloccount --duplicates --details py_jenkins  > sloccount.sc

注意Execute Shell的命令的執(zhí)行路徑需要寫絕對路徑或在Jenkins中為該命令設(shè)置環(huán)境變量。pylint不能用虛擬環(huán)境的pylint,否則可能報錯。對于路徑問題,可以通過which virtualenv來找到virtualenv在持續(xù)集成服務(wù)器具體的路徑,然后在Jenkins設(shè)置環(huán)境變量,設(shè)置路徑是Jenkins主頁=>系統(tǒng)管理=>系統(tǒng)設(shè)置=>全局屬性,然后點擊增加,如下圖

為命令設(shè)置全局環(huán)境變量

最后增加構(gòu)建后操作--with-xunit選項會生成nosetests.xml文件,--with-xcoverage選項會生成coverage.xml文件。這里我們選擇Publish JUnit test result reportPublish Cobertura Coverage Report,前者會生成本次構(gòu)建的結(jié)果,后者會顯示代碼測試覆蓋率。

構(gòu)建項目步驟7

pylint生成的語法檢查報告pylint.out需要配合Violations plugin插件使用,然后在構(gòu)建后操作中勾選Report Violations,找到pylint的配置并填寫"**/pylint.out",如下圖:

構(gòu)建項目步驟8

最后點擊“保存”。

之后,我們回到首頁,在新建的構(gòu)建名中,點擊“立即構(gòu)建”,如下圖

立即構(gòu)建項目

然后,左下方會出現(xiàn)如下所示進度條

正在構(gòu)建測試

如果構(gòu)建步驟比較類似,可以在新建構(gòu)建項目的時候,可以以已有構(gòu)建流程為模版新建構(gòu)建,如下圖所示

以已有構(gòu)建流程為模版新建構(gòu)建

構(gòu)建結(jié)果如下

構(gòu)建結(jié)果

我們可以點擊“太陽”或者“烏云”圖標(biāo),進入查看構(gòu)建的詳細(xì)信息。其中我們重點關(guān)注的是Console OutputCoverage ReportViolationsTest Result這幾項

具體構(gòu)建信息

再說說私有項目的持續(xù)集成。還是以github為例進行講解。賬號和密碼的方式,我始終未試驗成功,這里我采用的是ssh的方式。先做準(zhǔn)備工作:在Jenkins服務(wù)器上使用

ssh-keygen -t rsa -C "xx@email.com"

來生成公私鑰,在輸入該命令的時候,需要輸入公私鑰的位置,如下

Enter file in which to save the key (/root/.ssh/id_rsa): /root/.ssh/id_rsa
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 

這里在輸入密碼的時候,我直接回車,即空密碼。然后,我們使用cat ~/.ssh/id_rsa.pub查看生成的公鑰,如下

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA5s2HOPlRuEmR8GsAJECFkipgeuuww7qtK6UaURPzCUsXwp9BZ73spNG7fxgu5fj4mkPRsnfWBvKS+0UrEjznNLFQ39/v0TlPohPRcj6a8F4aWx5m7i4PACVmOPLWLjmE8neUDioetw1zWFkPexLprQiQnIKeN3EIa0CVx2+74fJVXYhc+Txk6phsu4Q3kZwUpvnkzQPCysx2c8iKESgkzvr12qWDM10ytZ9X6UaIakzJF00tUSvETEHWbEs8OTv8jbHDtiU64gyZkEyW/vjID/+997JbQa3EvoEJgtziRCjloGy40VQbJ77uI0m/3URv2ar7EiKSV8mJIKrIjSIItw== 1796246076@qq.com

我們需要把上述內(nèi)容復(fù)制到Github上,操作是"點擊個人頭像=>Settings=>SSH and GPG keys=>New ssh key",再把上述內(nèi)容粘貼進去。

之后,可以通過在持續(xù)集成服務(wù)器上使用

ssh -T git@github.com

確認(rèn)公私鑰匹配是否成功,比如我的

Hi ResolveWang! You've successfully authenticated, but GitHub does not provide shell access.

表示可以通過ssh連到github。

這一步完成之后,我們再通過Jenkins主頁=>Credentials=>System=>Global credentials=>add credentials來進行添加剛生成的私鑰(通過cat ~/.ssh/id_rsa查看)和Github登錄用戶名,示意圖如下

添加ssh私鑰示意圖

然后,在構(gòu)建項目的時候,注意不能填寫項目的https地址了,需要填它的ssh地址,并且選擇前面我們保存的證書,如下所示

拷貝github的repo的ssh地址
與構(gòu)建公有項目持續(xù)集成的區(qū)別

再說說項目變更如何觸發(fā)Jenkins的構(gòu)建。這個可以采用webhook的方式,比如各個git服務(wù)器的插件,我用的gogs,那么需要安裝gogs plugin,然后在gogs的對應(yīng)項目的webhook中添加一個鉤子

http://222.105.43.151:8080/gogs-webhook/?job=gogsjenkins

在構(gòu)建的時候Poll SCM留空,如圖

通過webhook觸發(fā)

這樣會在每次push的時候觸發(fā)構(gòu)建。

最后說說怎么在Github、Gogs或者Gitlab等頁面端如何查看每次的自動化測試結(jié)果。

我們可以安裝一個名為Embeddable Build Status的插件,安裝之后重啟Jenkins,再進行項目構(gòu)建,構(gòu)建結(jié)果可以查看Embeddable Build Status,如下圖

構(gòu)建狀態(tài)

這里我們把省略具體構(gòu)建序號,即

http://222.105.43.151:8080/job/pj/badge/icon

那么默認(rèn)就是最新一次構(gòu)建的狀態(tài),我們可以在項目的readme中展示出來。當(dāng)然,除了這種方式之外,還可以在構(gòu)建后設(shè)置,如果構(gòu)建失敗,那么就發(fā)郵件通知相關(guān)人員。


文章最后部分補充一下Jenkins的重要配置。

  • 通過yum安裝Jenkins,那么Jenkins的安裝目錄為cd /var/lib/jenkins/
  • Jenkins配置文件位置為/etc/sysconfig/jenkins,比如我們可以在這個文件修改Jenkins web server的默認(rèn)監(jiān)聽端口和地址。除此之外,還有兩個參數(shù)很重要:JENKINS_HOMEJENKINS_USERJENKINS_HOME是Jenkins的主目錄,Jenkins工作的目錄都放在這里,Jenkins儲存文件的地址,Jenkins的插件,生成的文件都在這個目錄下,JENKINS_USER 是Jenkins的用戶,擁有$JENKINS_HOME/var/log/jenkins的權(quán)限。

還有一點,如果我們修改了JENKINS_HOME所在目錄,那么一定要設(shè)置JENKINS_HOME的權(quán)限為jenkins用戶可以讀寫,或把所有者換成jenkins用戶,否則持續(xù)集成的時候可能會報權(quán)限錯誤。


如果對本文還有疑惑,可以留言,也可以閱讀本文的參考文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,936評論 6 535
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,744評論 3 421
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,879評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,181評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,935評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,325評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,384評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,534評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,084評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,892評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,067評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,623評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,322評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,735評論 0 27
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,990評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,800評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,084評論 2 375

推薦閱讀更多精彩內(nèi)容