背景
如何做團隊技術文章分享和沉淀?這是一個老生常談的話題。常見的技術選型可以是 Confluence、Dokuwiki、Gitbook 等。
但對於敏捷團隊來說,這些都不夠優雅,我們希望能把技術文章像代碼一樣進行協作和版本管理。更新技術文章后,能夠自動部署到公司的 K8S 集群。那么,CODING DevOps + Hexo 一定是你的不二之選,這也是 CODING 目前的實踐。
Hexo 是一個快速、簡潔且高效的博客框架。我們只需要書寫 Markdown 格式的技術文章,通過命令能夠直接生成靜態頁面,方便瀏覽和部署。
本文將介紹如何使用 CODING DevOps 建立流水線,推送技術文章到 Git 倉庫后,自動觸發流水線執行構建並部署到 K8S 集群。
准備
- K8S 集群,推薦使用騰訊 TKE
- 開通 CODING DevOps
- 克隆代碼倉庫:https://wangweicoding.coding.net/public/blog/blog/git
實現效果
- 提交新文章,自動觸發構建流程
- 生成靜態頁面,構建 Docker 鏡像
- 鏡像構建成功,自動觸發部署流程
- 部署成功,新文章發布
實踐步驟
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 類型的制品庫,並記錄倉庫地址和制品庫名稱,將在下一個階段用到。
3. 開通 CODING 持續集成,並配置構建任務
選擇“自定義構建過程”,並配置來源使用代碼倉庫的 Jenkinsfile
項目內的 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 持續部署部署應用到目標集群。
如果你是騰訊雲用戶,可以按照操作提示一鍵綁定 TKE 集群。
5. 為持續部署配置應用和部署流程
進入持續部署控制台,點擊“創建應用”,為了方便直接使用本文的部署模板,應用名請輸入 blog
,並勾選 支持 Kubernetes 部署
。
應用創建后,接下來創建部署流程:
復制代碼倉庫的 pipeline.json
的內容,黏貼至部署流程的“編輯 JSON”框內。
注意:界面中的“啟動所需制品”和“觸發器”需要重新選擇自己的項目和倉庫,並在部署 deployment 和 services 階段,重新選擇自己剛才創建的雲賬號。
編輯完成后,點擊保存即可。
我們創建的持續部署流水線主要定義這幾項配置:
- 配置了 3 個“啟動所需制品”,並配置了默認版本。分別是:
- services.yaml,Kubernetes Services 部署文件,提供外網訪問的 LoadBalancer。
- deploy.yaml,Kubernetes Deployment 部署文件,用於更新鏡像版本。
- docker 鏡像,需要自動更新的鏡像版本。
- 配置了 CODING Docker 倉庫 “自動觸發器”,當鏡像構建完成並推送到鏡像倉庫時,自動觸發部署流程。
- 部署 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 持續部署可以實現更多的應用場景,例如:灰度發布、藍綠/金絲雀發布等,我們將在后續帶給大家更多的實踐內容。