使用 Travis 自動部署 Hexo 到 Github 與 自己的伺服器

NO IMAGE
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

該文寫給愛折騰的人,對純新手不友善,沒有辣麼詳細地說明如何安裝node、git或者是hexo,所以關於這些問題可先行google,如有其它問題請在這裡或者我的簡書上留言

使用hexo而不使用jekyll在github上搭blog最大的問題就是,每次提交都需要先hexo g,然後再push生成的檔案們,這樣哪怕是改一個小的地方都需要重新編譯全部blog,想想都蛋疼(雖然我還沒有多少文章),所以決定使用Travis來自動持續整合提交到github以後的操作

網上一搜有很多的教程,看了好多然後東拼西湊才最終成功,遂決定記錄下來最終成功的這個方法,以免忘記

本文中實現的最終效果是:

  • 寫完blog後,直接push到github的source分支,其它的就可以不用管了

  • 由於我的.travis.yml配置檔案裡設定監聽的就是source分支,所以會觸發webhook

  • Travis則會將該專案clone過去,然後按照.travis.yml的設定執行接下來的命令

  • 執行完成後,再將編譯好的檔案們傳送到自己的伺服器,順便pushmaster分支上來

  • 這樣就可以在blog.godi13.comGodi13.github.io上都訪問blog了

Github

首先,按規定名稱XXXXX.github.io,其中XXXXX為你的使用者名稱,如下圖中的Godi13.github.io建立專案

建立github專案

為了使travis能夠將編譯好的檔案們push回咱們的github,我們需要生成token,步驟如下:

1) 點選右上方頭像,然後點setting

2) 點選Personal access tokens

3) 點選Generate new token

4) 為token起一個名字,勾選repo,然後點選生成

<div class=”tip”>生成token以後,一定要複製好,因為只顯示一次,如果丟失只能再次生成了</div>

Travis

1) 使用github帳號登入Travis,右上方按鈕點選同步專案,下方開啟需要整合的專案,最後點選齒輪進入專案配置頁面

在travis同步

2) 開啟Build only if .travis.yml is present,右下角的那個其實也可以關了,然後往下移動頁面到環境變數

3) 在這裡我將變數名稱名為REPO_TOKEN,放上token,點選Add按鈕

Terminal

回到終端,進入blog所在的資料夾下,新建.travis.yml檔案,並新增以下內容

# 使用語言
language: node_js
# node版本
node_js: stable
# 設定只監聽哪個分支
branches:
only:
- source
# 快取,可以節省整合的時間,這裡我用了yarn,如果不用可以刪除
cache:
apt: true
yarn: true
directories:
- node_modules
# tarvis生命週期執行順序詳見官網文件
before_install:
- git config --global user.name "Godi13"
- git config --global user.email "[email protected]"
# 由於使用了yarn,所以需要下載,如不用yarn這兩行可以刪除
- curl -o- -L https://yarnpkg.com/install.sh | bash
- export PATH=$HOME/.yarn/bin:$PATH
- npm install -g hexo-cli
install:
# 不用yarn的話這裡改成 npm i 即可
- yarn
script:
- hexo clean
- hexo generate
after_success:
- cd ./public
- git init
- git add --all .
- git commit -m "Travis CI Auto Builder"
# 這裡的 REPO_TOKEN 即之前在 travis 專案的環境變數裡新增的
- git push --quiet --force https://[email protected]/Godi13/Godi13.github.io.git
master

然後,準備push該專案到github,看下是否成功,如果是新專案可參照下面的git指令

git init
# 新增自己的專案
git remote add origin [email protected]:Godi13/Godi13.github.io.git
# 新建並切換分支
git checkout --orphan source
git add -A
git commit -m "Travis CI"
git push

關於 --orphan 請參考 如何建立一個沒有 Parent 的獨立 Git branch

如最終成功則會看到

到這裡關於hexo和github的事情就先吿一段落,接下來就是伺服器與tarvis

伺服器

按照上面.tarvis.yml的設定,其實我只需要在after_success這個生命週期中,把public資料夾下的所有檔案傳送到伺服器指定的路徑即可,接下來就是解決如何讓tarvis往我的伺服器傳東西的問題了

在此之前,你需要將本機生成的金鑰傳到伺服器上

ssh-keygen -t rsa # 然後一路回車即可
# ssh-copy-id 可能需要另行安裝
# 如果ssh預設埠是22,則不需要 -p
ssh-copy-id <登入部署伺服器使用者名稱>@<部署伺服器地址> -p <部署伺服器ssh埠>
ssh <登入部署伺服器使用者名稱>@<部署伺服器地址> -p <部署伺服器ssh埠>

如果登入伺服器成功,接下來需要安裝travis命令列工具

# 安裝travis命令列工具,如無法使用gem指令須先安裝ruby
gem install travis
# --auto自動登入github帳號
travis login --auto
# 此處的--add參數列示自動新增指令碼到.travis.yml檔案中
travis encrypt-file ~/.ssh/id_rsa --add
# 這個命令會自動把 id_rsa 加密傳送到 .git 指定的倉庫對應的 travis 中去

執行完以後會發現在travis網站專案裡面的環境變數裡多了兩個引數

並且在.travis.yml裡的before_install週期中多了下面這2行

- openssl aes-256-cbc -K $encrypted_97d432d3ed20_key -iv $encrypted_97d432d3ed20_iv
-in id_rsa.enc -out ~\/.ssh/id_rsa -d

預設生成的命令可能會在/前面帶轉義符\,我們不需要這些轉義符,手動刪掉所有的轉義符,否則可能在後面引發莫名的錯誤

之後為了保證命令的順利執行,我們還需要正確地設定許可權和認證

before_install
- openssl aes-256-cbc -K $encrypted_97d432d3ed20_key -iv $encrypted_97d432d3ed20_iv
-in id_rsa.enc -out ~/.ssh/id_rsa -d
- chmod 600 ~/.ssh/id_rsa
- echo -e "Host 主機IP地址\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config

最後,就是在after_success週期中,新增上傳伺服器的指令即可,在這裡要注意,如果沒有stricthostkeychecking=no引數,將構建失敗,詳細原因請參考通過travis部署程式碼到遠端伺服器

# 由於我修改了預設的port,所以在這裡也進行了加密處理
- scp -o stricthostkeychecking=no -P $PORT -r public/* 使用者@域名:/路徑

但使用scp有很多問題,所以後來我決定改用rsync命令,缺點是埠號就不能用travis環境來加密了,如果哪個朋友有更好的方案希望能告訴我

# public 後面加上/即可將該目錄下的檔案都傳送到伺服器了
- rsync -rv --delete -e 'ssh -o stricthostkeychecking=no -p 埠號' public/ 使用者@域名:/路徑

最後在這裡放上我最終的.travis.yml配置引數,希望本文對大家能有所幫助,如果覺得不錯記得點贊~ 如果能告訴我為什麼覺得我寫的還不錯就更好了,我就知道該怎麼再接再厲了,謝謝大家的支援~~~~

參考資料

相關文章

軟體開發工具 最新文章