用持續集成工具Travis進行構建和部署


用持續集成工具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的文檔。

 

附錄. 參考資料

  1. Travis CI Documentation
    http://docs.travis-ci.com/
  2. Have Travis-CI test your Sphinx docs
    https://coderwall.com/p/wws2uq/have-travis-ci-test-your-sphinx-docs
  3. how to deploy to own server using ftp
    http://docs.travis-ci.com/user/deployment/custom/
  4. curl: (1) Protocol sftp not supported or disabled in libcurl
    https://github.com/travis-ci/travis-ci/issues/2556
  5. 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
  6. 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
  7. Ubuntu 12.04 » Ubuntu Server Guide » File Servers » FTP Server
    https://help.ubuntu.com/12.04/serverguide/ftp-server.html
  8. vsftpd
    https://help.ubuntu.com/community/vsftpd
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM