作者:趙海亮,浙江大學計算機專業四年級在讀博士生,研究方向為云計算、邊緣計算、分布式系統等,
雖然 KubeSphere 能夠將我們從 yaml 檔案的撰寫中解放出來,但是專案上云仍然十分繁瑣, 此外,一旦專案源代碼發生更替(如發布新功能或去除 bug 等),所有組件都需要重新經歷 “原始碼打包 --> 制作鏡像 --> 啟動容器” 這個流程, 這意味著,專案運維人員不得不從事大量重復性勞動,為了提高專案發布的效率,工業界引入了 DevOps 的概念,
本文首先將介紹 DevOps 是什么,隨后嘗試利用 KubeSphere 集成的功能來實作 DevOps,
什么是 DevOps
目前絕大多數互聯網公司將開發和系統管理劃分成不同的部門, 開發部門的驅動力通常是 “頻繁交付新特性”,而運維部門則更關注 IT 服務的可靠性和 IT 成本投入的效率, 兩者目標的不匹配,因而存在鴻溝,從而減慢了 IT 交付業務價值的速度, 為了解決這個問題,DevOps(Development 和 Operations 的組合詞)被提出, DevOps 的目的是在企業內部搭建一個自動化 “軟體交付” 和“架構變更”的流程,來使得構建、測驗、發布軟體能夠更加地快捷、頻繁和可靠,
實作 DevOps 通常需要多個軟體和工具的密切配合, 如圖 1 所示,DevOps 將軟體的交付流程依次劃分為 Plan、Code、Build、Test、Release、Deploy、Operate 以及 Monitor 這些階段, 當需求變更時,將會從 Monitor 重新平滑過渡至 Plan 階段,每個階段都有一系列的軟體和工具可供選擇, 對于任意專案,我們只需要基于這些軟體和工具 搭建一條自動化流水線 ,再設定類似于 “一旦代碼變更就自動執行” 這樣的鉤子函式,整個專案即可自動實作“持續集成 / 持續交付(CI/CD)”,這將大大減少重復勞動,

KubeSphere DevOps 基于 Kubernetes Jenkins Agent 實作, 和傳統的 Jenkins Controller-Agent 架構不同的是,在 KubeSphere 中,Jenkins Agent 可以動態擴縮容,從而降低 CI/CD 對集群資源的盲目占用, KubeSphere 的 DevOps 用戶指南參見 https://kubesphere.io/zh/docs/devops-user-guide/, 本文將依照該指南將一個開源專案上云,
基于 DevOps 的專案部署
專案介紹
本次實驗要部署的專案叫做尚醫通,這是一個基于 Spring-Boot 實作的預約掛號統一平臺, 該專案一共包含三個子部分,分別為 yygh-parent、yygh-site 和 yygh-admin, 在架構上,該專案依賴的資料層中間件有 mysql、redis、mongodb 以及 rabbitmq,依賴的流量治理中間件有 sentinel 和 nacos,
接下來,我們約定專案根目錄為 his,然后分別從開源地址 https://gitee.com/leifengyang/yygh-parent、https://gitee.com/leifengyang/yygh-site 和 https://gitee.com/leifengyang/yygh-admin 拉取源代碼:
(base) ? his lsa
total 0
drwxr-xr-x 5 hliangzhao staff 160B Nov 15 10:33 .
drwxr-xr-x@ 42 hliangzhao staff 1.3K Nov 15 10:33 ..
drwxr-xr-x 24 hliangzhao staff 768B Nov 15 10:33 yygh-admin
drwxr-xr-x 15 hliangzhao staff 480B Nov 15 10:33 yygh-parent
drwxr-xr-x 24 hliangzhao staff 768B Nov 15 10:34 yygh-site
依次查看三個專案的檔案布局:
(base) ? his cd yygh-parent
(base) ? yygh-parent git:(master) tree -L 2
.
├── common # 通用模塊
│ ├── common-util
│ ├── pom.xml
│ ├── rabbit-util
│ └── service-util
├── data # 專案演示資料
│ ├── json
│ └── sql
├── hospital-manage # 醫院后臺
│ ├── Dockerfile
│ ├── deploy
│ ├── pom.xml
│ ├── src
├── model # 資料模型
│ ├── pom.xml
│ └── src
├── pom.xml
├── server-gateway # 網關
│ ├── Dockerfile
│ ├── deploy
│ ├── pom.xml
│ └── src
├── service # 微服務層
│ ├── pom.xml
│ ├── service-cmn # 公共服務
│ ├── service-hosp # 醫院資料服務
│ ├── service-order # 預約下單服務
│ ├── service-oss # 物件存盤服務
│ ├── service-sms # 短信服務
│ ├── service-statistics # 統計服務
│ ├── service-task # 定時服務
│ └── service-user # 會員服務
└── service-client
├── pom.xml
├── service-cmn-client
├── service-hosp-client
├── service-order-client
└── service-user-client
30 directories, 12 files
(base) ? yygh-parent git:(master) cd ../yygh-admin
(base) ? yygh-admin git:(master) tree -L 1 # 醫院掛號后臺(前端 UI)
.
├── Dockerfile
├── LICENSE
├── build
├── config
├── deploy
├── favicon.ico
├── index.html
├── package.json
├── src
└── static
5 directories, 9 files
(base) ? yygh-site git:(master) tree -L 1 # 用戶掛號前臺(前端 UI)
.
├── Dockerfile
├── api
├── assets
├── components
├── deploy
├── layouts
├── middleware
├── nuxt.config.js
├── package-lock.json
├── package.json
├── pages
├── plugins
├── static
├── store
└── utils
11 directories, 7 files
對于本專案,我們需要部署如下內容:
yygh-parent/hospital-manage # 醫院管理
yygh-parent/server-gateway # 網關
# 8 個微服務
yygh-parent/service/service-cmn
yygh-parent/service/service-hosp
yygh-parent/service/service-order
yygh-parent/service/service-oss
yygh-parent/service/service-sms
yygh-parent/service/service-statistics
yygh-parent/service/service-task
yygh-parent/service/service-user
# 2 個前端
yygh-admin
yygh-site
以上 12 個待部署的子專案將以獨立 Pod 的形式在集群中部署, 每一個子專案根目錄需要具有一個 Dockerfile 檔案以及一個名為 deploy 的檔案夾, 前者是本子專案的鏡像制作檔案,后者是本子專案的資源清單檔案 *.yaml(用于在集群中部署), 以 service-cmn 為例,其檔案布局如下:
(base) ? service-cmn git:(master) tree -L 2
.
├── Dockerfile # 將本子專案構建為鏡像的 Dockerfile
├── deploy # 存放用于部署本子專案的資源清單檔案
│ └── deploy.yml
├── pom.xml # 專案依賴
├── src # 源代碼
│ └── main
└── target # maven 打包后自動創建
遵循上的一篇文章 使用 KubeSphere 部署 Ruoyi-Cloud · KS 實踐 02 中所述的部署流程,我們首先需要將中間件上云,然后,我們將三個專案以流水線的方式上云,
部署中間件
本專案所使用的中間件除了 Sentinel 和 MongoDB,其他均已在前文中部署, 接下里依次部署這兩個中間件,
對于 Sentinel,我們直接使用雷豐陽已經制作好的鏡像 leifengyang/sentinel:1.8.2,然后暴露一個 NodePort 型別的 Service,埠號為 32636, 訪問 http://192.168.23.160:32636,以默認用戶 sentinel 和默認密碼 sentinel 登錄,可以進入 Sentinel 控制臺, 如果一切順利,應該可以看到類似的頁面:

對于 MongoDB,我們直接通過應用模版部署它(不勾選登錄認證):

為 MongoDB 應用暴露一個 NodePort 型別的 Service,埠號為 31801,然后在本機通過 MongoDB Compass 連接它(192.168.23.160:31801):

如果可以連上,則一切正常,
匯入初始資料
使用 DataGrip 將位于 his/yygh-parent/data/sql 目錄下的全部演示資料(一共有 5 個 sql 檔案需要執行,會創建 5 個 yygh 打頭的資料庫)匯入集群中的 MySQL 實體:

