利用markdown
+Hexo
寫文章,總體體驗已經很棒。在寫做過程當中,節省了我很多時間。
可是,美中不足的,就是發佈的時候,須要手動輸入命令,build
好文件,再用scp
部署到服務器上。
本文,用於記錄解決這個痛點的過程。採起的解決方案就是持續集成。html
如下是我用於部署我的站點的服務器概況:node
服務器 - 阿里雲ECS
系統 - CentOS 7
Git倉庫管理工具 - Gitlab(9.0.0)
CPU - 1核
內存 - 2 GB (乞丐版💔)git
正常狀況下,註冊GitLab-Runner
的服務器和部署生產文件的服務器是分開的。
由於窮🌚,我只有一臺服務器,因此二者都部署到一塊兒,你們就別太糾結這個點了。github
持續集成(Continuous integration),簡稱 CI,是指開發代碼頻繁地合併進主幹,始終保持可發佈狀態的這個過程。其中包含持續構建和持續發佈。docker
GitLab 8.0以上的版本就有提供持續集成服務。只要在項目中添加一個.gitlab-ci.yml
文件,而後再添加一個Runner
,便可進行持續集成。shell
我對自動發佈博客的整體實現思路: 添加Runner
用於監聽git push
操做,而後用.gitlab-ci.yml
指導步驟的執行,最後用shell
腳本copy目標文件到指定目錄下。npm
前提:請自行Google
gitlab-ci-multi-runner
安裝教程。json
URL
和token
瀏覽器打開一個GitLab項目,到 Settings
-CI/CD Pipelines
下,能夠看到一個 Specific Runners
塊,主要有如下內容:瀏覽器
How to setup a specific Runner for a new project緩存
1.Install a Runner compatible with GitLab CI (checkout the GitLab Runner section for information on how to install it).
2.Specify the following URL during the Runner setup:
http://gitlab.***.com/ci3.Use the following registration token during setup: TB8nknzg1woVb4pCx666 Start the Runner!
其中第2項的URL
和第3項的token
,是註冊Runner
所必需的。
Runner
憑藉token
註冊監聽對應的URL
。
GitLab-Runner
這裏,我用SecureCRT鏈接上服務器,進行如下操做:
// 1.運行命令
sudo gitlab-ci-multi-runner register
// 2.根據提示輸入`URL`
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
http://gitlab.***.com/ci
// 3.根據提示輸入`token`
Please enter the gitlab-ci token for this runner:
TB8nknzg1woVb4pCx666
// 4.而後輸入runner的描述
Please enter the gitlab-ci description for this runner:
wall-runner
// 5.輸入標籤,能夠多個,用逗號隔開便可
Please enter the gitlab-ci tags for this runner (comma separated):
test
// 6.是否運行無此標籤的構建
Whether to run untagged builds [true/false]:
true
// 7.將Runer鎖定到當前項目
Whether to lock the Runner to current project [true/false]:
true
// 8.選擇Runner的類型
Please enter the executor: ssh, docker+machine, kubernetes, docker, docker-ssh, parallels, shell, virtualbox, docker-ssh+machine:
shell
複製代碼
這樣,一個GitLab-Runner
就建立成功。刷新瀏覽器頁面,在Settings
-CI/CD Pipelines
下能夠看到runner已經綁定成功。
.gitlab-ci.yml
在要添加持續集成功能的項目的根目錄下,建立.gitlab-ci.yml
文件,編寫構建步驟。 在編寫以前,先大體瞭解下寫法:
# 定義stages
stages:
- install
- deploy
# 定義須要緩存的文件
cache:
paths:
- node_modules/
# 定義任務
job1:
stage: install
script:
- cnpm install
only:
- master
# 定義任務
job2:
stage: deploy
script:
- bash pub.sh
only:
- master
複製代碼
stages
關鍵字定義Pipeline
中的各個構建階段的前後順序cache
關鍵字定義每一個構建階段,不須要清除的文件job1
和job2
。也有真正的stage
名,用於stages
中標識前後的順序script
用於定義當前構建階段須要執行的命令only
用於指定哪一個Git分支的push操做才能觸發自動構建如下是我在blog
項目應用的.gitlab-ci.yml
# 持續集成
stages:
- install
- build
- minify
- deploy
cache:
paths:
- node_modules/
- public/
- db.json
# 安裝依賴
install_npm:
stage: install
script:
## - cnpm install hexo-cli@1.1.0 -g ## 同一臺服務器,不用屢次安裝
- cnpm install
only:
- master
# 編譯,生成靜態文件
build_public:
stage: build
script:
- npm run build
only:
- master
# 壓縮文件
mini_file:
stage: minify
script:
- npm run minify
only:
- master
# 部署
deploy:
stage: deploy
script:
- bash pub.sh
only:
- master
複製代碼
前言中,有提到一個痛點就是scp
部署文件。由於網速的緣由,每次跑scp
命令都要等好幾分鐘,電腦也不能關機。得等到傳輸完成,才能夠。
升級爲持續集成後,就不須要在本地跑命令了,都統一在服務器上跑。
而能代替文件傳輸這個步驟的,就是寫一個Shell
腳本,讓服務器自動copy文件到對應的目錄下。
如下是我應用的Shell
腳本pub.sh
#!bin/bash
cp -f -r -v ./public/* /mnt/blog/
複製代碼
做用就是將public
文件夾下全部文件copy到/mnt/blog/
下。
由於我是同一臺服務器上跑命令,因此當前Runner
進程必須對相關文件夾有寫入和讀取權限。 因此,我把幾個文件夾的讀寫權限賦予Runner
進程。
使用chown
命令,對文件夾對擁有者權限進行更改:
chown wall-runner 文件路徑
複製代碼
若是Runner
服務器和生產環境服務器是相互獨立的,則可使用ssh
的方式去鏈接。配置好密鑰和繞過指紋檢查便可。
通過上述的配置,每次push
代碼到master
分支。Runner
監聽到操做後,就會啓動自動構建,完成部署。
這樣,我發表新文章,只須要負責把markdown
寫好,push
代碼到GitLab
。其餘的工做,服務器會自動幫我作好。
寫好文章,我也能夠愉快地關機休息,不用去打理其餘的事,感受真棒!
並且,每次構建記錄都有保存在GitLab上。能夠在Pipelines
中查看每次構建的結果。
還能夠在README.md
加入構建狀態圖標:
有須要的,就買個服務器折騰下,挺好玩的🌚
附上阿里雲服務器的優惠券
喜歡我文章的朋友,能夠經過如下方式關注我: