編寫代碼只是軟件開發的一小部分,更多的時間每每花在構建(build)和測試(test)。javascript
爲了提升軟件開發的效率,構建和測試的自動化工具層出不窮。Travis CI 就是這類工具之中,市場份額最大的一個。html
本文介紹 Travis CI 的基本用法。用好這個工具不只能夠提升效率,還能使開發流程更可靠和專業化,從而提升軟件的價值。並且,它對於開源項目是免費的,不花一分錢,就能幫你作掉不少事情。java
Travis CI 提供的是持續集成服務(Continuous Integration,簡稱 CI)。它綁定 Github 上面的項目,只要有新的代碼,就會自動抓取。而後,提供一個運行環境,執行測試,完成構建,還能部署到服務器。node
持續集成指的是隻要代碼有變動,就自動運行構建和測試,反饋運行結果。確保符合預期之後,再將新代碼"集成"到主幹。python
持續集成的好處在於,每次代碼的小幅變動,就能看到運行結果,從而不斷累積小的變動,而不是在開發週期結束時,一會兒合併一大塊代碼。git
Travis CI 只支持 Github,不支持其餘代碼託管服務。這意味着,你必須知足如下條件,才能使用 Travis CI。github
- 擁有 GitHub 賬號
- 該賬號下面有一個項目
- 該項目裏面有可運行的代碼
- 該項目還包含構建或測試腳本
若是這些條件都沒問題,就能夠開始使用 Travis CI 了。npm
首先,訪問官方網站 travis-ci.org,點擊右上角的我的頭像,使用 Github 帳戶登入 Travis CI。bash
Travis 會列出 Github 上面你的全部倉庫,以及你所屬於的組織。此時,選擇你須要 Travis 幫你構建的倉庫,打開倉庫旁邊的開關。一旦激活了一個倉庫,Travis 會監聽這個倉庫的全部變化。服務器
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
。
Travis 的運行流程很簡單,任何項目都會通過兩個階段。
- install 階段:安裝依賴
- script 階段:運行腳本
install
字段用來指定安裝腳本。
install: ./install-dependencies.sh
若是有多個腳本,能夠寫成下面的形式。
install: - command1 - command2
上面代碼中,若是command1
失敗了,整個構建就會停下來,再也不往下進行。
若是不須要安裝,即跳過安裝階段,就直接設爲true
。
install: true
script
字段用來指定構建或測試腳本。
script: bundle exec thor build
若是有多個腳本,能夠寫成下面的形式。
script: - command1 - command2
注意,script
與install
不同,若是command1
失敗,command2
會繼續執行。可是,整個構建階段的狀態是失敗。
若是command2
只有在command1
成功後才能執行,就要寫成下面這樣。
script: command1 && command2
Node 項目的環境須要寫成下面這樣。
language: node_js node_js: - "8"
上面代碼中,node_js
字段用來指定 Node 版本。
Node 項目的install
和script
階段都有默認腳本,能夠省略。
install
默認值:npm installscript
默認值:npm test
更多設置請看官方文檔。
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
其餘部署方式,請看官方文檔。
Travis 爲上面這些階段提供了7個鉤子。
- before_install:install 階段以前執行
- before_script:script 階段以前執行
- after_failure:script 階段失敗時執行
- after_success:script 階段成功時執行
- before_deploy:deploy 步驟以前執行
- after_deploy:deploy 步驟以後執行
- after_script:script 階段以後執行
完整的生命週期,從開始到結束是下面的流程。
- before_install
- install
- before_script
- script
- aftersuccess or afterfailure
- [OPTIONAL] before_deploy
- [OPTIONAL] deploy
- [OPTIONAL] after_deploy
- 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
。
最後,Travis 每次運行,可能會返回四種狀態。
- passed:運行成功,全部步驟的退出碼都是
0
- canceled:用戶取消執行
- errored:
before_install
、install
、before_script
有非零退出碼,運行會當即中止- failed :
script
有非零狀態碼 ,會繼續運行
.travis.yml
的env
字段能夠定義環境變量。
env: - DB=postgres - SH=bash - PACKAGE_VERSION="1.0.*"
而後,腳本內部就使用這些變量了。
有些環境變量(好比用戶名和密碼)不能公開,這時能夠經過 Travis 網站,寫在每一個倉庫的設置頁裏面,Travis 會自動把它們加入環境變量。這樣一來,腳本內部依然可使用這些環境變量,可是隻有管理員才能看到變量的值。具體操做請看官方文檔。
若是不放心保密信息明文存在 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
詳細信息請看官方文檔。
若是要加密的是文件(好比私鑰),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.yml
的before_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.
詳細信息請看官方文檔,實際的例子能夠參考下面兩篇文章。