Hexo 搭建個人博客 #05 利用 Travis CI 幫你自動部署

Travis CI

本文首發(fā)于:https://y0ngb1n.github.io/a/5c7519f9.html

什么是 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 tokensGenerate new token 按鈕,新建一個 token。

Generate new token

在權(quán)限設(shè)置中,我們只需要操作倉庫,因此只需要打開倉庫相關(guān)的權(quán)限就夠了,權(quán)限開放應(yīng)該滿足最小原則,能少就少。設(shè)置好權(quán)限后點擊生成按鈕就會生成完畢并跳到 tokens 列表。

Personal access tokens

現(xiàn)在就需要把剛生成的 Access Token 的值復(fù)制下來,注意,這個頁面一旦刷新過了, token 就不能再顯示了,沒記住的只能重新生成一個了

Copy personal access tokens

嗯,現(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 logOFF,關(guān)閉變量的顯示,否則等于公開了 token。

添加 Token 環(huán)境變量

現(xiàn)在在我們的執(zhí)行腳本中就能使用 $GITHUB_REPO_TOKEN 訪問 token 的環(huán)境變量了~

然后就是如何使用了。在 Hexo 部署前,我們應(yīng)該把原來的部署倉庫地址用帶有 Access Token 的地址替換掉,于是在 .travis.ymlhexo 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 主題的安裝與自定義樣式

Build History

詳細(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é)議,所以拉取失敗了,下面提供兩個解決方案:

  1. Adding to SSH Known Hosts - 官方提供的解決方案
  2. 手動修改 .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 ImagesShields.io

README

參考資料

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,577評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,486評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,852評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,600評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,944評論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,108評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,652評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,385評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,616評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,798評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,205評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,537評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,334評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,570評論 2 379

推薦閱讀更多精彩內(nèi)容