jenkins+python持續集成

1.安裝

搜索jenkins,進入官網,5分鐘之內相信你能找到適合你操做系統的安裝步驟。此處爲省事,列出centos步驟(注意安裝穩定版)java

sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat-stable/jenkins.repo
sudo rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
sudo yum install jenkins
若是你係統裏沒有Java,那麼sudo yum install java
啓停service jenkins start/stop/restart
或者systemctl start/stop/restart jenkins

不要問service start xxx和systemctl(centos7引入)啥關係,後者是用來替代前者的。具體問百度。啓動後,驗證安裝是否成功,瀏覽器訪問http://localhost:8080/,看到老爺爺(jenkins logo)就行。python

要是遇到奇葩問題,看這裏 https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+on+Red+Hat+distributionsgit

2.配置

  • 配置前安裝必要插件:web

    Git Plugin:使用Git做爲源代碼管理shell

    Python Plugin:Adds the ability to execute python scripts as build steps.django

    Violations:代碼質量檢測,支持pylint、jslint等centos

  • 配置job瀏覽器

    1.新建-->job-->自由風格bash

    2.填寫git 地址,觸發器選擇Poll SCM, Schedule可選服務器

    3.填寫腳本:第二行#!/usr/bin/bash/...是給jenkins看的,讓jenkins不要輸出每條命令

     #!/usr/bin/bash
     #!/usr/bin/bash/...
     source /home/luodaihong/py27/bin/activate
     cd /home/luodaihong/workspace/django-privilege/example
     coverage run  --source=privilege  manage.py test privilege
     coverage report -m --skip-covered
     pylint --output-format=parseable privilege > pylint.xml || exit 0

    coverage pylint本身安裝咯

    4.增長構建後操做步驟-->Report Violations--> pylint後填寫pylint.xml --->Faux Project Path填寫實際工程路徑,也就是腳本中cd的路徑

3.簡單使用

建好工程後,構建一次玩玩唄,點擊構建詳情,等待構建完畢,看到代碼風格統計圖, Console Output裏看到單元測試經過狀況,代碼覆蓋狀況。遇到問題:

  • 初始安裝後基本都能運行jenkin並看到jenkins web頁面,不然重裝。修修改改後進程起不來,多看看權限問題,特別是修改jenkins_user

  • 配置的job怎麼都不按預期執行,先手動命令行執行,確認無誤後查看jenkins環境變量



安裝

Installing Jenkins。它也支持經過Docker安裝,真的是緊跟潮流!

須要提的一點是Jenkins比較耗內存,不運行任何構建任務的狀況下就吃掉了300多M,再加上構建任務時會佔用更多,因此建議服務器的內存至少有1G,512M的話極可能在執行構建任務的時候內存不夠用。

訪問控制

安裝後默認全部人均可以訪問,故須要更改訪問控制策略,具體見Standard Security Setup

插件清單

下面是我用到的一些插件:

  • Git Plugin:使用Git做爲源代碼管理

  • SSH plugin:遠程ssh登陸server執行命令

  • Parameterized Trigger Plugin:觸發其餘的job

  • Cobertura Plugin:代碼測試覆蓋率報告

  • Task Scanner Plugin:檢測代碼中出現的特殊標記(如TODO等)

  • Violations:代碼質量檢測,支持pylint、jslint等

  • ThinBackup:用於備份Jenkins

  • SCM Sync configuration plugin:將Jenkens的配置變動同步到SCM中

這裏只是集中地列舉一下,具體的使用會在下面穿插介紹。

測試、Staging部署、Production部署流程

根據本項目的須要,在Jenkins中創建了3個任務:

  • tm_test:用於執行測試、代碼質量檢測等

  • tm_staging_deploy:用於在staging服務器上deploy代碼

  • tm_deploy:用於在production服務器上deploy代碼

Image Title

其中staging服務器用於進行線上測試,staging服務器和production服務器的環境必須保持徹底相同(固然,staging服務器配置能夠低一些)。

具體的開發、測試、部署流程是:

  • 在開發新功能/修復bug的時候,通常是開新分支;但若是是那種很小的修改,則直接在master上改,這樣比較省事兒

  • 新功能開發完成/bug修復後,進行單元測試+人工測試,若是經過,合併到master

  • 每次master有變更後,觸發tm_test任務,執行集成的單元測試和代碼質量檢測,若是OK,則自動觸發tm_staging_deploy,部署到staging服務器上

  • 若tm_staging_deploy成功,則登錄到運行在staging服務器的測試網站上,人工測試新功能是否OK/bug是否已修復;若tm_staging_deploy失敗,檢查失敗緣由,進行修復,直至成功

  • 若staging人工測試經過,則手動觸發tm_deploy,部署到生產服務器上

  • 登陸到生產服務器上進行人工測試,若出現問題,進行修復;同時密切關注Sentry發送的告警郵件,爭取在第一時間修復錯誤

比較簡單,沒有采用Git-Flow/GitHub-Flow,單元測試寫得很淺,也沒有作代碼審查。不過團隊規模小,從目前來看,上面的流程是夠用的。

下面對這三個任務作較爲詳細的介紹。

tm_test

該任務用於執行測試、代碼質量檢測等。

push觸發構建

