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

背景

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

但對於敏捷團隊來講,這些都不夠優雅,咱們但願能把技術文章像代碼同樣進行協做和版本管理。更新技術文章後,可以自動部署到公司的 K8S 集羣。那麼,CODING DevOps + Hexo 必定是你的不二之選,這也是 CODING 目前的實踐。git

Hexo 是一個快速、簡潔且高效的博客框架。咱們只須要書寫 Markdown 格式的技術文章,經過命令可以直接生成靜態頁面,方便瀏覽和部署。docker

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

準備

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

實現效果

  1. 提交新文章,自動觸發構建流程
    image
  2. 生成靜態頁面,構建 Docker 鏡像
    image
  3. 鏡像構建成功,自動觸發部署流程
    image
  4. 部署成功,新文章發佈
    image

實踐步驟

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 類型的製品庫,並記錄倉庫地址和製品庫名稱,將在下一個階段用到。
imagejson

3. 開通 CODING 持續集成,並配置構建任務

選擇「自定義構建過程」,並配置來源使用代碼倉庫的 Jenkinsfile後端

image

項目內的 Jenkinsfile 主要是用來生成靜態頁面,以及構建鏡像並推送鏡像到製品庫。api

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 持續部署部署應用到目標集羣。
imagehexo

若是你是騰訊雲用戶,能夠按照操做提示一鍵綁定 TKE 集羣。
imageapp

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

進入持續部署控制檯,點擊「建立應用」,爲了方便直接使用本文的部署模板,應用名請輸入 blog ,並勾選 支持 Kubernetes 部署

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

複製代碼倉庫的 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,瞭解更多。

相關文章
相關標籤/搜索