什么是 Travis CI?
Travis CI 是在軟件開發(fā)領(lǐng)域中的一個在線的,分布式的持續(xù)集成服務(wù),用來構(gòu)建及測試在 GitHub 托管的代碼。這個軟件的代碼同時也是開源的,可以在 GitHub 上下載到,盡管開發(fā)者當(dāng)前并不推薦在閉源項目中單獨使用它。
它提供了多種編程語言的支持,包括 Ruby、JavaScript、Java、Scala、PHP、Haskell 和 Erlang 在內(nèi)的多種語言。許多知名的開源項目使用它來在每次提交的時候進(jìn)行構(gòu)建測試,比如 Ruby on Rails,Ruby 和 Node.js。
目前 Travis CI 兩個站點,提供不同的服務(wù):
版本 | 主頁 | 特色 |
---|---|---|
免費(fèi)版 | https://travis-ci.org/ | 為開源項目提供免費(fèi)服務(wù) |
收費(fèi)版 | https://travis-ci.com/ | 可以部署 GitHub 私有倉庫 |
兩個站點只能看到各自的項目,不能通用,按需選用。
準(zhǔn)備工作
首先,訪問官方網(wǎng)站 travis-ci.org,點擊右上角的登入按鈕,使用 GitHub 賬戶登入 Travis CI。
Travis 會列出 GitHub 上面你的所有倉庫,以及你所屬于的組織。此時,選擇你需要 Travis 幫你構(gòu)建的倉庫,打開倉庫旁邊的開關(guān)。一旦激活了一個倉庫,Travis 會監(jiān)聽這個倉庫的所有變化。
<p align="center">
<img src="https://i.loli.net/2019/01/17/5c4036203a833.png" alt="travis github repo">
</p>
.travis.yml
Travis 要求項目的根目錄下面,必須有一個 .travis.yml
文件。這是配置文件,指定了 Travis 的行為。該文件必須保存在 GitHub 倉庫里面,一旦代碼倉庫有新的 Commit,Travis 就會去找這個文件,執(zhí)行里面的命令。
.travis.yml
:
language: node_js # 指定語言環(huán)境
node_js: '8.9.3' # 指定 NodeJS 版本
cache: npm # 指定 npm 緩存方案,會緩存 $HOME/.npm 或 node_modules 文件夾
dist: trusty # 指定系統(tǒng)版本,trusty 是指 Ubuntu 14.04 發(fā)行版的名稱
sudo: required # 是否需要 sudo 權(quán)限
branches: # 指定要構(gòu)建的分支
only: # only 表示只構(gòu)建以下分支
- source
before_install: # install 階段之前執(zhí)行
- npm install -g hexo-cli # 全局安裝 Hexo 命令行工具
install: # 在安裝項目環(huán)境階段需要運(yùn)行的命令,一條一行,類似的還有 before_install
- npm install # 安裝 package.json 中的依賴
script: # 在構(gòu)建階段需要運(yùn)行的命令,一條一行,類似的還有 before_script、after_script
- hexo clean
- hexo generate # Hexo 常規(guī)命令,執(zhí)行清理和生成
after_success: # script 階段成功時執(zhí)行,構(gòu)建失敗不會執(zhí)行,其他同上
- git config --local user.name "travis-ci"
- git config --local user.email "deploy@travis-ci.org"
- sed -i'' "s~git@github.com:~https://${GITHUB_REPO_TOKEN}@github.com/~" _config.yml
- hexo deploy > /dev/null # 通過 Hexo 的 deploy 命令部署博客
更多使用技巧請主動參考「持續(xù)集成服務(wù) Travis CI 教程」。
那么,現(xiàn)在又有一個問題了:我們的目是自動部署到 GitHub Pages,用的是 hexo deploy
命令,但是 Hexo 又配置使用的是 Git push 來推送的(由 hexo-deployer-git
插件提供技術(shù)支持),那么 Travis CI 怎么有權(quán)限操作我的 GitHub 倉庫呢!
GitHub Access Token
以下內(nèi)容摘抄「使用 Travis 自動構(gòu)建 Hexo 到 GitHub」
GitHub 允許你通過設(shè)置頁面添加一個「個人訪問令牌(Personal access tokens)」,使用 Assess Token 將有權(quán)限通過 https
訪問 GitHub Api 操作自己的倉庫,可見這個就是我們需要的。
現(xiàn)在我們來添加一個 token,先進(jìn)入自己 GitHub 的設(shè)置頁面,點擊 Personal access tokens
→ Generate new token
按鈕,新建一個 token。
在權(quán)限設(shè)置中,我們只需要操作倉庫,因此只需要打開倉庫相關(guān)的權(quán)限就夠了,權(quán)限開放應(yīng)該滿足最小原則,能少就少。設(shè)置好權(quán)限后點擊生成按鈕就會生成完畢并跳到 tokens 列表。
現(xiàn)在就需要把剛生成的 Access Token 的值復(fù)制下來,注意,這個頁面一旦刷新過了, token 就不能再顯示了,沒記住的只能重新生成一個了。
嗯,現(xiàn)在 Access Token 也有了,能操作倉庫了,那么,這個 token 應(yīng)該放到哪里呢?
肯定不是放到代碼里。。。
其實在 Travis CI 的項目設(shè)置界面就有提供設(shè)置環(huán)境變量,我們就應(yīng)該把 token 放到那里。
回到我們 Travis CI 的博客項目設(shè)置頁面中,添加一個名為 GITHUB_REPO_TOKEN
的環(huán)境變量儲存我們的 token,并記得要設(shè)置 Display value in build log
為 OFF
,關(guān)閉變量的顯示,否則等于公開了 token。
現(xiàn)在在我們的執(zhí)行腳本中就能使用 $GITHUB_REPO_TOKEN
訪問 token 的環(huán)境變量了~
然后就是如何使用了。在 Hexo 部署前,我們應(yīng)該把原來的部署倉庫地址用帶有 Access Token
的地址替換掉,于是在 .travis.yml
的 hexo deploy
命令前增加一條命令:
sed -i'' "s~git@github.com:~https://${GITHUB_REPO_TOKEN}@github.com/~" _config.yml
這樣,在執(zhí)行時,這條命令就能自動替換到有權(quán)限操作的 token 地址了,并且也不會泄露或者影響本地的原始配置文件。
構(gòu)建失敗:子模塊拉取失敗
本博客的第三方主題使用
git submodule
管理,可以翻看「Hexo 搭建個人博客 #04 主題的安裝與自定義樣式」
詳細(xì)的構(gòu)建日志可見 #1,下面提取關(guān)鍵信息:
$ git submodule update --init --recursive
Submodule 'themes/skapp' (git@github.com:Mrminfive/hexo-theme-skapp.git) registered for path 'themes/skapp'
Cloning into '/home/travis/build/y0ngb1n/y0ngb1n.github.io/themes/skapp'...
Warning: Permanently added the RSA host key for IP address '192.30.253.113' to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.
Travis CI 官方是默認(rèn)支持 Git Submodules,在拉取倉庫時會默認(rèn)拉取子模塊的倉庫,可以手動關(guān)閉該特性。
由于在使用 git submodule
時,添加了 git@github.com
的倉庫地址,使用 SSH
的協(xié)議,所以拉取失敗了,下面提供兩個解決方案:
- Adding to SSH Known Hosts - 官方提供的解決方案
- 手動修改
.gitmodules
里配置的倉庫地址,將使用git
協(xié)議的倉庫鏈接改為https
協(xié)議
我這使用方案 2,修改為https
協(xié)議:
[submodule "themes/skapp"]
path = themes/skapp
url = https://github.com/Mrminfive/hexo-theme-skapp.git
將修改推送至 GitHub 后,Travis CI 會進(jìn)行構(gòu)建,此時可見 #2 成功構(gòu)建了。
在 README 中查看構(gòu)建狀態(tài)
我們可以在 README
中添加 Travis CI 的構(gòu)建狀態(tài),這樣便可方便地查看項目在 Travis CI 上的構(gòu)建狀態(tài)。—— Embedding Status Images、Shields.io
參考資料
- Travis CI Tutorial - @Travis CI Docs
- 持續(xù)集成服務(wù) Travis CI 教程 - @阮一峰
- Travis CI 持續(xù)集成 GitHub 個人博客 - @路家豪
- 使用 Travis 自動構(gòu)建 Hexo 到 GitHub - @zthxxx
- 開箱即用,Hexo 博客的 github+server 自動部署 - @伍醬
- 用 Travis CI 自動部署 Hexo 博客 - @Karl
- 使用 Travis CI 自動部署 Hexo 博客 - @wshunli
- Hexo 遇上 Travis-CI:可能是最通俗易懂的自動發(fā)布博客圖文教程 - @MichaelX
- Hexo+Github+Travis-ci 搭建程序員自己的博客 - @baiyangliu