基于Kubesphere實現(xiàn)DevOps
一、DevOps介紹
1.1 項目開發(fā)需要考慮的維度
-
dev 怎么開發(fā)
-
ops 怎么運維
參考項目鏈接:https://github.com/kubesphere/devops-maven-sample
1.2 DevOps是什么
二、CI/CD介紹
2.1 持續(xù)集成(Continuous Integration)
持續(xù)集成是指軟件個人的部分向軟件整體部分交付,頻繁進行集成以便更快地發(fā)現(xiàn)其中錯誤。
CI需要具備這些:
- 全面的自動化測試
這是實踐持續(xù)集成&持續(xù)部署的基礎(chǔ),同時,選擇合適的自動化測試工具也很重要
- 靈活的基礎(chǔ)設(shè)施
容器、虛擬機的存在讓開發(fā)人員和QA人員不必再大費周張去做IT基礎(chǔ)設(shè)施環(huán)境的準備
- 版本控制工具
如:Git、SNV、Gitlab等
- 自動化的構(gòu)建和軟件發(fā)布流程工具
如:Jenkins Gitlab Tekton等
- 反饋機制
如果構(gòu)建/測試失敗,可以快速地反饋到相關(guān)負責(zé)人,以盡快速度解決問題,實現(xiàn)軟件開發(fā)穩(wěn)定版本推出。
2.2 持續(xù)交付(Continuous Delivery )
持續(xù)交付在持續(xù)集成的基礎(chǔ)上,將集成后的代碼部署到更貼近真實運行環(huán)境的類生產(chǎn)環(huán)境中,持續(xù)交付優(yōu)先于整個產(chǎn)品生命周期的軟件部署,建立在高水平自動化持續(xù)集成之上。
- 快速發(fā)布
能夠應(yīng)對業(yè)務(wù)需求,并更快地實現(xiàn)軟件價值,實現(xiàn)編碼、測試、上線、交付的頻繁迭代周期縮短,同時獲得迅速反饋
- 高質(zhì)量軟件發(fā)布標準
整個交付過程標準化、可重復(fù)、可靠
- 整個交付過程進度可視化
方便團隊成員了解項目成熟度
- 更先進的團隊協(xié)作方式
從需求分析、產(chǎn)品的用戶體驗到交互設(shè)計、開發(fā)、測試、運維等角色密切協(xié)作,相比于傳統(tǒng)的的開發(fā)模式,減少浪費
2.3 持續(xù)部署(Continuous Deployment)
持續(xù)部署是指當(dāng)交付的代碼通過評審之后,自動部署到生產(chǎn)環(huán)境中。
持續(xù)部署是持續(xù)交付的最高階段。這就意味著,所有通過了一系列的自動化測試的發(fā)動都將自動部署到生產(chǎn)環(huán)境。它也可以被稱為Continuous Release
持續(xù)部署主要好處是,可以相對獨立地部署新的功能,并能快速地收集真實用戶的反饋。
三、KubeSphere DevOps憑證管理
3.1 憑證介紹
憑證是包含敏感信息的對象,例如用戶名和密碼、SSH 密鑰和令牌 (Token)。當(dāng) KubeSphere DevOps 流水線運行時,會與外部環(huán)境中的對象進行交互,以執(zhí)行一系列任務(wù),包括拉取代碼、推送和拉取鏡像以及運行腳本等。此過程中需要提供相應(yīng)的憑證,而這些憑證不會明文出現(xiàn)在流水線中。
具有必要權(quán)限的 DevOps 項目用戶可以為 Jenkins 流水線配置憑證。用戶在 DevOps 項目中添加或配置這些憑證后,便可以在 DevOps 項目中使用這些憑證與第三方應(yīng)用程序進行交互。
目前,您可以在 DevOps 項目中創(chuàng)建以下 4 種類型的憑證:
-
用戶名和密碼:用戶名和密碼,可以作為單獨的組件處理,或者作為用冒號分隔的字符串(格式為
username:password
)處理,例如 GitHub、GitLab 和 Docker Hub 的帳戶。 - SSH 密鑰:帶有私鑰的用戶名,SSH 公鑰/私鑰對。
- 訪問令牌:具有訪問權(quán)限的令牌。
- kubeconfig:用于配置跨集群認證。如果選擇此類型,將自動獲取當(dāng)前 Kubernetes 集群的 kubeconfig 文件內(nèi)容,并自動填充在當(dāng)前頁面對話框中。
本教程演示如何在 DevOps 項目中創(chuàng)建和管理憑證。有關(guān)如何使用憑證的更多信息,請參見使用 Jenkinsfile 創(chuàng)建流水線和使用圖形編輯面板創(chuàng)建流水線。
3.2 準備工作
- 您已啟用 KubeSphere DevOps 系統(tǒng)。
- 您需要有一個企業(yè)空間、一個 DevOps 項目和一個用戶 (
project-regular
),并已邀請此帳戶至 DevOps 項目中且授予operator
角色。如果尚未準備好,請參見創(chuàng)建企業(yè)空間、項目、用戶和角色。
3.3 創(chuàng)建憑證
以 project-regular
身份登錄 KubeSphere 控制臺。進入您的 DevOps 項目,選擇憑證,然后點擊創(chuàng)建。
3.3.1 創(chuàng)建 Docker Hub 憑證
- 首先需要在Docker Hub官網(wǎng)注冊賬號,需要關(guān)聯(lián)dockerhub上傳拉做鏡像取等
- 在彈出的對話框中輸入以下信息。
-
名稱:設(shè)置可以在流水線中使用的 ID,例如
dockerhub-id
。 - 類型:選擇用戶名和密碼。
- 用戶名:您的 Docker Hub 帳戶(即 Docker ID)。
- 密碼/令牌:您的 Docker Hub 密碼。
- 描述信息:憑證的簡介。
-
名稱:設(shè)置可以在流水線中使用的 ID,例如
- 完成操作后點擊確定。
3.3.2 創(chuàng)建 GitHub 憑證
- 首先要注冊github賬號
同樣地,按照上述相同步驟創(chuàng)建 GitHub 憑證。設(shè)置不同的名稱(例如 github-id
),類型同樣選擇用戶名和密碼。分別在用戶名和 密碼/令牌中輸入您的 GitHub 用戶名和令牌。
- 自 2021 年 8 月起,GitHub 要求使用基于令牌的身份驗證,此處需要輸入令牌,而非 GitHub 密碼。關(guān)于如如何生成令牌,請參閱創(chuàng)建個人訪問令牌。
- 如果您的帳戶或密碼中包含任何特殊字符,例如
@
和$
,可能會因為無法識別而在流水線運行時導(dǎo)致錯誤。在這種情況下,您需要先在一些第三方網(wǎng)站(例如 urlencoder)上對帳戶或密碼進行編碼,然后將輸出結(jié)果復(fù)制粘貼作為您的憑證信息。
3.3.3 創(chuàng)建 kubeconfig 憑證
同樣地,按照上述相同步驟創(chuàng)建 kubeconfig 憑證。設(shè)置不同的憑證 ID(例如 demo-kubeconfig
)并選擇 kubeconfig。
用于配置集群訪問的文件稱為 kubeconfig 文件。這是引用配置文件的通用方法。有關(guān)更多信息,請參見 Kubernetes 官方文檔。您可以創(chuàng)建 kubeconfig 憑證來訪問當(dāng)前 Kubernetes 集群,該憑證將在流水線中使用。您不需要更改該文件,因為 KubeSphere 會自動使用當(dāng)前 Kubernetes 集群的 kubeconfig 填充該字段。訪問其他集群時,您可能需要更改 kubeconfig。
3.3.4 查看和管理憑證
- 憑證創(chuàng)建后,會在列表中顯示。
- 點擊任意一個憑證,進入其詳情頁面,您可以查看帳戶詳情和與此憑證相關(guān)的所有事件。
- 您也可以在此頁面上編輯或刪除憑證。請注意,編輯憑證時,KubeSphere 不會顯示現(xiàn)有用戶名或密碼信息。如果輸入新的用戶名和密碼,則前一個將被覆蓋。
四、將SonarQube集成到流水線
SonarQube 是一種主流的代碼質(zhì)量持續(xù)檢測工具。您可以將其用于代碼庫的靜態(tài)和動態(tài)分析。SonarQube 集成到 KubeSphere 流水線后,如果在運行的流水線中檢測到問題,您可以直接在儀表板上查看常見代碼問題,例如 Bug 和漏洞。
4.1 準備工作
您需要啟用 KubeSphere DevOps 系統(tǒng)。
4.2 安裝 SonarQube 服務(wù)器
要將 SonarQube 集成到您的流水線,必須先安裝 SonarQube 服務(wù)器。
1.請先安裝 Helm,以便后續(xù)使用該工具安裝 SonarQube。例如,運行以下命令安裝 Helm 3:
- master節(jié)點運行
# curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
2.查看helm版本
# helm version
version.BuildInfo{Version:"v3.10.1", GitCommit:"9f88ccb6aee40b9a0535fcc7efea6055e1ef72c9", GitTreeState:"clean", GoVersion:"go1.18.7"}
3.執(zhí)行以下命令安裝 SonarQube 服務(wù)器
# helm upgrade --install sonarqube sonarqube --repo https://charts.kubesphere.io/main -n kubesphere-devops-system --create-namespace --set service.type=NodePort
- 查看服務(wù)是否運行起來了:# kubectl get pods -n kubesphere-devops-system
4.您會獲取以下提示內(nèi)容
[root@k8s-master01 ~]# kubectl get svc -n kubesphere-devops-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
devops-apiserver ClusterIP 10.96.2.56 <none> 9090/TCP 5d16h
devops-jenkins NodePort 10.96.1.111 <none> 80:30180/TCP 5d16h
devops-jenkins-agent ClusterIP 10.96.2.94 <none> 50000/TCP 5d16h
s2ioperator-metrics-service ClusterIP 10.96.2.41 <none> 8080/TCP 5d16h
s2ioperator-trigger-service ClusterIP 10.96.2.217 <none> 8081/TCP 5d16h
sonarqube-postgresql ClusterIP 10.96.2.172 <none> 5432/TCP 3m38s
sonarqube-postgresql-headless ClusterIP None <none> 5432/TCP 3m38s
sonarqube-sonarqube NodePort 10.96.0.120 <none> 9000:30058/TCP 3m38s
webhook-server-service ClusterIP 10.96.3.74 <none> 443/TCP 5d16h
4.3 獲取 SonarQube 控制臺地址
1.執(zhí)行以下命令以獲取 SonarQube NodePort
# export NODE_PORT=$(kubectl get --namespace kubesphere-devops-system -o jsonpath="{.spec.ports[0].nodePort}" services sonarqube-sonarqube)
# export NODE_IP=$(kubectl get nodes --namespace kubesphere-devops-system -o jsonpath="{.items[0].status.addresses[0].address}")
# echo http://$NODE_IP:$NODE_PORT
2.您可以獲得如下輸出(本示例中端口號為 30058
,可能與您的端口號不同)
http://192.168.10.141:30058
4.4 配置 SonarQube 服務(wù)器
4.4.1 訪問 SonarQube 控制臺
1.執(zhí)行以下命令查看 SonarQube 的狀態(tài)。請注意,只有在 SonarQube 啟動并運行后才能訪問 SonarQube 控制臺。
[root@k8s-master01 ~]# kubectl get pods -n kubesphere-devops-system
NAME READY STATUS RESTARTS AGE
sonarqube-postgresql-0 1/1 Running 0 37m
sonarqube-sonarqube-df8d79d5c-hxxbx 1/1 Running 10 (2m34s ago) 37m
2.在瀏覽器中訪問 SonarQube 控制臺 http://<Node IP>:<NodePort>
。
3.點擊右上角的 Log in,然后使用默認帳戶 admin/admin
登錄。
取決于您的實例的部署位置,您可能需要設(shè)置必要的端口轉(zhuǎn)發(fā)規(guī)則,并在您的安全組中放行該端口,以便訪問 SonarQube。
4.4.2 創(chuàng)建 SonarQube 管理員令牌 (Token)
1.點擊右上角字母 A,然后從菜單中選擇 My Account 以轉(zhuǎn)到 Profile 頁面。
2.點擊 Security 并輸入令牌名稱,例如 kubesphere
。
3.點擊 Generate 并復(fù)制此令牌。
c3ee79a4c4b25bd03867db735dc439e3bb726426
如提示所示,您無法再次查看此令牌,因此請確保復(fù)制成功。
4.4.3 創(chuàng)建 Webhook 服務(wù)器
1.執(zhí)行以下命令獲取 SonarQube Webhook 的地址
# export NODE_PORT=$(kubectl get --namespace kubesphere-devops-system -o jsonpath="{.spec.ports[0].nodePort}" services devops-jenkins)
# export NODE_IP=$(kubectl get nodes --namespace kubesphere-devops-system -o jsonpath="{.items[0].status.addresses[0].address}")
# echo http://$NODE_IP:$NODE_PORT/sonarqube-webhook/
2.輸出結(jié)果
http://192.168.10.141:30180/sonarqube-webhook/
3.依次點擊 Administration、Configuration 和 Webhooks 創(chuàng)建一個 Webhook
4.點擊 Create
5.在彈出的對話框中輸入 Name 和 Jenkins Console URL(即 SonarQube Webhook 地址)。點擊 Create 完成操作。
4.4.4 將 SonarQube 配置添加到 ks-installer
1.執(zhí)行以下命令編輯 ks-installer
# kubectl edit cc -n kubesphere-system ks-installer
2.搜尋至 devops
。添加字段 sonarqube
并在其下方指定 externalSonarUrl
和 externalSonarToken
。
devops:
enabled: true
jenkinsJavaOpts_MaxRAM: 2g
jenkinsJavaOpts_Xms: 512m
jenkinsJavaOpts_Xmx: 512m
jenkinsMemoryLim: 2Gi
jenkinsMemoryReq: 1500Mi
jenkinsVolumeSize: 8Gi
sonarqube:
externalSonarUrl: http://192.168.10.141:30058
externalSonarToken: c3ee79a4c4b25bd03867db735dc439e3bb726426
3.完成操作后保存此文件
4.4.5 將 SonarQube 服務(wù)器添加至 Jenkins
1.執(zhí)行以下命令獲取 Jenkins 的地址
# export NODE_PORT=$(kubectl get --namespace kubesphere-devops-system -o jsonpath="{.spec.ports[0].nodePort}" services devops-jenkins)
# export NODE_IP=$(kubectl get nodes --namespace kubesphere-devops-system -o jsonpath="{.items[0].status.addresses[0].address}")
# echo http://$NODE_IP:$NODE_PORT
2.可以獲得以下輸出,獲取 Jenkins 的端口號
http://192.168.10.141:30180
3.請使用地址 http://<Node IP>:30180
訪問 Jenkins。安裝 KubeSphere 時,默認情況下也會安裝 Jenkins 儀表板。此外,Jenkins 還配置有 KubeSphere LDAP,這意味著您可以直接使用 KubeSphere 帳戶(例如 admin/P@88w0rd
)登錄 Jenkins。有關(guān)配置 Jenkins 的更多信息,請參見 Jenkins 系統(tǒng)設(shè)置。
取決于您的實例的部署位置,您可能需要設(shè)置必要的端口轉(zhuǎn)發(fā)規(guī)則,并在您的安全組中放行端口
30180
,以便訪問 Jenkins。
4.可以前往系統(tǒng)管理下的 Manage Credentials 并點擊 Stores scoped to Jenkins 下的 Jenkins,再點擊全局憑據(jù) (unrestricted),然后點擊左側(cè)導(dǎo)航欄的添加憑據(jù),參考上方第二張截圖用 SonarQube 管理員令牌添加憑證。添加憑證后,從 Server authentication token 旁邊的下拉列表中選擇該憑證。
5.點擊左側(cè)導(dǎo)航欄中的系統(tǒng)管理
6.向下翻頁找到并點擊系統(tǒng)配置
6.搜尋到SonarQube Server,然后點擊Add SonarQube
7.輸入 Name 和 Server URL (http://<Node IP>:<NodePort>
)。點擊添加,選擇 Jenkins,然后在彈出的對話框中用 SonarQube 管理員令牌創(chuàng)建憑證(如下方第二張截圖所示)。創(chuàng)建憑證后,從 Server authentication token 旁邊的下拉列表中選擇該憑證。點擊應(yīng)用完成操作。
4.4.6 將 sonarqubeURL 添加到 KubeSphere 控制臺
您需要指定 sonarqubeURL
,以便可以直接從 KubeSphere 控制臺訪問 SonarQube
1.執(zhí)行以下命令
# kubectl edit cm -n kubesphere-system ks-console-config
2.搜尋到 data.client.enableKubeConfig
,在下方添加 devops
字段并指定 sonarqubeURL
apiVersion: v1
data:
local_config.yaml: |
server:
http:
hostname: localhost
port: 8000
static:
production:
/public: server/public
/assets: dist/assets
/dist: dist
redis:
port: 6379
host: redis.kubesphere-system.svc
redisTimeout: 5000
sessionTimeout: 7200000
client:
version:
kubesphere: v3.1.0
kubernetes: v1.24.0
openpitrix: v3.1.0
enableKubeConfig: true
devops: 手動添加
sonarqubeURL: http://192.168.10.141:30058
defaultClusterName: default
3.保存該文件
4.4.7 重啟服務(wù)
# kubectl -n kubesphere-devops-system rollout restart deploy devops-apiserver
# kubectl -n kubesphere-system rollout restart deploy ks-console
4.4.8 為新項目創(chuàng)建 SonarQube Token
需要一個 SonarQube 令牌,以便您的流水線可以在運行時與 SonarQube 通信。
1.在 SonarQube 控制臺上,點擊 Create new project。
4c5c650e18a80f699d5301773230773ad6e17924
2.創(chuàng)建令牌后,點擊 Continue
3.分別選擇 Java 和 Maven。
復(fù)制下圖所示綠色框中的序列號,如果要在流水線中使用,則需要在憑證中添加此序列號。
mvn sonar:sonar \
-Dsonar.projectKey=java-demo \
-Dsonar.host.url=http://192.168.10.141:30058 \
-Dsonar.login=4c5c650e18a80f699d5301773230773ad6e17924
五、為 KubeSphere 流水線設(shè)置電子郵件服務(wù)器
內(nèi)置 Jenkins 無法與平臺通知系統(tǒng)共享相同的電子郵件配置。因此,您需要單獨為 KubeSphere DevOps 流水線配置電子郵件服務(wù)器設(shè)置。
5.1 準備工作
- 您需要啟用 KubeSphere DevOps 系統(tǒng)。
- 您需要一個具有集群管理權(quán)限的帳戶。例如,您可以直接以
admin
身份登錄控制臺或者創(chuàng)建具有該權(quán)限的新角色并將該角色分配給一個用戶。
5.2 設(shè)置電子郵件服務(wù)器
1.點擊左上角的平臺管理,然后選擇集群管理。
2.如果您已經(jīng)啟用多集群功能并已導(dǎo)入成員集群,那么您可以選擇一個特定集群以查看其節(jié)點。如果尚未啟用該功能,請直接參考下一步。
3.轉(zhuǎn)到應(yīng)用負載下的工作負載,然后從下拉列表中選擇 kubesphere-devops-system 項目。點擊 devops-jenkins
右側(cè)的 并選擇編輯 YAML 以編輯其 YAML 配置文件。
4.向下滾動到下圖所示的需要指定的字段。完成修改后,點擊確定以保存。
在
devops-jenkins
部署 (Deployment) 中修改電子郵件服務(wù)器后,它會重新啟動。因此,DevOps 系統(tǒng)將在幾分鐘內(nèi)不可用,請在適當(dāng)?shù)臅r候進行此類修改。
環(huán)境變量名稱 | 描述信息 |
---|---|
EMAIL_SMTP_HOST | SMTP 服務(wù)器地址 |
EMAIL_SMTP_PORT | SMTP 服務(wù)器端口(如:25) |
EMAIL_FROM_ADDR | 電子郵件發(fā)件人地址 |
EMAIL_FROM_NAME | 電子郵件發(fā)件人姓名 |
EMAIL_FROM_PASS | 電子郵件發(fā)件人密碼 |
EMAIL_USE_SSL | 是否啟用 SSL 配置 |
實際配置:
六、使用圖形編輯面板創(chuàng)建流水線
KubeSphere 中的圖形編輯面板包含用于 Jenkins 階段 (Stage) 和步驟 (Step) 的所有必要操作。您可以直接在交互式面板上定義這些階段和步驟,無需創(chuàng)建任何 Jenkinsfile。
本教程演示如何在 KubeSphere 中使用圖形編輯面板創(chuàng)建流水線。KubeSphere 在整個過程中將根據(jù)您在編輯面板上的設(shè)置自動生成 Jenkinsfile,您無需手動創(chuàng)建 Jenkinsfile。待流水線成功運行,它會相應(yīng)地在您的開發(fā)環(huán)境中創(chuàng)建一個部署 (Deployment) 和一個服務(wù) (Service),并將鏡像推送至 Docker Hub。
6.1 準備工作
- 您需要啟用 KubeSphere DevOps 系統(tǒng)。
- 您需要有一個 Docker Hub 帳戶。
- 您需要創(chuàng)建一個企業(yè)空間、一個 DevOps 項目和一個用戶 (
project-regular
),必須邀請該用戶至 DevOps 項目中并賦予operator
角色。如果尚未創(chuàng)建,請參見創(chuàng)建企業(yè)空間、項目、用戶和角色。 - 設(shè)置 CI 專用節(jié)點來運行流水線(可選)。有關(guān)更多信息,請參見為緩存依賴項設(shè)置 CI 節(jié)點。
- 配置您的電子郵件服務(wù)器用于接收流水線通知(可選)。有關(guān)更多信息,請參見為 KubeSphere 流水線設(shè)置電子郵件服務(wù)器。
- 配置 SonarQube 將代碼分析納入流水線中(可選)。有關(guān)更多信息,請參見將 SonarQube 集成到流水線。
6.2 流水線概述
本示例流水線包括以下六個階段。
- 階段 1:Checkout SCM:從 GitHub 倉庫拉取源代碼。
- 階段 2:單元測試:待該測試通過后才會進行下一階段。
- 階段 3:代碼分析:配置 SonarQube 用于靜態(tài)代碼分析。
-
階段 4:構(gòu)建并推送:構(gòu)建鏡像并附上標簽
snapshot-$BUILD_NUMBER
推送至 Docker Hub,其中$BUILD_NUMBER
是流水線活動列表中的記錄的序列號。 - 階段 5:制品:生成一個制品(JAR 文件包)并保存。
- 階段 6:部署至開發(fā)環(huán)境:在開發(fā)環(huán)境中創(chuàng)建一個部署和一個服務(wù)。該階段需要進行審核,部署成功運行后,會發(fā)送電子郵件通知。
6.3 流水線設(shè)置
6.3.1 創(chuàng)建憑證
1.以 project-regular
身份登錄 KubeSphere 控制臺。轉(zhuǎn)到您的 DevOps 項目,在 DevOps 項目設(shè)置下的憑證頁面創(chuàng)建以下憑證。有關(guān)如何創(chuàng)建憑證的更多信息,請參見憑證管理。
如果您的帳戶或密碼中有任何特殊字符,例如
@
和$
,可能會因為無法識別而在流水線運行時導(dǎo)致錯誤。在這種情況下,您需要先在一些第三方網(wǎng)站(例如 urlencoder)上對帳戶或密碼進行編碼,然后將輸出結(jié)果復(fù)制粘貼作為您的憑證信息。
憑證 ID | 類型 | 用途 |
---|---|---|
dockerhub-id | 用戶名和密碼 | Docker Hub |
demo-kubeconfig | kubeconfig | Kubernetes |
2.您還需要為 SonarQube 創(chuàng)建一個憑證 ID (sonar-token
),用于上述的階段 3(代碼分析)。請參閱為新項目創(chuàng)建 SonarQube 令牌 (Token),在訪問令牌類型的憑證的令牌字段中輸入 SonarQube 令牌。點擊確定完成操作。
3.你在列表中可以看到4個憑證
6.3.2 創(chuàng)建項目
在本教程中,示例流水線會將 sample 應(yīng)用部署至一個項目。因此,您必須先創(chuàng)建一個項目(例如 kubesphere-sample-dev
)。待流水線成功運行,會在該項目中自動創(chuàng)建該應(yīng)用的部署和服務(wù)。
您可以使用 project-admin
帳戶創(chuàng)建項目。此外,該用戶也是 CI/CD 流水線的審核員。請確保將 project-regular
帳戶邀請至該項目并授予 operator
角色。有關(guān)更多信息,請參見創(chuàng)建企業(yè)空間、項目、用戶和角色。
6.3.3 創(chuàng)建流水線
1.請確保以 project-regular
身份登錄 KubeSphere 控制臺,轉(zhuǎn)到您的 DevOps 項目。在流水線頁面點擊創(chuàng)建。
2.在彈出的對話框中,將它命名為 graphical-pipeline
,點擊下一步。
3.在高級設(shè)置頁面,點擊添加,添加以下三個字符串參數(shù)。這些參數(shù)將用于流水線的 Docker 命令。添加完成后,點擊創(chuàng)建。
參數(shù)類型 | 名稱 | 值 | 描述信息 |
---|---|---|---|
字符串 | REGISTRY | docker.io |
鏡像倉庫地址。本示例使用 docker.io 。 |
字符串 | DOCKERHUB_NAMESPACE | Docker ID | 您的 Docker Hub 帳戶或該帳戶下的組織名稱。 |
字符串 | APP_NAME | devops-sample |
應(yīng)用名稱。 |
有關(guān)其他字段,請直接使用默認值或者參考流水線設(shè)置以自定義配置。
4.創(chuàng)建的流水線會顯示在列表中
6.3.4 編輯流水線
- 點擊流水線進入其詳情頁面。要使用圖形編輯面板,請點擊任務(wù)狀態(tài)選項卡下的編輯流水線。在彈出的對話框中,點擊自定義流水線。該流水線包括六個階段,請按照以下步驟設(shè)置每個階段。
- 您也可以點擊持續(xù)集成 (CI) 和持續(xù)集成&交付 (CI/CD) 來使用 KubeSphere 提供的內(nèi)置流水線模板。
流水線詳情頁面會顯示同步狀態(tài),它是 KubeSphere 和 Jenkins 之間的同步結(jié)果。若同步成功,您會看到成功圖標。您也可以點擊編輯 Jenkinsfile 手動為流水線創(chuàng)建一個 Jenkinsfile。
6.3.4.1 階段 1:拉取源代碼 (Checkout SCM)
圖形編輯面板包括兩個區(qū)域:左側(cè)的畫布和右側(cè)的內(nèi)容。它會根據(jù)您對不同階段和步驟的配置自動生成一個 Jenkinsfile,為開發(fā)者提供更加用戶友好的操作體驗。
流水線包括聲明式流水線和腳本化流水線。目前,您可以使用該面板創(chuàng)建聲明式流水線。有關(guān)流水線語法的更多信息,請參見 Jenkins 文檔。
1.在圖形編輯面板上,從類型下拉列表中選擇 node,從 Label 下拉列表中選擇 maven。
agent
用于定義執(zhí)行環(huán)境。agent
指令指定 Jenkins 執(zhí)行流水線的位置和方式。有關(guān)更多信息,請參見選擇 Jenkins Agent。
2.請點擊左側(cè)的加號圖標來添加階段。點擊添加步驟上方的文本框,然后在右側(cè)的名稱字段中為該階段設(shè)置名稱(例如 Checkout SCM
)。
3.點擊添加步驟。在列表中選擇 git,以從 GitHub 拉取示例代碼。在彈出的對話框中,填寫必需的字段。點擊確定完成操作。
-
URL:輸入 GitHub 倉庫地址
https://github.com/kubesphere/devops-maven-sample.git
。請注意,這里是示例地址,您需要使用您自己的倉庫地址。 - 憑證 ID:本教程中無需輸入憑證 ID。
-
分支:如果您將其留空,則默認為 master 分支。請輸入
sonarqube
,或者如果您不需要代碼分析階段,請將其留空。
https://github.com/nextgomsb/devops-maven-sample.git
后續(xù)執(zhí)行過程中有問題時,可以嘗試修改容器基礎(chǔ)鏡像
創(chuàng)建流水線
4.第一階段設(shè)置完成
6.3.4.2 階段 2:單元測試
1.點擊階段 1 右側(cè)的加號圖標添加新的階段,以在容器中執(zhí)行單元測試。將它命名為 Unit Test
。
2.點擊添加步驟,在列表中選擇指定容器。將其命名為 maven
然后點擊確定。
3.點擊添加嵌套步驟,在 maven
容器下添加一個嵌套步驟。在列表中選擇 shell 并在命令行中輸入以下命令。點擊確定保存操作。
mvn clean package
您可以在圖形編輯面板上指定在給定階段指令中執(zhí)行的一系列步驟。
6.3.4.3 階段 3:代碼分析(可選)
本階段使用 SonarQube 來測試您的代碼。如果您不需要代碼分析,可以跳過該階段。
1.點擊 Unit Test
階段右側(cè)的加號圖標添加一個階段,以在容器中進行 SonarQube 代碼分析。將它命名為 Code Analysis
。
2.在 Code Analysis 中,點擊任務(wù)下的添加步驟,選擇指定容器。將其命名為 maven
然后點擊確定。
3.點擊 maven
容器下的添加嵌套步驟,以添加一個嵌套步驟。點擊添加憑證并從憑證 ID 列表中選擇 SonarQube 令牌 (sonar-token
)。在文本變量中輸入 SONAR_TOKEN
,然后點擊確定。
4.在添加憑證步驟下,點擊添加嵌套步驟為其添加一個嵌套步驟。
5.點擊 Sonarqube 配置,在彈出的對話框中保持默認名稱 sonar
不變,點擊確定保存操作
6.在 Sonarqube 配置步驟下,點擊添加嵌套步驟為其添加一個嵌套步驟。
7.點擊 shell 并在命令行中輸入以下命令,用于 sonarqube 分支和認證,點擊確定完成操作。
mvn sonar:sonar -Dsonar.login=$SONAR_TOKEN
8.點擊指定容器步驟下的添加嵌套步驟(第三個),選擇超時。在時間中輸入 1
并將單位選擇為小時,點擊確定完成操作。
9.點擊超時步驟下的添加嵌套步驟,選擇代碼質(zhì)量檢查 (SonarQube)。在彈出的對話框中選擇檢查通過后開始后續(xù)任務(wù)。點擊確定保存操作。
6.3.4.4 階段 4:構(gòu)建并推送鏡像
點擊前一個階段右側(cè)的加號圖標添加一個新的階段,以構(gòu)建并推送鏡像至 Docker Hub。將其命名為 Build and Push
。
2.點擊任務(wù)下的添加步驟,選擇指定容器,將其命名為 maven
,然后點擊確定。
3.點擊 maven
容器下的添加嵌套步驟添加一個嵌套步驟。在列表中選擇 shell 并在彈出窗口中輸入以下命令,點擊確定完成操作。
mvn -Dmaven.test.skip=true clean package
4.再次點擊添加嵌套步驟,選擇 shell。在命令行中輸入以下命令,以根據(jù) Dockerfile 構(gòu)建 Docker 鏡像。點擊確定確認操作。
請勿遺漏命令末尾的點
.
docker build -f Dockerfile-online -t $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:SNAPSHOT-$BUILD_NUMBER .
- 這里構(gòu)建的鏡像文件格如果是第一次即為: SNAPSHOT-1,第二次則是SNAPSHOT-2
- 注意如果構(gòu)建失敗,把可以SNAPSHOT- 改成 v
docker build -f Dockerfile-online -t $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:v$BUILD_NUMBER .
5.再次點擊添加嵌套步驟,選擇添加憑證。在彈出的對話框中填寫以下字段,點擊確定確認操作。
-
憑證名稱:選擇您創(chuàng)建的 Docker Hub 憑證,例如
dockerhub-id
。 -
密碼變量:輸入
DOCKER_PASSWORD
。 -
用戶名變量:輸入
DOCKER_USERNAME
。
出于安全原因,帳戶信息在腳本中顯示為變量。
6.在添加憑證步驟中點擊添加嵌套步驟(第一個)。選擇 shell 并在彈出窗口中輸入以下命令,用于登錄 Docker Hub。點擊確定確認操作。
echo "$DOCKER_PASSWORD" | docker login $REGISTRY -u "$DOCKER_USERNAME" --password-stdin
7.在添加憑證步驟中點擊添加嵌套步驟。選擇 shell 并輸入以下命令,將 SNAPSHOT 鏡像推送至 Docker Hub。點擊確定完成操作。
docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:SNAPSHOT-$BUILD_NUMBER
- 注意如果構(gòu)建失敗,把可以SNAPSHOT- 改成 v
docker build -f Dockerfile-online -t $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:v$BUILD_NUMBER .
6.3.4.5 階段 5:生成制品
1.點擊 Build and Push 階段右側(cè)的加號圖標添加一個新的階段,以保存制品,將其命名為 Artifacts
。本示例使用 JAR 文件包。
2.選中 Artifacts 階段,點擊任務(wù)下的添加步驟,選擇保存制品。在彈出的對話框中輸入 target/*.jar
,用于設(shè)置 Jenkins 中制品的保存路徑。點擊確定完成操作。
target/*.jar
6.3.4.6 階段 6:部署至開發(fā)環(huán)境
1.點擊 Artifacts 階段右側(cè)的加號圖標添加最后一個階段,將其命名為 Deploy to Dev
。該階段用于將資源部署至您的開發(fā)環(huán)境(即 kubesphere-sample-dev
項目)。
2.點擊 Deploy to Dev 階段下的添加步驟,在列表中選擇審核,然后在消息字段中填入 @project-admin
,即 project-admin
帳戶在流水線運行到該階段時會進行審核。點擊確定保存操作。
在 KubeSphere 3.2.x 中,能夠運行流水線的帳戶也能夠繼續(xù)或終止該流水線。此外,流水線創(chuàng)建者、擁有該項目管理員角色的用戶或者您指定的帳戶也有權(quán)限繼續(xù)或終止流水線。
3.再次點擊 Deploy to Dev 階段下的添加步驟。在列表中選擇指定容器,將其命名為 maven
然后點擊確定。
4.點擊 maven
容器步驟下的添加嵌套步驟。在列表中選擇添加憑證,在彈出的對話框中填寫以下字段,然后點擊確定。
- 憑證名稱:選擇您創(chuàng)建的 kubeconfig 憑證,例如
demo-kubeconfig
。 - kubeconfig 變量:輸入
KUBECONFIG_CONTENT
。
5.點擊添加憑證步驟下的添加嵌套步驟。在列表中選擇 shell,在彈出的對話框中輸入以下命令,然后點擊確定。
mkdir ~/.kube
echo "$KUBECONFIG_CONTENT" > ~/.kube/config
envsubst < deploy/dev-ol/devops-sample-svc.yaml | kubectl apply -f -
envsubst < deploy/dev-ol/devops-sample.yaml | kubectl apply -f -
- 注意:devops-sample.yaml中的鏡像值要與前面配置的一致
spec.container.image: $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:v$BUILD_NUMBER
6.如果您想在流水線成功運行時接收電子郵件通知,請點擊添加步驟,選擇郵件,以添加電子郵件信息。請注意,配置電子郵件服務(wù)器是可選操作,如果您跳過該步驟,依然可以運行流水線。
7.待您完成上述步驟,請在右下角點擊保存。隨后,您可以看到該流水線有完整的工作流,并且每個階段也清晰列示。當(dāng)您用圖形編輯面板定義流水線時,KubeSphere 會自動創(chuàng)建相應(yīng)的 Jenkinsfile。點擊編輯 Jenkinsfile 查看該 Jenkinsfile。
在流水線頁面,您可以點擊該流水線右側(cè)的
,然后選擇復(fù)制來創(chuàng)建該流水線的副本。如果您需要同時運行多個不包含多分支的流水線,您可以全部選中這些流水線,然后點擊運行來批量運行它們。
6.4 運行流水線
1.您需要手動運行使用圖形編輯面板創(chuàng)建的流水線。點擊運行,您可以在彈出的對話框中看到步驟 3 中已定義的三個字符串參數(shù)。點擊確定來運行流水線。
2.要查看流水線的狀態(tài),請轉(zhuǎn)到運行記錄選項卡,點擊您想查看的記錄。
3.稍等片刻,流水線如果成功運行,則會在 Deploy to Dev 階段停止。project-admin
作為流水線的審核員,需要進行審批,然后資源才會部署至開發(fā)環(huán)境。
6.5 下載制品
點擊制品選項卡,然后點擊右側(cè)的圖標下載該制品。
6.6 查看代碼分析結(jié)果
在代碼檢查頁面,可以查看由 SonarQube 提供的本示例流水線的代碼分析結(jié)果。如果您沒有事先配置 SonarQube,則該部分不可用。有關(guān)更多信息,請參見將 SonarQube 集成到流水線。
6.7 驗證 Kubernetes 資源
1.如果流水線的每個階段都成功運行,則會自動構(gòu)建一個 Docker 鏡像并推送至您的 Docker Hub 倉庫。最終,流水線將在您事先設(shè)置的項目中自動創(chuàng)建一個部署和一個服務(wù)。
2.前往該項目(本教程中即 kubesphere-sample-dev
),請點擊應(yīng)用負載下的工作負載,您可以看到列表中顯示的部署。
3.在服務(wù)頁面,您可以看到示例服務(wù)通過 NodePort 暴露其端口號。要訪問服務(wù),請訪問 <Node IP>:<NodePort>
。
訪問服務(wù)前,您可能需要配置端口轉(zhuǎn)發(fā)規(guī)則并在安全組中放行該端口。
4.現(xiàn)在流水線已成功運行,將會推送一個鏡像至 Docker Hub。登錄 Docker Hub 查看結(jié)果。
5.該應(yīng)用的名稱為 devops-sample
,即 APP_NAME
的值,標簽即 SNAPSHOT-$BUILD_NUMBER
的值。$BUILD_NUMBER
即運行記錄選項卡列示的記錄的序列號。
6.如果您在最后一個階段設(shè)置了電子郵件服務(wù)器并添加了電子郵件通知的步驟,您還會收到電子郵件消息。
七、配置流水線把項目發(fā)布到生產(chǎn)環(huán)境
7.1 創(chuàng)建GitHub tekens
如需創(chuàng)建 GitHub 個人訪問令牌,請轉(zhuǎn)到您 GitHub 帳戶的 Settings,點擊 Developer settings,選擇 Personal access tokens,然后點擊 Generate new token。
以project-regular用戶登錄后創(chuàng)建github訪問憑證
7.2 GitHub創(chuàng)建代碼倉庫
7.3 創(chuàng)建項目
使用project-admin用戶登錄WEB控制器,創(chuàng)建kubesphere-sample-prod項目,并邀請project-regular用戶成為項目成員,并為operator角色。
7.4 為發(fā)布到生產(chǎn)環(huán)境準備TAG_NAME變量
使用project-regular用戶登錄,并編輯graphical-pipeline
,添加TAG_NAME,值為v0.0.1, GITHUB_ACCOUNT,值為nextgomsb
7.5 階段7: 提交鏡像和代碼至倉庫(push with tag)
7.5.1 添加階段名稱:push with tag,添加條件 -> expression
scriptBlock return params.TAG_NAME =~ /v.*/
7.5.2 添加步驟-> 指定容器-> maven
7.5.2.1 添加嵌套步驟-> 審核
release image with tag?
@project-admin
7.5.2.2 容器maven中添加步驟 -> 添加憑證
- 名稱:github-token 變量: GITHUB_TOKEN
7.5.2.3 憑證中添加嵌套步驟->shell->GitHub配置
-分別添加三次
git config --global user.email "nextgo@126.com"
git config --global user.name "nextgo"
git tag -a $TAG_NAME -m "$TAG_NAME"
提前編輯流水線,添加如下變量
-
流水線右側(cè)點擊編輯 字符串類型: 名稱:GIT_USERNAME 默認值:nextgomsb
-
憑證中添加嵌套步驟->shell->命令如下 推送代碼到指定的倉庫devops-java-sample.git文章來源:http://www.zghlxwxcb.cn/news/detail-766075.html
git push http://$GIT_USERNAME:$GITHUB_TOKEN@github.com/$GITHUB_ACCOUNT/devops-java-sample.git --tags --ipv4
7.5.2.4 添加DockerHub配置
- 容器中添加嵌套步驟-> shell tag標記鏡像
docker tag $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:v$BUILD_NUMBER $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:$TAG_NAME
- 容器中添加嵌套步驟-> shell->推送鏡像
docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:$TAG_NAME
7.6 階段8: 發(fā)布到生產(chǎn)環(huán)境(deploy to production)
7.6.1 添加階段名稱:deploy to production,添加條件 -> expression添加條件
scriptBlock return params.TAG_NAME =~ /v.*/
7.6.2 添加步驟-審核
deploy to production?
@project-admin
7.6.3 添加步驟
- 指定容器 maven
7.6.3.1 添加憑證
- 添加嵌套步驟-> 添加憑證 名稱: demo-kubeconfig 變量:KUBECONFIG_CONTENT
7.6.3.2 添加執(zhí)行步驟
- 在憑證下 添加嵌套步驟 -> shell
envsubst < deploy/prod-all-in-one/devops-sample.yaml | kubectl apply -f -
7.7 執(zhí)行流水線
? 執(zhí)行流水線前,可以登錄k8s集群master節(jié)點,將前面執(zhí)行開發(fā)環(huán)境流水線的發(fā)布應(yīng)用刪了,避免有太多歷史的應(yīng)用存放在節(jié)點中
? kubectl get all -n kubesphere-sample-dev //查看該開發(fā)環(huán)境所存在的應(yīng)用
? 我們需要將其deployment和service名稱的資源刪除
? kubectl delete deployment ks-sample-dev -n kubesphere-sample-dev
? kubectl delete svc ks-sample-dev -n kubesphere-sample-dev文章來源地址http://www.zghlxwxcb.cn/news/detail-766075.html
到了這里,關(guān)于【業(yè)務(wù)功能115】微服務(wù)-springcloud-springboot-Kubernetes-k8s集群-Kubesphere實現(xiàn)DevOps流水線-CI/CD-SonarQube- Jenkins的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!