使用 Travis 自動部署 Hexo 到 Github 與 本身的服務器

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

使用hexo而不使用jekyll在github上搭blog最大的問題就是,每次提交都須要先hexo g,而後再push生成的文件們,這樣哪怕是改一個小的地方都須要從新編譯所有blog,想一想都蛋疼(雖然我尚未多少文章),因此決定使用Travis來自動持續集成提交到github之後的操做git

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

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

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

  • 因爲個人.travis.yml配置文件裏設置監聽的就是source分支,因此會觸發webhook緩存

  • Travis則會將該項目clone過去,而後按照.travis.yml的設置執行接下來的命令ruby

  • 執行完成後,再將編譯好的文件們發送到本身的服務器,順便pushmaster分支上來bash

  • 這樣就能夠在blog.godi13.comGodi13.github.io上都訪問blog了服務器

Github

首先,按規定名稱XXXXX.github.io,其中XXXXX爲你的用戶名,以下圖中的Godi13.github.io建立項目hexo

建立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 "mqzq9388@gmail.com"
# 因爲使用了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://$REPO_TOKEN@github.com/Godi13/Godi13.github.io.git
  master

而後,準備push該項目到github,看下是否成功,若是是新項目可參照下面的git指令

git init
# 添加本身的項目
git remote add origin git@github.com: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配置參數,但願本文對你們能有所幫助,若是以爲不錯記得點贊~ 若是能告訴我爲何以爲我寫的還不錯就更好了,我就知道該怎麼再接再礪了,謝謝你們的支持~~~~

參考資料

相關文章
相關標籤/搜索