上一篇文章分享瞭如何在 KubeSphere 對公共的代碼倉庫 GitHub 和鏡像倉庫 DockerHub 建立流水線,本文將繼續使用 KubeSphere,基於 Harbor 和 GitLab 建立流水線,將 Spring Boot 項目發佈至 Kubernetes。java
KubeSphere 集成了 Harbor 和 GitLab,內置的 Harbor 和 GitLab 做爲可選安裝項,需在安裝前進行配置開啓安裝。用戶能夠根據團隊項目的需求來安裝,方便對項目的鏡像和代碼進行管理,很是適合內網環境下的 CI/CD 流水線構建。git
本示例演示經過內置 GitLab 倉庫中 Spring Boot 項目的 Jenkinsfile 來建立流水線,流水線共包含 7 個階段,首先會將 GitLab 中的源碼構建成鏡像,而後推送到 Harbor 私有倉庫,最終將一個輸出 「Hello,World!」 的Web示例部署到 KubeSphere 集羣中的開發環境 (Dev) 和生產環境 (Production) ,這兩個環境在底層的 Kubernetes 是以項目 (Namespace) 爲單位進行資源隔離的。github
下面的流程圖簡單說明了流水線完整的工做過程:瀏覽器
流程說明:安全
- 階段一. Checkout SCM: 拉取 GitLab 倉庫代碼服務器
- 階段二. Unit test: 單元測試,若是測試經過了才繼續下面的任務網絡
- 階段三. sonarQube analysis:sonarQube 代碼質量檢測運維
- 階段四. Build & push snapshot image: 根據行爲策略中所選擇分支來構建鏡像,並將 tag 爲
SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER
推送至 Harbor (其中$BUILD_NUMBER
爲 pipeline 活動列表的運行序號)。ssh- 階段五. Push latest image: 將 master 分支打上 tag 爲 latest,並推送至 Harbor。curl
- 階段六. Deploy to dev: 將 master 分支部署到 Dev 環境,此階段須要審覈。
- 階段七. Push with tag: 生成 tag 並 release 到 GitLab,並推送到 Harbor。
- 階段八. Deploy to production: 將發佈的 tag 部署到 Production 環境。
經過 CoreDNS 的 hosts 插件配置 KubeSphere 集羣的 DNS 服務,使集羣內部可經過 hostname 域名訪問外部服務,參考 修改系統配置 - 如何修改 CoreDNS 配置。
參考 如何上傳基礎鏡像到 Harbor 導入預先準備好的基礎鏡像 java:openjdk-8-jre-alpine
。
使用項目普通用戶 project-regular
登陸 KubeSphere,進入已建立的 DevOps 工程,開始建立憑證。
一、本示例代碼倉庫中的 Jenkinsfile 須要用到 Harbor、GitLab 和 Kubernetes (kubeconfig 用於訪問接入正在運行的 Kubernetes 集羣) 等一共 3 個憑證 (credentials) ,參考 建立憑證 依次建立這三個憑證。
二、而後參考 訪問 SonarQube 並建立 Token,建立一個 Java 的 Token 並複製。
三、最後在 KubeSphere 中進入 devops-demo
的 DevOps 工程中,與上面步驟相似,在 憑證 下點擊 建立,建立一個類型爲 祕密文本
的憑證,憑證 ID 命名爲 sonar-token,密鑰爲上一步複製的 token 信息,完成後點擊 肯定。
至此,4 個憑證已經建立完成,下一步須要在示例倉庫中的 jenkinsfile 修改對應的四個憑證 ID 爲用戶本身建立的憑證 ID。
devops-java-sample
導入到GitLab中。 注:若因網絡限制,沒法從 GitHub 導入,請自行 clone 至其餘服務器,而後上傳至 GitLab 倉庫,倉庫名稱請保持一致。
一、在 根目錄 進入 Jenkinsfile-on-prem。
二、在 GitLab UI 點擊編輯 Edit
,須要修改以下環境變量 (environment) 的值。
修改項 |
值 |
含義 |
---|---|---|
HARBOR_CREDENTIAL_ID |
harbor-id |
填寫建立憑證步驟中的 Harbor 憑證 ID,用於登陸您的 Harbor 倉庫 |
GITLAB_CREDENTIAL_ID |
gitlab-id |
填寫建立憑證步驟中的 GitLab 憑證 ID,用於推送 tag 到 GitLab 倉庫 |
KUBECONFIG_CREDENTIAL_ID | demo-kubeconfig |
kubeconfig 憑證 ID,用於訪問接入正在運行的 Kubernetes 集羣 |
REGISTRY |
harbor.devops.kubesphere.local:30280 | 默認爲 Harbor 域名,用於鏡像的推送 |
HARBOR_NAMESPACE |
library |
默認爲 Harbor 下的 library 項目,可根據實際狀況更改項目名稱 |
GITLAB_ACCOUNT |
admin1 |
GitLab用戶,默認爲admin1 |
APP_NAME |
devops-docs-sample |
應用名稱 |
SONAR_CREDENTIAL_ID |
sonar-token |
填寫建立憑證步驟中的 sonarQube token憑證 ID,用於代碼質量檢測 |
CI/CD 流水線會根據示例項目的 yaml 模板文件,最終將示例分別部署到 Dev 和 Production 這兩個項目 (Namespace) 環境中,項目名爲 kubesphere-sample-dev
和 kubesphere-sample-prod
,這兩個項目須要預先在控制檯依次建立。
一、進入已建立的 DevOps 工程,選擇左側菜單欄的 流水線,而後點擊 建立。
二、在彈出的窗口中,輸入流水線的基本信息。
一、點擊代碼倉庫,以添加 GitLab 倉庫爲例。
二、輸入倉庫URl,默認爲http://gitlab.devops.kubesphere.local:30080/admin1/devops-java-sample.git
,
注意:GitLab 中提供的 HTTP 和 SSH URI 有誤。HTTP URI 須要手動加上端口號30080,SSH URI 須要手動加上協議 ssh://
和端口號:30090。
證書選擇以前建立的 gitlab-id
。
點擊 「保存」 後進行下一步。
完成代碼倉庫相關設置後,進入高級設置頁面,高級設置支持對流水線的構建記錄、行爲策略、按期掃描等設置的定製化,如下對用到的相關配置做簡單釋義。
一、構建設置中,勾選 丟棄舊的構建
,此處的 保留分支的天數 和 保留分支的最大個數 默認爲 -1。
說明:
分支設置的保留分支的天數和保持分支的最大個數兩個選項能夠同時對分支進行做用,只要某個分支的保留天數和個數不知足任何一個設置的條件,則將丟棄該分支。假設設置的保留天數和個數爲 2 和 3,則分支的保留天數一旦超過 2 或者保留個數超過 3,則將丟棄該分支。默認兩個值爲 -1,表示不自動刪除分支。
丟棄舊的分支將肯定什麼時候應丟棄項目的分支記錄。分支記錄包括控制檯輸出,存檔工件以及與特定分支相關的其餘元數據。保持較少的分支能夠節省 Jenkins 所使用的磁盤空間,咱們提供了兩個選項來肯定應什麼時候丟棄舊的分支:
- 保留分支的天數:若是分支達到必定的天數,則丟棄分支。
- 保留分支的個數:若是已經存在必定數量的分支,則丟棄最舊的分支。
二、默認的 腳本路徑 爲 Jenkinsfile,須要修改成 Jenkinsfile-on-prem
。
注:路徑是 Jenkinsfile 在代碼倉庫的路徑,表示它在示例倉庫的根目錄,若文件位置變更則需修改其腳本路徑。
三、在 掃描 Repo Trigger 勾選 若是沒有掃描觸發,則按期掃描
,掃描時間間隔可根據團隊習慣設定,本示例設置爲 5 minutes
。
說明:按期掃描是設定一個週期讓流水線週期性地掃描遠程倉庫,根據 行爲策略 查看倉庫有沒有代碼更新或新的 PR。
Webhook 推送:
Webhook 是一種高效的方式可讓流水線發現遠程倉庫的變化並自動觸發新的運行,GitHub 和 Git (如 Gitlab) 觸發 Jenkins 自動掃描應該以 Webhook 爲主,以上一步在 KubeSphere 設置按期掃描爲輔。在本示例中,能夠經過手動運行流水線,如需設置自動掃描遠端分支並觸發運行,詳見 設置自動觸發掃描 - GitHub SCM。
完成高級設置後點擊 建立。
流水線建立後,點擊瀏覽器的 刷新 按鈕,可見一條自動觸發遠程分支後的運行記錄。
一、點擊右側 運行,將根據上一步的 行爲策略 自動掃描代碼倉庫中的分支,在彈窗選擇須要構建流水線的 master
分支,系統將根據輸入的分支加載 Jenkinsfile (此示例爲根目錄下的 Jenkinsfile-on-prem)。
二、因爲倉庫的 Jenkinsfile-on-prem 中 TAG_NAME: defaultValue
沒有設置默認值,所以在這裏的 TAG_NAME
能夠輸入一個 tag 編號,好比輸入 v0.0.1。
三、點擊 肯定,將新生成一條流水線活動開始運行。
說明: tag 用於在 GitLab 和 Harbor 中分別生成帶有 tag 的 release 和鏡像。 注意: 在主動運行流水線以發佈 release 時,
TAG_NAME
不該與以前代碼倉庫中所存在的tag
名稱重複,若是重複會致使流水線的運行失敗。
至此,流水線 已完成建立並開始運行。
注:點擊 分支 切換到分支列表,查看流水線具體是基於哪些分支運行,這裏的分支則取決於上一步 行爲策略 的發現分支策略。
爲方便演示,此處默認用當前帳戶來審覈,當流水線執行至 input
步驟時狀態將暫停,須要手動點擊 繼續,流水線才能繼續運行。注意,在 Jenkinsfile-on-prem 中分別定義了三個階段 (stage) 用來部署至 Dev 環境和 Production 環境以及推送 tag,所以在流水線中依次須要對 deploy to dev, push with tag, deploy to production
這三個階段審覈 3
次,若不審覈或點擊 終止 則流水線將不會繼續運行。
說明:在實際的開發生產場景下,可能須要更高權限的管理員或運維人員來審覈流水線和鏡像,並決定是否容許將其推送至代碼或鏡像倉庫,以及部署至開發或生產環境。Jenkinsfile 中的
input
步驟支持指定用戶審覈流水線,好比要指定用戶名爲 project-admin 的用戶來審覈,能夠在 Jenkinsfile 的 input 函數中追加一個字段,若是是多個用戶則經過逗號分隔,以下所示:
···
input(id: 'release-image-with-tag', message: 'release image with tag?', submitter: 'project-admin,project-admin1')
···複製代碼
一、點擊流水線中 活動
列表下當前正在運行的流水線序列號,頁面展示了流水線中每一步驟的運行狀態,注意,流水線剛建立時處於初始化階段,可能僅顯示日誌窗口,待初始化 (約一分鐘) 完成後便可看到流水線。黑色框標註了流水線的步驟名稱,示例中流水線共 8 個 stage,分別在 Jenkinsfile-on-prem 中被定義。
二、當前頁面中點擊右上方的 查看日誌
,查看流水線運行日誌。頁面展現了每一步的具體日誌、運行狀態及時間等信息,點擊左側某個具體的階段可展開查看其具體的日誌。日誌可下載至本地,如出現錯誤,下載至本地更便於分析定位問題。
一、若流水線執行成功,點擊該流水線下的 代碼質量
,便可看到經過 sonarQube 的代碼質量檢測結果,以下圖(僅供參考)。
二、流水線最終 build 的 Docker 鏡像也將被成功地 push 到 Harbor 中,咱們在 Jenkinsfile-on-prem 中已經配置過 Harbor,登陸 Harbor 查看鏡像的 push 結果,能夠看到 tag 爲 snapshot、TAG_NAME(master-1)、latest 的鏡像已經被 push 到 Harbor,而且在 GitLab 中也生成了一個新的 tag 和 release。示例網站最終將以 deployment 和 service 分別部署到 KubeSphere 的 `kubesphere-sample-dev` 和 `kubesphere-sample-prod` 項目環境中。
環境 |
訪問地址 |
所在項目 (Namespace) | 部署 (Deployment) | 服務 (Service) |
---|---|---|---|---|
Dev |
公網 IP : 30861 (${EIP}:${NODEPORT} ) |
kubesphere-sample-dev |
ks-sample-dev |
ks-sample-dev |
Production | 公網 IP : 30961 (${EIP}:${NODEPORT} ) |
kubesphere-sample-prod |
ks-sample |
ks-sample |
三、可經過 KubeSphere 回到項目列表,依次查看以前建立的兩個項目中的部署和服務的狀態。例如,如下查看 kubesphere-sample-prod
項目下的部署。
進入該項目,在左側的菜單欄點擊 工做負載 → 部署,能夠看到 ks-sample 已建立成功。正常狀況下,部署的狀態應該顯示 運行中。
四、在菜單欄中選擇 網絡與服務 → 服務 也能夠查看對應建立的服務,能夠看到該服務對外暴露的節點端口 (NodePort) 是 30961
。
查看服務
五、查看推送到您我的的 Harbor 中的鏡像,能夠看到 devops-java-sample
就是 APP_NAME 的值,而 tag也是在 Jenkinsfile-on-prem 中定義的 tag。
在瀏覽器或經過後臺命令訪問部署到 KubeSphere Dev 和 Production 環境的服務:
Dev 環境
例如,瀏覽器訪問 http://192.168.0.20:30861/
(即 http://IP:NodePort/
) 可訪問到 Hello,World!
頁面,或經過後臺命令驗證:
curl http://192.168.0.20:30861
Hello,World!複製代碼
Prodcution 環境
同上可訪問 http://192.168.0.20:30961/
(即 http://IP:NodePort/
) 。
curl http://192.168.0.20:30961
Hello,World!複製代碼
KubeSphere (https://github.com/kubesphere/kubesphere) 是一個開源的以應用爲中心的容器管理平臺,支持部署在任何基礎設施之上,並提供簡單易用的 UI,極大減輕平常開發、測試、運維的複雜度,旨在解決 Kubernetes 自己存在的存儲、網絡、安全和易用性等痛點,幫助企業輕鬆應對敏捷開發與自動化監控運維、端到端應用交付、微服務治理、多租戶管理、多集羣管理、服務與網絡管理、鏡像倉庫、AI 平臺、邊緣計算等業務場景。