當時搭建wiki的時候,隻注意到 travis-ci.com 支援私有倉庫,但是沒發現它是有免費次數限制的,這次 szhshp 同學 提醒才發覺。另外,之前我的 wiki 一直是丢在 Git pages 上的,即使加上了 CDN,速度依然堪憂,于是重新在 CODING 部署持續內建服務,利用 CODING CI 将 hexo 的靜态檔案部署到 Web 伺服器。
前言
與 Travis-CI 不同,CODING CI 是基于 Jenkins 的,是以其持續內建的腳本亦為 Jenkinsfile,不過 Alliot 本身對 Jenkins 與其腳本的文法并不熟悉,隻知道這些個概念,是以在編寫 Jenkinsfile 的時候還是踩了不少的坑。
流程其實很簡單:

Web伺服器設定
配置密鑰登入
由于需要使用 SCP,而 SCP 本身是走 ssh 的,是以我們需要在伺服器系統中添加一個用于 CODING CI 傳輸檔案的使用者(為安全起見,強烈建議建立普通使用者,給予有限的權限,而非 root)。這裡我假設建立使用者為
alliot_blog
,Web 伺服器目錄為
/var/www
:
# 切換到 root 身份
su -
# 檢視目錄的所有者所處組
ls -l /var/www
# 假設該目錄所有者為 www,建立使用者并将其加入該組
useradd -g www alliot_blog
# 切換到 alliot_blog 使用者
su - alliot_blog
# 生成密鑰對 (https://www.iots.vip/post/centos-use-ssh-keygen.html)
ssh-keygen -t rsa
cd ~/.ssh
cat id_rsa.pub >> authorized_keys
chmod 600 authorized_keys
# 将 id_rsa 下載下傳到本機後删除敏感檔案
rm -f id_rsa*
# 測試能否通過密鑰登入
ssh -i id_rsa alliot_blog@你的IP
複制
建立建構計劃
在 hexo 源檔案倉庫中點選 “建立建構計劃” ,為了友善我們直接選擇 SCP 的 Jenkinsfile 模闆:
填入伺服器 IP 與使用者名,在 ”請選擇憑據“ 中導入并選擇先前下載下傳的
id_rsa
私鑰,确認。
流程配置
進入流程配置中選擇文本編輯器,覆寫寫入如下配置:
pipeline {
agent any
stages {
stage('倉庫檢出') {
steps {
checkout([$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]],
userRemoteConfigs: [[url: env.GIT_REPO_URL, credentialsId: env.CREDENTIALS_ID]]])
}
}
stage('hexo 環境建構') {
steps {
echo 'hexo 環境建構中...'
sh 'node -v'
sh 'npm install -g hexo-cli'
sh 'npm install -g gulp'
sh 'npm install -g'
echo '建構完成.'
}
}
stage('hexo g 生成靜态檔案') {
steps {
echo 'hexo g 生成靜态檔案'
sh 'hexo clean'
sh 'hexo g && gulp'
sh 'mv public blog'
// 由于小檔案多,打包以提高傳輸速度
sh 'tar -zcf blog.tar.gz blog/'
echo 'hexo g 生成靜态檔案成功.'
}
}
stage('ssh 部署到 web 端') {
steps {
echo '部署中...'
script {
def remote = [:]
remote.name = 'web-server'
remote.allowAnyHosts = true
remote.host = "${env.REMOTE_HOST}"
remote.user = "${env.REMOTE_USER_NAME}"
// 需要先建立一對 SSH 密鑰,把私鑰放在 CODING 憑據管理,把公鑰放在伺服器的 `.ssh/authorized_keys`,實作免密碼登入
withCredentials([sshUserPrivateKey(credentialsId: "${env.REMOTE_CRED}", keyFileVariable: 'id_rsa')]) {
remote.identityFile = id_rsa
//假如伺服器 Web 的部落格目錄為 /var/www/blog,删除舊檔案
sshCommand remote: remote, command: "rm -rf /var/www/blog*"
// SSH 上傳檔案到遠端伺服器
sshPut remote: remote, from: 'blog.tar.gz', into: '/var/www'
// SSH 在遠端伺服器執行解壓操作
sshCommand remote: remote, sudo: false, command: "cd /var/www && tar -zxf blog.tar.gz && rm -rf blog.tar.gz"
}
}
echo '部署完成'
}
}
}
}
複制
儲存即可,完成流程配置。
緩存設定
在“變量與緩存”中,勾選
npm
,并增加目錄
/root/workspace/node_modules
以提高建構的速度,或者還可以在
npm install
處,更換
npm
為
cnpm
,不過我測試速度優化不明顯。
建構測試
傳回“建構計劃”中,選擇“立即建構”,即可,在“建構過程”中,我們可以檢視建構進度,以排障。
coding-ci-3.png
易踩坑點
- Jenkinsfile 中,變量的引用。CODING CI DOC
- “hexo 環境建構” 的 "stage" 中,
如果不使用npm install
全局安裝,在“部署”的 "stage" 會出現報錯,很奇怪,一般來說,隻有-g
是需要全局安裝的,這裡不深究了,反正 CI 環境用後即焚,無所謂啦。hexo-cli
- sshPut 環節出現錯誤的時候,首先檢視目錄權限,我當時是
給使用者添加到usermod -a -G www alliot_blog
使用者組就直接就去測試能不能建立删除檔案的,發現即使目錄是 775 權限也提示沒有權限,最終想起,忘記重新開機終端來生效配置-_-! 丢人...www
- 接上一條,除去權限問題,還可能出現
,這是因為你使用了非絕對路徑造成的。no such file