天天看點

使用 CODING DevOps 全自動部署 Hexo 到 K8S 叢集

背景

如何做團隊技術文章分享和沉澱?這是一個老生常談的話題。常見的技術選型可以是 Confluence、Dokuwiki、Gitbook 等。

但對于靈活團隊來說,這些都不夠優雅,我們希望能把技術文章像代碼一樣進行協作和版本管理。更新技術文章後,能夠自動部署到公司的 K8S 叢集。那麼,CODING DevOps + Hexo 一定是你的不二之選,這也是 CODING 目前的實踐。

Hexo 是一個快速、簡潔且高效的部落格架構。我們隻需要書寫 Markdown 格式的技術文章,通過指令能夠直接生成靜态頁面,友善浏覽和部署。

本文将介紹如何使用 CODING DevOps 建立流水線,推送技術文章到 Git 倉庫後,自動觸發流水線執行建構并部署到 K8S 叢集。

準備

  1. K8S 叢集,推薦使用騰訊 TKE
  2. 開通 CODING DevOps
  3. 克隆代碼倉庫:https://wangweicoding.coding.net/public/blog/blog/git

實作效果

  1. 送出新文章,自動觸發建構流程
  2. 生成靜态頁面,建構 Docker 鏡像
  3. 鏡像建構成功,自動觸發部署流程
  4. 部署成功,新文章釋出

實踐步驟

1. 克隆代碼并推送到自己的 CODING Git 倉庫

git clone https://e.coding.net/wangweicoding/blog.git
git remote set-url origin [CODING Git Url]
git push
           

2. 開通 CODING 制品庫

開通 Docker 類型的制品庫,并記錄倉庫位址和制品庫名稱,将在下一個階段用到。

使用 CODING DevOps 全自動部署 Hexo 到 K8S 叢集

3. 開通 CODING 持續內建,并配置建構任務

選擇“自定義建構過程”,并配置來源使用代碼倉庫的

Jenkinsfile

使用 CODING DevOps 全自動部署 Hexo 到 K8S 叢集

項目内的 Jenkinsfile 主要是用來生成靜态頁面,以及建構鏡像并推送鏡像到制品庫。

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('生成靜态頁面') {
      steps {
        script {
          sh 'npm install -g hexo-cli'  # 安裝 Hexo
          sh 'npm install'   # 安裝依賴
          sh 'hexo g'  # 生成靜态頁面
        }
      }
    }
    stage('建構') {
      steps {
        echo '建構中...'
        script {
          // 此處請修改 dockerServer、dockerPath、imageName 替換為自己項目的值
          dockerServer = 'wangweicoding-docker.pkg.coding.net'
          dockerPath = '/blog/blog'
          imageName = "${dockerServer}${dockerPath}/blog:${env.GIT_BUILD_REF}"
          def customImage = docker.build(imageName)
 
          // 推送 Docker 鏡像到倉庫
          docker.withRegistry("https://${dockerServer}", CODING_ARTIFACTS_CREDENTIALS_ID) {
            customImage.push()
          }
        }
      }
    }
  }
}
           

注意:請将

Jenkinsfile

内變量 dockerServer、dockerPath、imageName 修改為自己的制品庫位址、制品庫名 、制品名。

4. 開通 CODING 持續部署,并配置 K8S 雲賬号

進入“團隊管理” -> "部署設定",配置 Kubernetes 雲賬号(Kubeconfig 或 Service Account),以便 CODING 持續部署部署應用到目标叢集。

使用 CODING DevOps 全自動部署 Hexo 到 K8S 叢集

如果你是騰訊雲使用者,可以按照操作提示一鍵綁定 TKE 叢集。

使用 CODING DevOps 全自動部署 Hexo 到 K8S 叢集

5. 為持續部署配置應用和部署流程

進入持續部署控制台,點選“建立應用”,為了友善直接使用本文的部署模闆,應用名請輸入