MongoDB 的演示資料將在專案啟動后匯入,
在 Nacos 中創建微服務的啟動配置
觀察每一個子專案的 Dockerfile,以 service-cmn 為例:
# service-cmn 的 Dockerfile
FROM openjdk:8-jdk
LABEL maintainer=leifengyang
# 啟動 prod 環境,以 service-cmn-prod.yml 作為啟動配置
ENV PARAMS="--server.port=8080 --spring.profiles.active=prod --spring.cloud.nacos.server-addr=his-nacos.his:8848 --spring.cloud.nacos.config.file-extension=yml"
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
COPY target/*.jar /app.jar
EXPOSE 8080
ENTRYPOINT ["/bin/sh","-c","java -Dfile.encoding=utf8 -Djava.security.egd=file:/dev/./urandom -jar /app.jar ${PARAMS}"]
這意味著該子專案在啟動時,會激活 prod 環境,并從 Nacos 中讀取 service-cmn-prod.yml 檔案作為啟動配置, 因此,我們首先需要在 Nacos 中創建其生產環境組態檔 service-cmn-prod.yml,然后將 子專案路徑 / src/main/resources/application-dev.yml 的內容復制進去,在其基礎上修改, 需要修改的內容主要是中間件的訪問地址, 以 service-cmn 為例,它的組態檔被命名為 service-cmn-prod.yml,其最終內容如下:
# service-cmn-prod.yml
server:
port: 8080
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mapper-locations: classpath:mapper/*.xml
global-config:
db-config:
logic-delete-value: 1
logic-not-delete-value: 0
spring:
cloud:
sentinel:
transport:
# 修改 sentinel 訪問地址
dashboard: http://his-sentinel-nodeport.his:8080
redis:
# 修改 redis 訪問地址
host: his-redis-nodeport.his
port: 6379
database: 0
timeout: 1800000
password:
lettuce:
pool:
max-active: 20 # 最大連接數
max-wait: -1 # 最大阻塞等待時間 (負數表示沒限制)
max-idle: 5 # 最大空閑
min-idle: 0 # 最小空閑
datasource:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
# 修改 mysql 訪問地址和連接憑證
url: jdbc:mysql://his-mysql-nodeport.his:3306/yygh_cmn?characterEncoding=utf-8&useSSL=false
username: root
password: 123456
hikari:
connection-test-query: SELECT 1
connection-timeout: 60000
idle-timeout: 500000
max-lifetime: 540000
maximum-pool-size: 12
minimum-idle: 10
pool-name: GuliHikariPool
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
如圖 6 所示,除了 hospitla-manage,其余所有 9 個 Spring-Boot 子專案均需要按照上述規則撰寫對應的組態檔, hospitla-manage 的啟動不依賴 Nacos,因此不需要,

創建微服務部署流水線
流水線表示應用從代碼編譯、測驗、打包和部署的程序,KubeSphere 的流水線管理使用了業界常用的 Jenkinsfile 來表述一組 CI/CD 流程, Jenkinsfile 是一個文本檔案,使用了 Jenkins 提供的 DSL(Domain-Specific Language)語法, KubeSphere 提供了可視化編輯器,用戶只需在頁面上輸入少量配置資訊,介面自動組裝完成 Jenkinsfile, 當然,也可直接編輯 Jenkinsfile,
流水線涉及如下幾個概念:
- Stage:階段,一個 Pipeline 可以劃分為若干個 Stage,每個 Stage 代表一組操作,Stage 是一個邏輯分組的概念,可以跨多個 Node,
- Node:節點,一個 Node 就是一個 Jenkins 節點,或者是 Master,或者是 Agent,是執行 Step 的具體運行時環境,
- Step:步驟,Step 是最基本的操作單元,小到創建一個目錄,大到構建一個 Docker 鏡像,由各類 Jenkins Plugin 提供,
KubeSphere 默認提供的 Agent 有 base、go、maven 和 nodejs,它們分別適用于不同編程語言開發的專案的打包構建, 因為我們即將部署的 10 個子專案均是 Spring-Boot 應用,因此我們選擇 maven 作為啟動流水線的 agent,
我們可以直接撰寫流水線的 Jenkinsfile,也可以通過 KubeSphere 提供的可視化頁面編輯流水線, 通常,流水線的第一步是下載專案源代碼 4,我們在 UI 上直接添加相關命令:

KubeSphere 會自動生成這次編輯的 Jenkinsfile 代碼片段:
stage('clone code') {
agent none
steps {
// 拉取代碼并展示代碼檔案布局
container('maven') {
git(url: 'https://gitee.com/leifengyang/yygh-parent', branch: 'master', changelog: true, poll: false)
sh 'ls -al'
}
}
}
流水線的第二個階段通常是專案的打包與編譯, 默認情況下,Maven 從官方倉庫下載專案依賴,如果想要修改默認鏡像倉庫,需要修改集群中名為 ks-devops-agent 的 ConfigMap,它擁有一個叫做 MavenSetting 的鍵:
k8s@ubuntu:~$ k get cm -A | grep devops
his-devopsqxxv7 istio-ca-root-cert 1 24h
his-devopsqxxv7 kube-root-ca.crt 1 24h
kubesphere-devops-system devops-config 1 5d7h
kubesphere-devops-system devops-jenkins 9 5d7h
kubesphere-devops-system istio-ca-root-cert 1 5d7h
kubesphere-devops-system jenkins-agent-config 1 5d7h
kubesphere-devops-system jenkins-casc-config 2 5d7h
kubesphere-devops-system kube-root-ca.crt 1 5d7h
kubesphere-devops-worker istio-ca-root-cert 1 5d7h
kubesphere-devops-worker ks-devops-agent 1 5d7h
kubesphere-devops-worker kube-root-ca.crt 1 5d7h
k8s@ubuntu:~$ k describe cm ks-devops-agent -n kubesphere-devops-worker
Name: ks-devops-agent
Namespace: kubesphere-devops-worker
Labels: app.kubernetes.io/managed-by=Helm
Annotations: meta.helm.sh/release-name: devops
meta.helm.sh/release-namespace: kubesphere-devops-system
Data
=https://www.cnblogs.com/kubesphere/p/===
MavenSetting:
----
<?xml version="1.0" encoding="UTF-8"?>
...
<!--
| This is the configuration file for Maven. It can be specified at two levels:
...
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
...
我們需要修改 MavenSetting 檔案,在其中添加國內鏡像倉庫地址:

我們通過命令 mvn clean package -Dmaven.test.skip=true 進行專案打包編譯,由此,流水線的第二階段需要執行的命令如下:

相應地,在 Jenkinsfile 中也會自動生成第二步的代碼:
stage('project compilation') {
agent none
steps {
container('maven') {
sh 'mvn clean package -Dmaven.test.skip=true'
}
}
}
流水線的第三個階段是制作鏡像,我們在章節 2.1 說過,每個子專案的根目錄有一個 Dockerfile,并且在章節 2.4 展示過 Dockerfile 的內容, 因此,對于單體應用 hospitla-manage,它的鏡像構建命令為 docker build -t hospital-manage -f hospital-manage/Dockerfile hospital-manage/;對于網關子專案 server-gateway,它的鏡像構建命令為 docker build -t server-gateway/Dockerfile server-gateway/;其余 8 個微服務的構建命令則是 docker build -t service/service-xxx service/service-xxx/,這里的 xxx 被替換為具體的微服務名稱, 在上述構建命令中,尤其需要注意的是 Dockerfile 相對于專案根目錄 yygh-parent 所在的位置以及鏡像構建背景關系的相對位置,
因為上述 10 個鏡像的構建相互之間獨立,因此可以并行化執行,我們可以很輕易地在 KubeSphere 中做到這一點:

相應地,Jenkinsfile 中增加了如下內容:
stage('default-2') {
parallel { // 并行構建 10 個鏡像
stage('build hospital-manage') {
agent none
steps {
container('maven') {
sh 'docker build -t hospital-manage -f hospital-manage/Dockerfile hospital-manage/'
}
}
}
stage('build server-gateway') {
...
}
stage('build service-cmn') {
...
}
...
}
}
流水線的第四個階段是鏡像推送,在企業內部,構建好的鏡像通常會被推送到企業的私有倉庫中, 筆者采用阿里云給個人開發者免費提供的鏡像倉庫作為推送目標,因為目標倉庫是一個私有倉庫,因此需要提供賬戶和密碼作為憑證(credential), 如何在 KubeSphere 中為鏡像推送命令提供憑證呢? 我們可以在 DevOps 的專案設定中創建:

上圖中,筆者創建一個名為 aliyun-docker-hub 的憑證,用戶名是我的阿里云賬戶名,密碼則是申請容器鏡像服務所創建的密碼, 讀者需要替換成自己的賬戶密碼:

基于該憑證,我們在 Jenkinsfile 中撰寫鏡像推送的代碼如下:
steps {
container('maven') {
// 使用'aliyun-docker-registry'這個憑證登錄私有倉庫并將鏡像推送至其中
withCredentials([usernamePassword(credentialsId: 'aliyun-docker-registry', passwordVariable: 'ALIYUN_REG_PWD', usernameVariable : 'ALIYUN_REG_USER' ,)]) {
sh 'echo"$ALIYUN_REG_PWD"| docker login $REGISTRY -u"$ALIYUN_REG_USER"--password-stdin'
sh 'docker tag hospital-manage:latest $REGISTRY/$DOCKERHUB_NAMESPACE/hospital-manage:SNAPSHOT-$BUILD_NUMBER'
sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/hospital-manage:SNAPSHOT-$BUILD_NUMBER'
}
}
}
...
environment {
...
REGISTRY = 'registry.cn-hangzhou.aliyuncs.com'
DOCKERHUB_NAMESPACE = 'hliangzhao-private'
...
}
同樣地,上述程序也以并行的方式執行,最終,Jenkinsfile 中被添加了如下代碼:
stage('default-3') {
parallel { // 并行推送 10 個鏡像
stage('push hospital-manage') {
agent none
steps {
container('maven') {
withCredentials([usernamePassword(credentialsId : 'aliyun-docker-registry' ,passwordVariable : 'ALIYUN_REG_PWD' ,usernameVariable : 'ALIYUN_REG_USER' ,)]) {
sh 'echo"$ALIYUN_REG_PWD"| docker login $REGISTRY -u"$ALIYUN_REG_USER"--password-stdin'
sh 'docker tag hospital-manage:latest $REGISTRY/$DOCKERHUB_NAMESPACE/hospital-manage:SNAPSHOT-$BUILD_NUMBER'
sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/hospital-manage:SNAPSHOT-$BUILD_NUMBER'
}
}
}
}
stage('push server-gateway') {
...
}
stage('push service-cmn') {
...
}
...
}
}
測驗一下到目前為止的流水線,一切運行順利:

流水線的最后階段是部署到開發環境和生產環境,因為這一階段需要和 Kubernetes API Server 打交道,所以需要指定 Kubernetes 背景關系 5, KubeSphere 自動為我們創建了名為 demo-kubeconfig 的憑證,該憑證提供了形如 .kube/config 的檔案,使得我們可以根據憑證發起 kubectl apply 命令, 與此同時,我們還需要指定待部署的資源清單檔案的位置, 以子專案 hospital-manage 為例,它的資源清單檔案在 yygh-parent/hospital-manage/deploy/ 目錄下, 觀察該目錄下的 deploy.yaml 檔案,可以發現它要求集群從阿里云私有鏡像倉庫拉取鏡像,需要我們提供 imagePullSecrets 欄位:

這意味著我們需要在 his 專案中創建名為 aliyun-docker-hub 的 Secret, 注意,這里是在為 his 專案創建 Secret,而先前是在 DevOps 的專案設定中創建 Credential,二者的服務物件是不同的, 對于部署這個操作,我們可以直接在 UI 上選擇 “添加 kubernetesDeploy”:

由此生成的 Jenkinsfile 代碼為
stage('deploy hospital-manage to dev') {
agent none
steps {
container('maven') {
kubernetesDeploy(enableConfigSubstitution: true,
deleteResource: false,
kubeconfigId: 'demo-kubeconfig', // 存盤了 kubeconfig 背景關系資訊的檔案
configs: 'hospital-manage/deploy/**' // 資源清單檔案所在位置
)
}
}
}
我們嘗試運行一下現在的流水線,詭異的事情卻發生了,在專案部署階段產生了如下錯誤:
Starting Kubernetes deployment
Loading configuration: /home/jenkins/agent/workspace/his-devopsqxxv7/yygh-parent-devops/hospital-manage/deploy/deploy.yml
ERROR: ERROR: java.lang.RuntimeException: io.kubernetes.client.openapi.ApiException: Bad Request
hudson.remoting.ProxyException: java.lang.RuntimeException: io.kubernetes.client.openapi.ApiException: Bad Request
at com.microsoft.jenkins.kubernetes.wrapper.ResourceManager.handleApiExceptionExceptNotFound(ResourceManager.java:180)
...
Api call failed with code 400, detailed message: {
"kind": "Status",
"apiVersion": "v1",
"metadata": {
},
"status": "Failure",
"message": "the export parameter, deprecated since v1.14, is no longer supported",
"reason": "BadRequest",
"code": 400
}
Kubernetes deployment ended with HasError
觀察報錯內容,似乎是負責執行流水線的 Jenkins Agent 版本太老所導致的, 經過查閱,筆者發現 KubeSphere 的官方維護人員已經提交了相關 issue(https://github.com/kubesphere/website/issues/2096)來說明此事,根據說明,報錯的根源在于 Jenkins 的官方插件 kubernetes-cd-plugin “年久失修”,我所安裝的 Kubernetes 的 API 版本是 v1.22,而 Jenkins 的 kubernetes-cd-plugin 卻已經停擺兩年, 對于這個問題,KubeSphere 官方提供的解決方案是以 shell 命令 kubectl apply -f your-crd-file.yaml 的方式進行部署,而非在 UI 上添加 kubernetesDeploy,
幸運的是,在筆者撰寫此文的 40 分鐘前,KubeSphere 官方發起了一個針對此問題的臨時解決方案:https://github.com/kubesphere/website/pull/2098, 在該 Pull request 中,貢獻者提供了一種提供 kubeconfig 驗證的寫法:
stage('deploy hospital-manage to dev') {
agent none
steps {
container('maven') {
// 如果不提供 kubeconfigFile,則 kubectl 背景關系找不到
withCredentials([kubeconfigFile(credentialsId: env.KUBECONFIG_CREDENTIAL_ID, variable: 'KUBECONFIG')]) {
sh 'kubectl apply -f hospital-manage/deploy/**'
}
}
}
}
實驗證明,該方法有效,同樣地,10 個子專案可以并行化部署到 dev 環境,相應的 Jenkins 代碼就不再展示了, 部署到 prod 環境的操作類似,此外,還可以添加部署條件,例如,只有獲得相關管理員授權之后部署操作才會啟動,
創建前端專案部署流水線
接下來,還剩兩個前端專案 yygh-site 和 yygh-admin 需要部署, 前端專案的部署服從相似的步驟:首先下載原始碼,然后需要通過 Node.js 之類的工具為專案安裝依賴并構建(產生 dist 目錄),最后是鏡像構建、推送和部署, 以 yygh-site 為例,它最終的 Jenkinsfile 如下所示:
pipeline {
agent {
node {
label 'nodejs'
}
}
stages {
stage('拉取代碼') {
agent none
steps {
container('nodejs') {
git(url: 'https://gitee.com/leifengyang/yygh-site', branch: 'master', changelog: true, poll: false)
sh 'ls -al'
}
}
}
stage('專案編譯') {
agent none
steps {
container('nodejs') {
sh 'ls'
sh 'npm install --registry=https://registry.npm.taobao.org'
sh 'npm run build'
}
}
}
stage('構建鏡像') {
agent none
steps {
container('nodejs') {
sh 'ls'
sh 'docker build -t yygh-site:latest -f Dockerfile .'
}
}
}
stage('推送鏡像') {
agent none
steps {
container('nodejs') {
withCredentials([usernamePassword(credentialsId: 'aliyun-docker-registry', usernameVariable: 'DOCKER_USER_VAR', passwordVariable: 'DOCKER_PWD_VAR',)]) {
sh 'echo"$DOCKER_PWD_VAR"| docker login $REGISTRY -u"$DOCKER_USER_VAR"--password-stdin'
sh 'docker tag yygh-site:latest $REGISTRY/$DOCKERHUB_NAMESPACE/yygh-site:SNAPSHOT-$BUILD_NUMBER'
sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/yygh-site:SNAPSHOT-$BUILD_NUMBER'
}
}
}
}
stage('部署到 dev 環境') {
agent none
steps {
kubernetesDeploy(configs: 'deploy/**', enableConfigSubstitution: true, kubeconfigId: "$KUBECONFIG_CREDENTIAL_ID")
}
}
// 1、配置全系統的郵件: 全系統的監控
// 2、修改 ks-jenkins 的配置,里面的郵件; 流水線發郵件
stage('發送確認郵件') {
agent none
steps {
mail(to: '[email protected]', subject: 'yygh-site 構建結果', body: "成功構建 $BUILD_NUMBER")
}
}
}
environment {
...
}
}
此處不再展示更多細節,
總結
KubeSphere 為我們提供了 Jenkins 流水線的編輯頁面,在一定程度上可以簡化操作,
參考
本文參考了雷豐陽的視頻課程 云原生 Java 架構師的第一課 K8s+Docker+KubeSphere+DevOps, 如果想全面而深入地自主實踐,推薦觀看原視頻,
本文由博客一文多發平臺 OpenWrite 發布!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/524976.html
標籤:其他