每當項目倉庫的master分支有變更時,即會觸發tm_test。要作這一點,須要以下步驟:

  • 設置tm_test的Build Triggers爲Poll SCM,但不填Schedule

  • 爲項目倉庫添加Web Hook,URL填寫http://<Jenkins URL>/git/notifyCommit?url=<URL of the Git repository>

參考Stack Overflow

使用virtualenv配置測試環境

執行測試以前,須要肯定Python版本(通常是2.7),而後根據此版本初始化virtualenv。

在構建中添加Execute shell項:

if [ ! -d "venv" ]; then    virtualenv -p /usr/bin/python2.7 venvfi

. venv/bin/activate
pip install -i http://pypi.douban.com/simple -r requirements.txt

測試與報告

測試中須要2個庫:nose用於執行單元測試,coverage用於統計測試覆蓋率。

須要在Jenkins中安裝Cobertura Plugin插件,用於生成代碼測試覆蓋率報告。

而後在構建中添加Execute shell項,輸入:

nosetests --with-xunit --with-coverage --cover-package=tm && coverage xml

其中--with-xunit告訴nose輸出JUnit形式的測試報告,--with-coverage表示同時運行coverage(這個功能至關贊),--cover-package=tm表示僅對指定的package執行測試覆蓋率檢測,後面的coverage xml表示輸出xml格式的coverage報告。

而後在構建後操做中,添加以下2項:

  • Publish JUnit test result report:填寫nosetests.xml

  • Publish Cobertura Coverage Report:填寫coverage.xml

這樣一來,就能夠執行測試,並獲得測試報告和測試覆蓋率報告啦:

Image Title

上面的圖表都是可點擊的,點進去後有代碼級的詳細報告,很是贊:

Image Title

綠色的代碼行表示已經覆蓋到,紅色則沒有。

代碼質量檢測

Jenkins有一個蠻不錯的代碼質量報告插件:Violations,支持很是多的代碼測試工具。目前項目中使用Pylint作Python代碼質量檢測,使用JSHint作JavaScript代碼質量檢測。

在安裝好Pylint後,運行pylint --generate-rcfile > pylintrc生成配置文件,並將其中的output-format項的值改成parseable

而後在構建中添加2項Execute shell項,

pylint:

pylint tm2 > pylint.xml || exit 0

jshint:

jshint --reporter=jslint $WORKSPACE/tm2/static/js/ > jslint.xml || exit 0

其中的exit 0是爲了告訴Jenkins該命令執行成功。對於jshint來講,report選擇jslint,而後須要使用$WORKSPACE組成絕對路徑,不然沒法看到源碼級的分析報告(是否是一個bug?)。

而後在構建後步驟中添加Violations Report,在對應位置輸入jslint.xml和pylint.xml。

最終的圖形報告以下,能夠看到趨勢走向:

Image Title

源碼級別的分析也有:

Image Title

檢測代碼中的特殊標註(如TODO)

團隊中約定,在代碼未完成的地方使用TODO進行標記,由於PyCharm有一個很好的功能就是能夠檢測出代碼中的全部TODO信息:

Image Title

Jenkins中也有一個很是棒的插件Task Scanner Plugin用於檢測代碼中出現的特殊標記,固然,這些特殊標記徹底是能夠自定義的。

安裝完該插件後,在構建後操做中添加一項Scan workspace for open tasks,根據須要填寫配置:

Image Title

而後報告就能夠出來啦:

Image Title

郵件告警

若是構建後狀態是unstable或failed,則能夠發送郵件告警,及時通知相關負責人進行處理。Jenkins自帶SMTP功能,不過須要你提供SMTP服務器。

我使用的是qq郵箱SMTP服務器,挺好用的,目前沒有發現拒發的狀況。有一點須要注意的是,在配置好SMTP的帳戶信息後,還需填寫系統管理員郵件地址,不然會發送失敗,這也是比較容易忽略的地方。

配置好SMTP後,而後在構建後操做中添加E-mail Notification項,填寫負責人的郵箱便可。

觸發下游任務

若是tm_test構建成功,則須要自動觸發tm_staging_deploy任務,這個觸發過程是經過插件Parameterized Trigger Plugin來完成的。

在構建後操做中添加Trigger parameterized build on other projects項,選擇觸發條件爲stable,而後填寫待出發的任務名稱便可。

最後的tm_test任務面板以下:

Image Title

界面是挺out的,不過很實用。

tm_staging_deploy

這一個job用於將最新代碼部署到staging服務器上,我採用的部署方法是經過ssh遠程登錄服務器執行命令的方式,須要一個插件SSH plugin。

而後在構建中添加Shell項:

cd /var/www/tmexport MODE=PRODUCTION
git reset --hard HEAD
git pull -fsource venv/bin/activate
pip install -r requirements.txt
python manage.py db upgrade
supervisorctl restart tm

tm_deploy

此任務和tm_staging_deploy基本差很少,不一樣的地方有2個:(1)目標服務器不一樣(2)觸發方式是手動觸發

備份

使用thinBackup進行備份,可設定備份週期。

配置變動同步

除此以外,我還用到了一個頗有用的插件SCM Sync configuration plugin,就是把Jenkins的配置(全局配置+各job配置)同步到一個Git倉庫中。這樣的話,每次配置有變更,都會造成一個commit推送到Git倉庫。

這至關於把配置的歷史變遷都記錄下來,若是哪天Jenkins任務掛了,能夠看看配置變動進行排錯。

相關文章
相關標籤/搜索