blog

,并勾選

支援 Kubernetes 部署

應用建立後,接下來建立部署流程:

使用 CODING DevOps 全自動部署 Hexo 到 K8S 叢集

複制代碼倉庫的

pipeline.json

的内容,黏貼至部署流程的“編輯 JSON”框内。

注意:界面中的“啟動所需制品”和“觸發器”需要重新選擇自己的項目和倉庫,并在部署 deployment 和 services 階段,重新選擇自己剛才建立的雲賬号。

編輯完成後,點選儲存即可。

我們建立的持續部署流水線主要定義這幾項配置:

  1. 配置了 3 個“啟動所需制品”,并配置了預設版本。分别是:
    • services.yaml,Kubernetes Services 部署檔案,提供外網通路的 LoadBalancer。
    • deploy.yaml,Kubernetes Deployment 部署檔案,用于更新鏡像版本。
    • docker 鏡像,需要自動更新的鏡像版本。
  2. 配置了 CODING Docker 倉庫 “自動觸發器”,當鏡像建構完成并推送到鏡像倉庫時,自動觸發部署流程。
  3. 部署 services.yaml 和 deploy.yaml。

當鏡像更新,觸發器自動觸發,持續部署能夠直接擷取到本次建構的版本号,通過對 deployment 鏡像版本的自動綁定,實作自動部署新的鏡像。

deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: blog
  namespace: blog
  labels:
    app: blog
spec:
  replicas: 2
  selector:
    matchLabels:
      app: blog
  template:
    metadata:
      labels:
        app: blog
    spec:
      containers:
        - name: blog
          image: wangweicoding-docker.pkg.coding.net/blog/blog/blog  # 此處的鏡像版本将被自動替換為本次建構的版本。
          ports:
            - containerPort: 80
      imagePullSecrets:
      - name: dockersecret  # 叢集憑據,需要手動建立
           

Deployment 中的

image: wangweicoding-docker.pkg.coding.net/blog/blog/blog

,image 會被 CODING 持續部署自動替換為本次建構的鏡像版本,實作自動綁定 Docker 制品。是以這裡隻需要完整的制品 URL 即可,無需 TAG 版本号。

注意:請将 image 修改為自己的 Docker 鏡像位址。deployment 檔案内使用了 imagePullSecrets ,配置部署前請使用以下方法提前建立。
kubectl create secret docker-registry myregcred \
     --docker-server=<your-registry-server> \
     --docker-username=<your-name> \
     --docker-password=<your-password> \
     -n namespace
           

service.yaml

apiVersion: v1
kind: Service
metadata:
  name: blog
  namespace: blog
spec:
  selector:
    app: blog
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer   # 提供 Hexo 外網通路 IP
           

6. 釋出文章

編輯項目

source/_posts/

目錄下的文章,并推送到 CODING Git 倉庫,此時會自動觸發建構,建構成功後,會自動觸發部落格釋出的部署流程。

寫在最後

我們使用 CODING DevOps 實作了将 Hexo 全自動部署到 K8S 叢集,能夠非常友善地對技術文章統一管理以及沉澱。不僅是 Hexo,其他任意建構為 Docker 鏡像的前端和後端項目,都可以用本文的思想進行配置,實作自動觸發,自動部署到 K8S 叢集。

結合持續部署的“人工确認”階段,我們能夠很友善地實作釋出的審批流,使得釋出更加安全。另外,自動觸發器不僅可以使用 CODING Docker 鏡像倉庫觸發,還能夠使用 Webhook 觸發。通過 Webhook 調用流水線,可以非常友善地将 CODING 持續部署和内部 CI 系統打通,滿足更多的使用場景。

當然,CODING 持續部署可以實作更多的應用場景,例如:灰階釋出、藍綠/金絲雀釋出等,我們将在後續帶給大家更多的實踐内容。

關于 CODING,了解更多。

繼續閱讀