我的站點升級持續集成,自動構建和部署

前言

利用markdown+Hexo寫文章,總體體驗已經很棒。在寫做過程當中,節省了我很多時間。
可是,美中不足的,就是發佈的時候,須要手動輸入命令,build好文件,再用scp部署到服務器上。
本文,用於記錄解決這個痛點的過程。採起的解決方案就是持續集成html

如下是我用於部署我的站點的服務器概況:node

服務器 - 阿里雲ECS
系統 - CentOS 7
Git倉庫管理工具 - Gitlab(9.0.0)
CPU - 1核
內存 - 2 GB (乞丐版💔)git

正常狀況下,註冊GitLab-Runner的服務器和部署生產文件的服務器是分開的。
由於窮🌚,我只有一臺服務器,因此二者都部署到一塊兒,你們就別太糾結這個點了。github

1、持續集成

持續集成(Continuous integration),簡稱 CI,是指開發代碼頻繁地合併進主幹,始終保持可發佈狀態的這個過程。其中包含持續構建持續發佈docker

GitLab 8.0以上的版本就有提供持續集成服務。只要在項目中添加一個.gitlab-ci.yml文件,而後再添加一個Runner,便可進行持續集成。shell

我對自動發佈博客的整體實現思路: 添加Runner用於監聽git push操做,而後用.gitlab-ci.yml指導步驟的執行,最後用shell腳本copy目標文件到指定目錄下。npm

2、註冊Runner

前提:請自行Google gitlab-ci-multi-runner 安裝教程。json

1. 查看註冊必需的URLtoken

瀏覽器打開一個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/ci

3.Use the following registration token during setup: TB8nknzg1woVb4pCx666 Start the Runner!

其中第2項的URL和第3項的token,是註冊Runner所必需的。
Runner憑藉token註冊監聽對應的URL

2. 在服務器上配置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-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關鍵字定義每一個構建階段,不須要清除的文件
  • 每一個構建階段有本身的別名,好比例子中的job1job2。也有真正的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

複製代碼

4、用於部署的Shell腳本

前言中,有提到一個痛點就是scp部署文件。由於網速的緣由,每次跑scp命令都要等好幾分鐘,電腦也不能關機。得等到傳輸完成,才能夠。
升級爲持續集成後,就不須要在本地跑命令了,都統一在服務器上跑。
而能代替文件傳輸這個步驟的,就是寫一個Shell腳本,讓服務器自動copy文件到對應的目錄下。


如下是我應用的Shell腳本pub.sh

#!bin/bash
cp -f -r -v ./public/* /mnt/blog/
複製代碼

做用就是將public文件夾下全部文件copy到/mnt/blog/下。

5、權限問題

由於我是同一臺服務器上跑命令,因此當前Runner進程必須對相關文件夾有寫入和讀取權限。 因此,我把幾個文件夾的讀寫權限賦予Runner進程。
使用chown命令,對文件夾對擁有者權限進行更改:

chown wall-runner 文件路徑
複製代碼

若是Runner服務器和生產環境服務器是相互獨立的,則可使用ssh的方式去鏈接。配置好密鑰和繞過指紋檢查便可。

6、享受愉快的持續集成體驗

通過上述的配置,每次push代碼到master分支。Runner監聽到操做後,就會啓動自動構建,完成部署。
這樣,我發表新文章,只須要負責把markdown寫好,push代碼到GitLab。其餘的工做,服務器會自動幫我作好。
寫好文章,我也能夠愉快地關機休息,不用去打理其餘的事,感受真棒!
並且,每次構建記錄都有保存在GitLab上。能夠在Pipelines中查看每次構建的結果。

構建結果

還能夠在README.md加入構建狀態圖標:

構建狀態圖標

有須要的,就買個服務器折騰下,挺好玩的🌚
附上阿里雲服務器的優惠券


喜歡我文章的朋友,能夠經過如下方式關注我:

相關文章
相關標籤/搜索