持續集成服務 Travis CI 教程{轉}

編寫代碼只是軟件開發的一小部分,更多的時間每每花在構建(build)和測試(test)。javascript

爲了提升軟件開發的效率,構建和測試的自動化工具層出不窮。Travis CI 就是這類工具之中,市場份額最大的一個。html

本文介紹 Travis CI 的基本用法。用好這個工具不只能夠提升效率,還能使開發流程更可靠和專業化,從而提升軟件的價值。並且,它對於開源項目是免費的,不花一分錢,就能幫你作掉不少事情。java

1、什麼是持續集成?

Travis CI 提供的是持續集成服務(Continuous Integration,簡稱 CI)。它綁定 Github 上面的項目,只要有新的代碼,就會自動抓取。而後,提供一個運行環境,執行測試,完成構建,還能部署到服務器。node

持續集成指的是隻要代碼有變動,就自動運行構建和測試,反饋運行結果。確保符合預期之後,再將新代碼"集成"到主幹。python

持續集成的好處在於,每次代碼的小幅變動,就能看到運行結果,從而不斷累積小的變動,而不是在開發週期結束時,一會兒合併一大塊代碼。git

2、使用準備

Travis CI 只支持 Github,不支持其餘代碼託管服務。這意味着,你必須知足如下條件,才能使用 Travis CI。github

  • 擁有 GitHub 賬號
  • 該賬號下面有一個項目
  • 該項目裏面有可運行的代碼
  • 該項目還包含構建或測試腳本

若是這些條件都沒問題,就能夠開始使用 Travis CI 了。npm

首先,訪問官方網站 travis-ci.org,點擊右上角的我的頭像,使用 Github 帳戶登入 Travis CI。bash

Travis 會列出 Github 上面你的全部倉庫,以及你所屬於的組織。此時,選擇你須要 Travis 幫你構建的倉庫,打開倉庫旁邊的開關。一旦激活了一個倉庫,Travis 會監聽這個倉庫的全部變化。服務器

3、.travis.yml

Travis 要求項目的根目錄下面,必須有一個.travis.yml文件。這是配置文件,指定了 Travis 的行爲。該文件必須保存在 Github 倉庫裏面,一旦代碼倉庫有新的 Commit,Travis 就會去找這個文件,執行裏面的命令。

這個文件採用 YAML 格式。下面是一個最簡單的 Python 項目的.travis.yml文件。

language: python script: true 

上面代碼中,設置了兩個字段。language字段指定了默認運行環境,這裏設定使用 Python 環境。script字段指定要運行的腳本,script: true表示不執行任何腳本,狀態直接設爲成功。

Travis 默認提供的運行環境,請參考官方文檔 。目前一共支持31種語言,之後還會不斷增長。

下面是一個稍微複雜一點的.travis.yml

language: python sudo: required before_install: sudo pip install foo script: py.test 

上面代碼中,設置了四個字段:運行環境是 Python,須要sudo權限,在安裝依賴以前須要安裝foo模塊,而後執行腳本py.test

4、運行流程

Travis 的運行流程很簡單,任何項目都會通過兩個階段。

  • install 階段:安裝依賴
  • script 階段:運行腳本

4.1 install 字段

install字段用來指定安裝腳本。

install: ./install-dependencies.sh 

若是有多個腳本,能夠寫成下面的形式。

install: - command1 - command2 

上面代碼中,若是command1失敗了,整個構建就會停下來,再也不往下進行。

若是不須要安裝,即跳過安裝階段,就直接設爲true

install: true 

4.二、script 字段

script字段用來指定構建或測試腳本。

script: bundle exec thor build 

若是有多個腳本,能夠寫成下面的形式。

script: - command1 - command2 

注意,scriptinstall不同,若是command1失敗,command2會繼續執行。可是,整個構建階段的狀態是失敗。

若是command2只有在command1成功後才能執行,就要寫成下面這樣。

script: command1 && command2 

4.3 實例:Node 項目

Node 項目的環境須要寫成下面這樣。

language: node_js node_js: - "8" 

上面代碼中,node_js字段用來指定 Node 版本。

Node 項目的installscript階段都有默認腳本,能夠省略。

  • install默認值:npm install
  • script默認值:npm test

更多設置請看官方文檔

4.4 部署

script階段結束之後,還能夠設置通知步驟(notification)和部署步驟(deployment),它們不是必須的。

部署的腳本能夠在script階段執行,也可使用 Travis 爲幾十種常見服務提供的快捷部署功能。好比,要部署到 Github Pages,能夠寫成下面這樣。

deploy: provider: pages skip_cleanup: true github_token: $GITHUB_TOKEN # Set in travis-ci.org dashboard on: branch: master 

其餘部署方式,請看官方文檔

4.5 鉤子方法

Travis 爲上面這些階段提供了7個鉤子。

  • before_install:install 階段以前執行
  • before_script:script 階段以前執行
  • after_failure:script 階段失敗時執行
  • after_success:script 階段成功時執行
  • before_deploy:deploy 步驟以前執行
  • after_deploy:deploy 步驟以後執行
  • after_script:script 階段以後執行

完整的生命週期,從開始到結束是下面的流程。

  1. before_install
  2. install
  3. before_script
  4. script
  5. aftersuccess or afterfailure
  6. [OPTIONAL] before_deploy
  7. [OPTIONAL] deploy
  8. [OPTIONAL] after_deploy
  9. after_script

下面是一個before_install鉤子的例子。

before_install: - sudo apt-get -qq update - sudo apt-get install -y libxml2-dev 

上面代碼表示before_install階段要作兩件事,第一件事是要更新依賴,第二件事是安裝libxml2-dev。用到的幾個參數的含義以下:-qq表示減小中間步驟的輸出,-y表示若是須要用戶輸入,老是輸入yes

4.6 運行狀態

最後,Travis 每次運行,可能會返回四種狀態。

  • passed:運行成功,全部步驟的退出碼都是0
  • canceled:用戶取消執行
  • errored:before_installinstallbefore_script有非零退出碼,運行會當即中止
  • failed :script有非零狀態碼 ,會繼續運行

5、使用技巧

5.1 環境變量

.travis.ymlenv字段能夠定義環境變量。

env: - DB=postgres - SH=bash - PACKAGE_VERSION="1.0.*" 

而後,腳本內部就使用這些變量了。

有些環境變量(好比用戶名和密碼)不能公開,這時能夠經過 Travis 網站,寫在每一個倉庫的設置頁裏面,Travis 會自動把它們加入環境變量。這樣一來,腳本內部依然可使用這些環境變量,可是隻有管理員才能看到變量的值。具體操做請看官方文檔

5.2 加密信息

若是不放心保密信息明文存在 Travis 的網站,可使用 Travis 提供的加密功能。

首先,安裝 Ruby 的包travis

$ gem install travis

而後,就能夠用travis encrypt命令加密信息。

在項目的根目錄下,執行下面的命令。

$ travis encrypt SOMEVAR=secretvalue 

上面命令中,SOMEVAR是要加密的變量名,secretvalue是要加密的變量值。執行之後,屏幕上會輸出以下信息。

secure: ".... encrypted data ...." 

如今,就能夠把這一行加入.travis.yml

env: global: - secure: ".... encrypted data ...." 

而後,腳本里面就可使用環境變量$SOMEVAR了,Travis 會在運行時自動對它解密。

travis encrypt命令的--add參數會把輸出自動寫入.travis.yml,省掉了修改env字段的步驟。

$ travis encrypt SOMEVAR=secretvalue --add 

詳細信息請看官方文檔

5.3 加密文件

若是要加密的是文件(好比私鑰),Travis 提供了加密文件功能。

安裝命令行客戶端之後,使用下面的命令登入 Travis CI。

$ travis login

而後,進入項目的根目錄,使用travis encrypt-file命令加密那些想要加密的文件。

$ travis encrypt-file bacon.txt encrypting bacon.txt for rkh/travis-encrypt-file-example storing result as bacon.txt.enc storing secure env variables for decryption Please add the following to your build script (before_install stage in your .travis.yml, for instance): openssl aes-256-cbc -K $encrypted_0a6446eb3ae3_key -iv $encrypted_0a6446eb3ae3_key -in bacon.txt.enc -out bacon.txt -d Pro Tip: You can add it automatically by running with --add. Make sure to add bacon.txt.enc to the git repository. Make sure not to add bacon.txt to the git repository. Commit all changes to your .travis.yml. 

上面的代碼對文件bacon.txt進行加密,加密後會生成bacon.txt.enc,該文件須要提交到代碼庫。此外,該命令還會生成一個環境變量$encrypted_0a6446eb3ae3_key,保存密鑰,儲存在 Travis CI,文件解密時須要這個環境變量。你須要把解密所需的openssl命令,寫在.travis.ymlbefore_install字段裏面。這些都寫在上面的命令行提示裏面。

--add參數能夠自動把環境變量寫入.travis.yml

$ travis encrypt-file bacon.txt --add encrypting bacon.txt for rkh/travis-encrypt-file-example storing result as bacon.txt.enc storing secure env variables for decryption Make sure to add bacon.txt.enc to the git repository. Make sure not to add bacon.txt to the git repository. Commit all changes to your .travis.yml. 

詳細信息請看官方文檔,實際的例子能夠參考下面兩篇文章。

相關文章
相關標籤/搜索