打算寫這樣一個系列,說說我們在360裡面,如何使用Python。在360,除非是需要包含在360用戶端軟體當中的功能,科技人員使用什麼語言進行開發,更多的是一種個人,最多是項目團隊的决定。囙此我們的同事會使用php寫頁面,用python的工具,用c/ c++寫模塊,甚至用易語言寫介面。
也正是因為這個原因,雖然這個標題寫得很大,但其實我也只能寫一下我所在的團隊如何使用Python。我們目前有Python程式碼約6萬行,程式運行在Linux下,使用Python2.5和Python 2.7環境。
這6萬行Python程式碼被被分成80餘個項目進行組織。每個項目提供一個或一組完整的功能集合,每個項目都有自己的setup.py檔案用來將項目程式碼打包成Python發佈包(Distribution),部分項目還有自動檔案生成,我們使用的是Sphinx和reST格式的文字。打包好的Python包被發佈到我們自己搭建的內網的與pypi.python.org相容的私有pypi服務器上,而檔案保存在內網的類似於readthedocs的服務器上。
後臺團隊的程式碼主要運行我們自己的Linux伺服器集群上,開發和部署的成本比較低,囙此我們使用比較敏捷的開發流程。流程大體上可以分為下麵幾個步驟:
- 開發:顧名思義,這個步驟當中,開發人員在開發機上面寫程式碼實現功能,不同的開發人員的開發環境使用擴展過的virtualenv腳本進行隔離;
- 單元測試:開發人員負責對程式碼當中的關鍵部分進行單元測試,通常使用unittest,我們使用nose將測試用例聚合和進行回歸測試,不定期使用coverage確定程式碼測試覆蓋率(集成在nose當中)。這一步還會使用PyLint對程式碼進行掃描;
- 構建:使用python distribute將Python程式碼構建成包,同時將這個包發佈到測試版pypi服務器(pypi-testing),測試版pypi服務器是我們搭建的若干個私有pypi其中之一,發佈工作使用的是我們擴展的distribute命令;
- 測試:在測試機器或測試流程當中,從測試版pypi當中獲取最新的庫並測試,這個部署過程我們使用distribute提供的easy_install工具進行;
- 發佈:將經過測試的包從測試版pypi服務器移到發佈版pypi服務器,這個同樣通過擴展的distribute命令;
- 部署:運維人員從發佈版pypi服務器上獲取最新的庫,並更新到真實的服務器上,並應用新的變更。這個過程當中任何一臺單機部署使用的都是easy_install,在分佈式環境下,我們使用Fabric進行多機部署;
- 監控:新版本上線之後,會持續通過日誌和報警系統進行系統監控。我們專門擴展了logging模塊以便適應我們的監控需求。
熟悉Python的朋友們可能看到這些名詞和包都很熟悉,因為我們所使用的都是業界廣泛使用的開發、測試和運維的工具。但這些工具很多都適合於開源軟件(Open Source Software)而非私有軟件(Proprietary Software),例如distribute與pypi.python.org的結合是天衣無縫的,Sphinx和readthedocs也是很容易結合,但是作為一個私有軟件,我們無法將程式碼和檔案放到pypi或readthedocs上面。為此我們幾乎複製了整套的基礎架構,包括pypi服務,readthedocs服務等,後續我會介紹我們如何做到這點的。希望這個系列對於其他正在使用Python開發私有軟件的同仁能有些幫助。
[to be continue]
作者ftofficer|張聰發表於2012-11-13 02:20:31,添加在分類後臺科技下,最後修改於2018-08-14 06:59:21
ftofficer|张聪
后台技术