用持續集成工具Travis進行構建和部署
摘要:本文簡單說明了如何使用持續集成工具Travis進行構建和部署的過程。
1. 概述
持續集成(Continuous Integration)是軟件開發過程中的重要環節,不論是在開發環境,還是生產環境,其好處都是可以讓團隊盡快得到反饋,從而盡早發現和解決問題,不要等到用戶來報告問題,影響產品和團隊的聲譽。越早越快地發現和解決問題,成本越低,這也是敏捷開發的基本目的之一。
持續集成的工具有不少,著名的有CruiseControl、JetBrains的TeamCity、微軟的Team Foundation Server。本文講的是另外一個相對輕巧的持續集成工具Travis。這個工具的不同之處是,它已經搭建好了,有自己的環境,省去了你用自己的服務器安裝、配置的麻煩。如果你的項目是開源的,只需要在https://travis-ci.org/上用Github的賬號注冊就可以免費使用了;如果不是開源的項目,就要收費了,要用https://travis-ci.com/,具體的收費標准可以參考https://travis-ci.com/plans。下面只講述https://travis-ci.org/的使用和配置,因為https://travis-ci.com/我也沒用過,不過估計收費的功能應該更多更好一些。
2. 選擇項目
在https://travis-ci.org/注冊了賬號之后,在Github賬號下的項目會自動出現在這里,可以選擇哪個項目要用Travis來做持續集成,缺省情況下所有項目都是不做持續集成的。如下圖所示,
3個項目中,只有最后一個項目是要做持續集成的,其它都不做持續集成。你還可以進一步配置,一個項目中的哪個或哪幾個分支要做持續集成,這在后面會講到。
3. 配置
持續集成的配置,必須通過位於項目根目錄下的.travis.yml文件來進行,完整的文檔可以見附錄中的參考資料[1]。
首先,要選擇項目的語言。寫此文時Travis支持15種編程語言,象常用的Java、C、C++、JavasScript (with Node.js)、Objective-C、PHP、Python和Ruby都在支持之列。我的docs項目是個文檔項目,使用Sphinx,所以語言就選擇了Python 2.7,和我的開發環境保持一致。所以,我的.travis.yml文件開始的部分是這樣的:
language: python
python:
- "2.7"
其次,要安裝一些相關的軟件包,可以在install命令中進行安裝,在安裝之前必要的依賴包可以在before_install中進行,所以.travis.yml文件中相應的部分為:
# Use this to prepare the system to install prerequisites or dependencies before_install: "sudo apt-get update" # command to install dependencies install: "pip install -q -r requirements.txt --use-mirrors"
而要安裝的包是在requirements.txt中指定的,其內容如下:
Sphinx==1.2
sphinxcontrib-phpdomain
安裝的Sphinx版本為1.2,最新的Sphinx 1.3在構建的時候會碰到錯誤,所以用舊一些的版本。sphinxcontrib-phpdomain是用來擴展Sphinx的。
4. 構建
構建在script命令中指定。在我的這個項目中,這是最簡單的,我參考的資料也是最簡單的,見[2]。.travis.yml文件中相應的部分為:
# command to build
script: make html
這里執行的命令,如果返回值是0就算成功,否則就算失敗,這是Unix返回值的標准。
前面提到限制項目的分支,可以作如下配置:
# whitelist
branches:
only:
- mybranch
這就是,只有mybranch這個分支要做持續集成,也可以用多行指定多個分支。
這時,就可以提交.travis.yml,並推送到Github服務器,Travis就會自動檢查到這個項目的變化,自動啟動一個虛擬機,來進行持續集成。
可以看到,這是一種按需、即時的方式,和自己安裝、配置服務器進行持續集成的方式相比,更為節省資源,更能實現更好的效果。
5. 部署
部署稍微麻煩一些,因為要涉及到具體的服務器配置。相關的文檔見參考資料[3]。
首先,Travis不支持sftp,詳見考資料[4],這比較遺憾。為保證安全,我打算用ftps。
5.1 安裝、配置服務器上的ftp
先要在服務器(Ubuntu 12.04)上安裝、配置vsftpd,請看參考資料[7]和[8]。
但使用的是普通用戶,不是超級管理員,也沒有sudo的權限。要賦予該用戶sudo的權限,可以把該用戶加入sudo用戶組。見參考資料[5]和[6],使用超級管理員root,執行如下命令:
# sudo usermod -a -G sudo myusername
這就把用戶myusername加入了sudo用戶組,就可以使用sudo來執行超級管理員才能執行的一些管理任務了,以下命令都是該普通用戶執行的。
下面安裝vsftpd,執行如下命令:
$ sudo apt-get install vsftpd
安裝完畢后,配置vsftpd,這都是通過修改/etc/vsftpd.conf完成的。先禁止匿名用戶:
# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
anonymous_enable=NO
再允許服務器的本地用戶(即myusername等)使用ftp:
# Uncomment this to allow local users to log in.
local_enable=YES
因為是要上傳構建得到的文件到服務器,所以還要開啟寫入操作:
# Uncomment this to enable any form of FTP write command.
write_enable=YES
ftp使用端口21作為控制通道,供用戶接入、登錄、登出等交換控制信息使用。另外,還需要數據通道,傳輸上載、下載的數據。在主動模式下,數據通道缺省為端口20,這個我沒有改。在被動模式下,需要自行設置一組端口:
# These two options set the ports for passive mode. pasv_min_port=6789 pasv_max_port=6890
最后,需要在防火牆的設置中開啟這些涉及的端口,20、21、6789-6890,這是朋友幫助做的,我也不知道具體如何操作的。
最后,可用瀏覽器訪問ftp服務器,並上傳、下載文件,驗證以上配置正確。
5.2 配置Travis使用ftp部署
Travis的各個執行環節中,還有一個環節after_success,這是在script命令執行成功之后執行的。部署就是在這個環節進行的,添加如下配置到.travis.yml文件中:
after_success:
"find ./make/output -type f -exec curl --ftp-create-dirs -u $FTP_USER:$FTP_PASSWORD -T {} ftp://123.45.67.89/myproject/{} \\;"
這個命令由find找出要部署的文件,然后交給curl,上傳到服務器上。其中,./make/output為構建的輸出目錄,123.45.67.89是服務器的IP地址,/myproject/為服務器上要部署的目錄。$FTP_USER和$FTP_PASSWORD是Travis持續集成的環境變量,需要在.travis.yml文件中單獨設置:
env: global: - "FTP_USER=myusername" - "FTP_PASSWORD=mypassword"
到此,一個基本的包括構建和部署的Travis持續集成環境就算是配置好了。每次這個項目推送到Github庫的指定分支,Travis就是自動檢測到,自動進行構建,構建成功后就會自動部署到指定的服務器上。
完整的.travis.yml文件如下:
language: python python: - "2.7" env: global: - "FTP_USER=myusername" - "FTP_PASSWORD=mypassword" # whitelist branches: only: - mybranch # Use this to prepare the system to install prerequisites or dependencies before_install: "sudo apt-get update" # command to install dependencies install: "pip install -q -r requirements.txt --use-mirrors" # command to build script: make html after_success: "find ./make/output -type f -exec curl --ftp-create-dirs -u $FTP_USER:$FTP_PASSWORD -T {} ftp://123.45.67.89/myproject/{} \\;"
6. 結語
本文只是介紹了利用Travis進行持續集成的簡單配置,還有一些問題沒有說明或解決,比如:
- ftp不夠安全,是否可以使用ftps來加強安全性?
- Travis的配置文件中,ftp的用戶名和密碼是明文,是可以加密的。
有興趣的朋友,可以自己研究Travis的文檔。
附錄. 參考資料
- Travis CI Documentation
http://docs.travis-ci.com/ - Have Travis-CI test your Sphinx docs
https://coderwall.com/p/wws2uq/have-travis-ci-test-your-sphinx-docs - how to deploy to own server using ftp
http://docs.travis-ci.com/user/deployment/custom/ - curl: (1) Protocol sftp not supported or disabled in libcurl
https://github.com/travis-ci/travis-ci/issues/2556 - How do I grant sudo privileges to an existing user? [duplicate]
http://askubuntu.com/questions/168280/how-do-i-grant-sudo-privileges-to-an-existing-user - How can I add a new user as sudoer using the command line?
http://askubuntu.com/questions/7477/how-can-i-add-a-new-user-as-sudoer-using-the-command-line - Ubuntu 12.04 » Ubuntu Server Guide » File Servers » FTP Server
https://help.ubuntu.com/12.04/serverguide/ftp-server.html - vsftpd
https://help.ubuntu.com/community/vsftpd