什么是持續(xù)集成?
Travis CI 提供的是持續(xù)集成服務(wù)(Continuous Integration,簡稱 CI)。它綁定 Github 上面的項目,只要有新的代碼,就會自動抓取。然后,提供一個運(yùn)行環(huán)境,執(zhí)行測試,完成構(gòu)建,還能部署到服務(wù)器。
持續(xù)集成指的是只要代碼有變更,就自動運(yùn)行構(gòu)建和測試,反饋運(yùn)行結(jié)果。確保符合預(yù)期以后,再將新代碼"集成"到主干。
持續(xù)集成的好處在于,每次代碼的小幅變更,就能看到運(yùn)行結(jié)果,從而不斷累積小的變更,而不是在開發(fā)周期結(jié)束時,一下子合并一大塊代碼。
The goal is to build healthier software by developing and testing in smaller increments. This is where Travis CI comes in.
我們的目標(biāo)是通過以較小的增量開發(fā)和測試來構(gòu)建更健康的軟件。 這就是 Travis CI 的用武之地。
Travis 要求項目的根目錄下面,必須有一個.travis.yml文件。這是配置文件,指定了 Travis 的行為。該文件必須保存在 Github 倉庫里面,一旦代碼倉庫有新的 Commit,Travis 就會去找這個文件,執(zhí)行里面的命令。
這個文件采用 YAML 格式。下面是一個最簡單的 Python 項目的.travis.yml文件。
language: python
script: true
上面代碼中,設(shè)置了兩個字段。language字段指定了默認(rèn)運(yùn)行環(huán)境,這里設(shè)定使用 Python 環(huán)境。script字段指定要運(yùn)行的腳本,script: true表示不執(zhí)行任何腳本,狀態(tài)直接設(shè)為成功。
Travis 默認(rèn)提供的運(yùn)行環(huán)境,請參考官方文檔 。目前一共支持31種語言,以后還會不斷增加。
下面是一個稍微復(fù)雜一點的.travis.yml。
language: python
sudo: required
before_install: sudo pip install foo
script: py.test
上面代碼中,設(shè)置了四個字段:運(yùn)行環(huán)境是 Python,需要sudo權(quán)限,在安裝依賴之前需要安裝foo模塊,然后執(zhí)行腳本py.test。
運(yùn)行流程
Travis 的運(yùn)行流程很簡單,任何項目都會經(jīng)過兩個階段。
install 階段:安裝依賴
script 階段:運(yùn)行腳本
install 字段
install字段用來指定安裝腳本。
install: ./install-dependencies.sh
如果有多個腳本,可以寫成下面的形式。
install:
- command1
- command2
上面代碼中,如果command1失敗了,整個構(gòu)建就會停下來,不再往下進(jìn)行。
如果不需要安裝,即跳過安裝階段,就直接設(shè)為true。
install: true
script 字段
script字段用來指定構(gòu)建或測試腳本。
script: bundle exec thor build
如果有多個腳本,可以寫成下面的形式。
script:
- command1
- command2
注意,script與install不一樣,如果command1失敗,command2會繼續(xù)執(zhí)行。但是,整個構(gòu)建階段的狀態(tài)是失敗。
如果command2只有在command1成功后才能執(zhí)行,就要寫成下面這樣。
script: command1 && command2
實例:Node 項目
Node 項目的環(huán)境需要寫成下面這樣。
language: node_js node_js: - "8"
上面代碼中,node_js字段用來指定 Node 版本。
Node 項目的install和script階段都有默認(rèn)腳本,可以省略。
install默認(rèn)值:npm installscript默認(rèn)值:npm test
更多設(shè)置請看官方文檔。
部署
script階段結(jié)束以后,還可以設(shè)置通知步驟(notification)和部署步驟(deployment),它們不是必須的。
部署的腳本可以在script階段執(zhí)行,也可以使用 Travis 為幾十種常見服務(wù)提供的快捷部署功能。比如,要部署到 Github Pages,可以寫成下面這樣。
deploy: provider: pages skip_cleanup: true github_token: $GITHUB_TOKEN # Set in travis-ci.org dashboard on: branch: master
其他部署方式,請看官方文檔。
完整的生命周期,從開始到結(jié)束是下面的流程。
before_install install 階段之前執(zhí)行
install
before_script
script
aftersuccess or afterfailure
[OPTIONAL] before_deploy
[OPTIONAL] deploy
[OPTIONAL] after_deploy
after_script script 階段之后執(zhí)行
運(yùn)行狀態(tài)
最后,Travis 每次運(yùn)行,可能會返回四種狀態(tài)。
passed:運(yùn)行成功,所有步驟的退出碼都是0
canceled:用戶取消執(zhí)行
errored:before_install、install、before_script有非零退出碼,運(yùn)行會立即停止
failed :script有非零狀態(tài)碼 ,會繼續(xù)運(yùn)行
使用技巧
環(huán)境變量
.travis.yml的env字段可以定義環(huán)境變量。
env: - DB=postgres - SH=bash - PACKAGE_VERSION="1.0.*"
然后,腳本內(nèi)部就使用這些變量了。
有些環(huán)境變量(比如用戶名和密碼)不能公開,這時可以通過 Travis 網(wǎng)站,寫在每個倉庫的設(shè)置頁里面,Travis 會自動把它們加入環(huán)境變量。這樣一來,腳本內(nèi)部依然可以使用這些環(huán)境變量,但是只有管理員才能看到變量的值。具體操作請看官方文檔。

5.2 加密信息
如果不放心保密信息明文存在 Travis 的網(wǎng)站,可以使用 Travis 提供的加密功能。
首先,安裝 Ruby 的包travis。
$ gem install travis
然后,就可以用travis encrypt命令加密信息。
在項目的根目錄下,執(zhí)行下面的命令。
$ travis encrypt SOMEVAR=secretvalue
上面命令中,SOMEVAR是要加密的變量名,secretvalue是要加密的變量值。執(zhí)行以后,屏幕上會輸出如下信息。
secure: ".... encrypted data ...."
現(xiàn)在,就可以把這一行加入.travis.yml。
env: global: - secure: ".... encrypted data ...."
然后,腳本里面就可以使用環(huán)境變量$SOMEVAR了,Travis 會在運(yùn)行時自動對它解密。
travis encrypt命令的--add參數(shù)會把輸出自動寫入.travis.yml,省掉了修改env字段的步驟。
$ travis encrypt SOMEVAR=secretvalue --add
詳細(xì)信息請看官方文檔。
參考
持續(xù)集成服務(wù) Travis CI 教程 - 阮一峰的網(wǎng)絡(luò)日志
http://www.ruanyifeng.com/blog/2017/12/travis_ci_tutorial.html