天天看點

【玩轉騰訊雲】hexo使用CODING CI部署靜态檔案到伺服器

當時搭建wiki的時候,隻注意到 travis-ci.com 支援私有倉庫,但是沒發現它是有免費次數限制的,這次 szhshp 同學 提醒才發覺。另外,之前我的 wiki 一直是丢在 Git pages 上的,即使加上了 CDN,速度依然堪憂,于是重新在 CODING 部署持續內建服務,利用 CODING CI 将 hexo 的靜态檔案部署到 Web 伺服器。

前言

  與 Travis-CI 不同,CODING CI 是基于 Jenkins 的,是以其持續內建的腳本亦為 Jenkinsfile,不過 Alliot 本身對 Jenkins 與其腳本的文法并不熟悉,隻知道這些個概念,是以在編寫 Jenkinsfile 的時候還是踩了不少的坑。

  流程其實很簡單:

【玩轉騰訊雲】hexo使用CODING CI部署靜态檔案到伺服器

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 模闆:

【玩轉騰訊雲】hexo使用CODING CI部署靜态檔案到伺服器

填入伺服器 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

,不過我測試速度優化不明顯。

建構測試

  傳回“建構計劃”中,選擇“立即建構”,即可,在“建構過程”中,我們可以檢視建構進度,以排障。

【玩轉騰訊雲】hexo使用CODING CI部署靜态檔案到伺服器

coding-ci-3.png

易踩坑點

  • Jenkinsfile 中,變量的引用。CODING CI DOC
  • “hexo 環境建構” 的 "stage" 中,

    npm install

    如果不使用

    -g

    全局安裝,在“部署”的 "stage" 會出現報錯,很奇怪,一般來說,隻有

    hexo-cli

    是需要全局安裝的,這裡不深究了,反正 CI 環境用後即焚,無所謂啦。
  • sshPut 環節出現錯誤的時候,首先檢視目錄權限,我當時是

    usermod -a -G www alliot_blog

    給使用者添加到

    www

    使用者組就直接就去測試能不能建立删除檔案的,發現即使目錄是 775 權限也提示沒有權限,最終想起,忘記重新開機終端來生效配置-_-! 丢人...
  • 接上一條,除去權限問題,還可能出現

    no such file

    ,這是因為你使用了非絕對路徑造成的。