技術背景?
在云原生生態中,工具鏈的選擇直接決定 CI/CD 流水線的效率與穩定性。本次方案的工具組合并非偶然,而是基于各組件的核心優勢與生態適配性:?
- 代碼管理層:Gitee 作為國內主流的代碼托管平臺,支持 Git 分布式版本控制,提供代碼評審、分支管理等功能,適配國內網絡環境,成為團隊協作的高效載體;?(當然這里也可以使用Gitlab私有倉庫,如何部署和使用可以參考我的另一篇CICD文章,這里滿足多樣化,所以介紹使用多個工具。點我學習Gitlab集成的CI/CD)
- 構建調度層:Jenkins 作為開源 CI/CD 領域的 “瑞士軍刀”,通過豐富的插件生態可無縫對接各類工具,靈活編排構建、測試、部署等步驟,實現流程自動化;?
- 鏡像存儲層:Harbor 作為企業級容器鏡像倉庫,支持鏡像加密、漏洞掃描和訪問控制,為容器化應用提供安全可靠的存儲底座;?
- 部署運維層:Kubernetes(簡稱 K8s)憑借強大的容器編排能力,實現應用的自動擴縮容、滾動更新和故障自愈,成為容器化部署的事實標準。?
這一工具鏈的組合,既滿足了代碼 - 鏡像 - 容器的全生命周期管理需求,又兼顧了國產化適配(如 Gitee)與云原生兼容性(如 K8s),適合中大型企業在混合云或私有云環境中落地實踐。通過這套體系,團隊可將部署周期從 “天級” 壓縮至 “小時級” 甚至 “分鐘級”,同時通過自動化測試與環境一致性保障,顯著降低生產故障概率 —— 這正是本文探索的核心價值所在。
主機清單
全文采用的操作系統均為Ubuntu22.04LTS版本。
主機與角色 | IP地址 |
Jenkins | 10.0.0.10 |
Gitee工作臺 - Gitee.com | |
K8S集群/作者同款K8S集群 | |
Harbor倉庫 | 10.0.0.8 |
云原生Devops架構流程圖?
開始之前,作者已經準備好了K8S集群,如果您是從0開始,建議你先部署一套K8S集群,然后繼續往下進行。點擊部署作者同款K8S1.32.5集群
一、Jenkins安裝
1. 安裝與配置Jenkins
1.1 添加認證信息
sudo wget -O /usr/share/keyrings/jenkins-keyring.asc \https://pkg.jenkins.io/debian/jenkins.io-2023.key
echo "deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc]" \https://pkg.jenkins.io/debian-stable binary/ | sudo tee \/etc/apt/sources.list.d/jenkins.list > /dev/null
?1.2.安裝依賴包fontconfig
apt update
apt install fontconfig -y
1.3.安裝jdk
點擊下載官網二進制JDK17
[root@jenkins211 ~]# wget https://download.oracle.com/java/17/archive/jdk-17.0.12_linux-x64_bin.tar.gz
[root@jenkins211 ~]# tar xf jdk-17.0.12_linux-x64_bin.tar.gz -C /usr/local/
[root@jenkins211 ~]#
[root@jenkins211 ~]# cat /etc/profile.d/jdk.sh
#!/bin/bash
export JDK_HOME=/usr/local/jdk-17.0.12
export PATH=$PATH:$JDK_HOME/bin[root@jenkins211 ~]# source /etc/profile.d/jdk.sh
[root@jenkins211 ~]# java --version輸出不報錯且版本是17.0.12即為安裝成功
1.4.安裝jenkins?
[root@jenkins211 ~]# wget https://mirrors.aliyun.com/jenkins/debian/jenkins_2.479_all.deb
[root@jenkins211 ~]# dpkg -i jenkins_2.479_all.deb
.....# 有報錯,不必理會,去修改配置文件
修改jenkins的啟動腳本,修改用戶和組以及添加上我們的JAVA環境變量[root@jenkins211 ~]# vim /lib/systemd/system/jenkins.service
...36 #User=jenkins37 #Group=jenkins38 User=root39 Group=root40 41 # Directory where Jenkins stores its configuration and workspaces42 Environment="JENKINS_HOME=/var/lib/jenkins"43 Environment="JAVA_HOME=/usr/local/jdk-17.0.12"
...# 再次啟動Jenkins即可
1.5.啟動Jenkins
[root@jenkins211 ~]# systemctl enable --now jenkins
Synchronizing state of jenkins.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable jenkins
[root@jenkins211 ~]#
[root@jenkins211 ~]# ss -ntl |grep 8080
LISTEN 0 50 *:8080 *:*
[root@jenkins211 ~]#
7.查看密碼并登錄初始化
[root@jenkins211 ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
5f062a5790ea46bb9df6bc6866a39543
[root@jenkins211 ~]# 8.登錄測試
10.0.0.10:80809.因為我這里是安裝好的頁面,初次安裝會跳出安裝插件的步驟,我們一般都會跳過,安裝完成后根據自己的需求去自行選擇安裝。
?在這里準備好了插件,我們直接導入到Jenkins對應的插件目錄下面去即可,當然,也可以選擇在線安裝。
1.查看默認的插件目錄
[root@jenkins211 ~]# ll /var/lib/jenkins/plugins/
total 8
drwxr-xr-x 2 root root 4096 Apr 11 09:43 ./
drwxr-xr-x 8 jenkins jenkins 4096 Apr 11 09:43 ../2.導入插件 [root@jenkins211 ~]# tar xf jenkins_2.479-plugin.tar -C /var/lib/jenkins/plugins/
[root@jenkins211 ~]#
[root@jenkins211 ~]# ll /var/lib/jenkins/plugins/ |wc -l
227
[root@jenkins211 ~]# 3.重啟jenkins服務
[root@jenkins211 ~]# systemctl restart jenkins.service
?1.6. 修改Jenkins密碼
由于默認密碼太長太難記憶,所以插件安裝完成之后重新登錄Jenkins,然后重置密碼。
博主這里直接修改成了1,因為這只是測試環境;修改完成之后重新登錄一下即可。
二、Harbor倉庫快速部署
1.下載harbor?
wget https://github.com/goharbor/harbor/releases/download/v2.12.2/harbor-offline-installer-v2.12.2.tgz
2.解壓harbor目錄
[root@elk93 ~]# tar xf harbor-offline-installer-v2.12.2.tgz -C /usr/local/
3.準備配置文件?
[root@elk93 ~]# cp /usr/local/harbor/harbor.yml{.tmpl,}
[root@elk93 ~]#
[root@elk93 ~]# ll /usr/local/harbor/harbor.yml*
-rw-r--r-- 1 root root 14288 Mar 24 16:46 /usr/local/harbor/harbor.yml
-rw-r--r-- 1 root root 14288 Jan 16 22:10 /usr/local/harbor/harbor.yml.tmpl[root@elk93 ~]# vim /usr/local/harbor/harbor.yml
...
hostname: 10.0.0.8
...
## https related config
#https:
# # https port for harbor, default is 443
# port: 443
# # The path of cert and key files for nginx
# certificate: /your/certificate/path
# private_key: /your/private/key/path
# # enable strong ssl ciphers (default: false)
# # strong_ssl_ciphers: false...
harbor_admin_password: 1
...
data_volume: /root/harbor_data
...
?4.開始安裝harbor
[root@elk93 ~]# /usr/local/harbor/install.sh [Step 0]: checking if docker is installed ...Note: docker version: 20.10.24[Step 1]: checking docker-compose is installed ...Note: docker-compose version: 2.23.0[Step 2]: loading Harbor images ...
...
?5.訪問harbor的WebUI?
http://10.0.0.8/harbor/projects
用戶名: admin?
密 ?碼: 1 ? ? ?------配置文件修改的
6.新建項目
建議命名:"jenkins-k8s"
7.測試harbor倉庫可用性
[root@k8s-master ~]# cat /etc/docker/daemon.json
{"insecure-registries": ["10.0.0.8"]
}[root@k8s-master ~]#scp /etc/docker/daemon.json 10.0.0.7:/etc/docker/daemon.json
[root@k8s-master ~]#scp /etc/docker/daemon.json 10.0.0.8:/etc/docker/daemon.json
[root@k8s-master ~]#scp /etc/docker/daemon.json 10.0.0.10:/etc/docker/daemon.json#所有配置harbor倉庫的都要重啟docker
systemctl restart docker.service docker info | grep "Insecure Registries" -A 2
#可以看到Insecure Registries:10.0.0.8# 任意一臺主機登錄測試[root@elk93 ~]# docker login -u admin -p 1 10.0.0.8 # 基于命令行的方式登錄,如果你想要交互的話,就不用寫-u和-p。
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded
三、Gitee代碼倉庫配置
?倉庫我們可以使用gitee,gitlab,和github.
1.首先我們要先去創建一個倉庫
?2.編寫代碼
[root@worker233 ~]# mkdir container-cicd
[root@worker233 ~]#
[root@worker233 ~]# unzip xbw.zip -d container-cicd/
[root@worker233 ~]# cd container-cicd/
[root@worker233 container-cicd]#
[root@worker233 container-cicd]# ll
total 224
drwxr-xr-x 5 root root 4096 Apr 11 10:06 ./
drwx------ 11 root root 4096 Apr 11 10:06 ../
-rw-r--r-- 1 root root 16458 Jun 13 2019 about.html
-rw-r--r-- 1 root root 20149 Jun 13 2019 album.html
-rw-r--r-- 1 root root 19662 Jun 13 2019 article_detail.html
-rw-r--r-- 1 root root 18767 Jun 13 2019 article.html
-rw-r--r-- 1 root root 18913 Jun 13 2019 comment.html
-rw-r--r-- 1 root root 16465 Jun 13 2019 contact.html
drwxr-xr-x 2 root root 4096 Sep 19 2022 css/
drwxr-xr-x 5 root root 4096 Sep 19 2022 images/
-rw-r--r-- 1 root root 29627 Jun 29 2019 index.html
drwxr-xr-x 2 root root 4096 Sep 19 2022 js/
-rw-r--r-- 1 root root 24893 Jun 13 2019 product_detail.html
-rw-r--r-- 1 root root 20672 Jun 13 2019 product.html
3.開發人員添加git配置
這里參考自己的Git倉庫~
[root@worker233 container-cicd]# git config --global user.name "Nova_cao"
[root@worker233 container-cicd]# git config --global user.email "abc@qq.com"
4.初始化項目
[root@worker233 container-cicd]# git init
hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint:
hint: git config --global init.defaultBranch <name>
hint:
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint:
hint: git branch -m <name>
Initialized empty Git repository in /root/container-cicd/.git/
[root@worker233 container-cicd]#
[root@worker233 container-cicd]# ll
# 初始化完成此時會產生一個.git目錄
total 232
drwxr-xr-x 6 root root 4096 Apr 11 10:13 ./
drwx------ 11 root root 4096 Apr 11 10:13 ../
-rw-r--r-- 1 root root 16458 Jun 13 2019 about.html
-rw-r--r-- 1 root root 20149 Jun 13 2019 album.html
-rw-r--r-- 1 root root 19662 Jun 13 2019 article_detail.html
-rw-r--r-- 1 root root 18767 Jun 13 2019 article.html
-rw-r--r-- 1 root root 18913 Jun 13 2019 comment.html
-rw-r--r-- 1 root root 16465 Jun 13 2019 contact.html
drwxr-xr-x 2 root root 4096 Sep 19 2022 css/
-rw-r--r-- 1 root root 185 Apr 11 10:08 Dockerfile
drwxr-xr-x 7 root root 4096 Apr 11 10:13 .git/
drwxr-xr-x 5 root root 4096 Sep 19 2022 images/
-rw-r--r-- 1 root root 29627 Jun 29 2019 index.html
drwxr-xr-x 2 root root 4096 Sep 19 2022 js/
-rw-r--r-- 1 root root 24893 Jun 13 2019 product_detail.html
-rw-r--r-- 1 root root 20672 Jun 13 2019 product.html
5.編寫.dockerignore優化 && 編寫Dockerfile
這里FROM的鏡像就是一個輕量級的NGINX鏡像,完全可以使用NGINX去代替,只不過我推送到Harbor倉庫之后改名字了。
# 因為我們編譯Dokcerfile的時候不需要用到.git目錄,為了構建鏡像的輕量級,所以我們并不打算將目錄發送到服務端。
[root@worker233 container-cicd]# cat Dockerfile
FROM 10.0.0.8/jenkins-k8s/apps:v1MAINTAINER CaoFacLABEL company=StringSoftWare \role=it \email=abc@qq.comADD . /usr/share/nginx/html
[root@worker233 container-cicd]#
[root@worker233 container-cicd]# cat .dockerignore
.git/*
6.添加遠程倉庫
[root@worker233 container-cicd]# git add .
[root@worker233 container-cicd]# git commit -m 'game'
[root@worker233 container-cicd]# git remote add origin https://gitee.com/cao-facan/container-cicd.git
[root@worker233 container-cicd]# git push -u origin "master"
Username for 'https://gitee.com': jasonyin2020
Password for 'https://jasonyin2020@gitee.com':
Enumerating objects: 92, done.
Counting objects: 100% (92/92), done.
Delta compression using up to 2 threads
Compressing objects: 100% (91/91), done.
Writing objects: 100% (92/92), 1.48 MiB | 4.69 MiB/s, done.
Total 92 (delta 11), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [1.1.5]
remote: Set trace flag b445e5af
To https://gitee.com/jasonyin2020/oldboyedu-linux96-yiliao.git* [new branch] master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
7.訪問看我們的gitee倉庫看到代即可
四、使用Jenkins
1.Jenkins節點安裝Docker
#!/bin/bash# 確保腳本以root權限運行
if [ "$(id -u)" -ne 0 ]; thenecho "錯誤:此腳本必須以root用戶運行"exit 1
fi# 步驟1: 安裝必要的系統工具
echo "=== 安裝必要的系統工具 ==="
apt-get update -y
apt-get install -y ca-certificates curl gnupg# 步驟2: 信任Docker的GPG公鑰
echo "=== 信任Docker的GPG公鑰 ==="
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg# 步驟3: 寫入軟件源信息
echo "=== 寫入Docker軟件源信息 ==="
echo \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \tee /etc/apt/sources.list.d/docker.list > /dev/null# 步驟4: 安裝Docker
echo "=== 安裝Docker ==="
apt-get update -y
apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin# 驗證安裝
echo "=== 驗證Docker安裝 ==="
if command -v docker &> /dev/null; thenecho "Docker已成功安裝,版本信息:"docker --versionecho "Docker Compose版本信息:"docker compose version
elseecho "Docker安裝可能失敗,請檢查錯誤信息。"exit 1
fiecho "=== Docker安裝過程已完成 ==="
2.創建jenkins的項目并配置git
這里的密鑰設置最好給一個ID后續的話方便辨識密鑰用處
添加即可,要保證信息都是正確的
3.添加執行的shell命令
這一步是為了驗證Git倉庫的信息是否可用已經Jenkins配置是否正確。
4.開啟編譯?
Jenkins執行的工作目錄為 /var/lib/jenkins/workspace/
Jenkins執行構建時,會自動的將代碼拉取到我們的工作目錄,然后執行shell命令進行編譯,最后還要把鏡像推送到harbor倉庫中去。
tip: 注意,harbor倉庫要創建新的項目,名稱跟push的路徑保持一致。
?沒有報錯
5.harbor的WebUI驗證
五、jenkins參數化構建及響應式更新K8S業務
1.響應式創建deploy
kubectl create deployment game --image=10.0.0.8/jenkins-k8s/game:v1 --replicas=3kubectl expose deployment game --port=80 --type=NodePortkubectl get svc
2.訪問測試
10.0.0.6:31903
3.jenkins參數化構建
繼續回到我們創建的項目configuration配置頁面
引用我們設置的名稱變量
# 修改一下代碼,模擬新版本
vim 修改一下代碼目錄的index.html即可,注意,這里修改的是上文我們創建的gitee的代碼,并非Jenkins工作目錄的代碼!?
?這里我修改的地方主要是這里
?4. 提交新代碼
?
成功之后,我們的v3標簽的鏡像就已經存在harbor倉庫,我們只需要響應式更新一下K8S的pod鏡像即可。
更新 Deployment 的鏡像:
kubectl set image deployments/game game=10.0.0.8/jenkins-k8s/game:v3
查看 Pod 狀態、:
kubectl get po
?
5.再次訪問WebUI
沒問題,修改為了v3版本,這個就是取決于index.html寫了什么信息。
六、jenkins基于選項參數實現K8S的服務更新
1.jenkins判斷服務是首次部署還是更新
docker login -u admin -p 1 10.0.0.8
docker build -t 10.0.0.8/jenkins-k8s/game:${version} .
docker push 10.0.0.8/jenkins-k8s/game:${version}
docker logout 10.0.0.8
if [ `kubectl get pods -l app=game | wc -l` -eq 0 ] ; then kubectl create deployment game --image=10.0.0.8/jenkins-k8s/game:${version} --port=80 --replicas=3kubectl expose deployment game --port=80 --type=LoadBalancer
else kubectl set image deploy game game=10.0.0.8/jenkins-k8s/game:${version}kubectl scale deployment game --replicas=5
fi
回到參數化構建,修改我們的shell命令
?這個時候可能就有人疑惑了,這個shell命令出現了kubectl,但是Jenkins好像并沒有K8S的環境,如何去執行kubectl命令呢?對了,這時候我們要在Jenkins上配置K8S的環境。
2. Jenkins配置K8S環境
2.1 安裝kube相關組件
apt-get update && apt-get install -y apt-transport-https
curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb/Release.key |gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb/ /" |tee /etc/apt/sources.list.d/kubernetes.list
apt-get update
apt-get install -y kubelet kubeadm kubectl
?2.2 復制k8s-master節點證書到Jenkins
[root@k8s-master ~]# scp -r .kube/ 10.0.0.10:/root
The authenticity of host '10.0.0.10 (10.0.0.10)' can't be established.
ED25519 key fingerprint is SHA256:0OjJR5NwPUthuX0PbarzI+9EaHXIp2mBOqOU8fkYS7Q.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.0.0.10' (ED25519) to the list of known hosts.
root@10.0.0.10's password:
2.3 測試
# 再次還需要添加k8s-master的主機解析
[root@jenkins ~]# cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 cao
10.0.0.6 k8s-master#驗證測試
[root@jenkins ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
deplot-emtrydir-pod-7b8579cfc7-bjtvd 2/2 Running 2 (86m ago) 18h
deplot-emtrydir-pod-7b8579cfc7-jvrjd 2/2 Running 2 (90m ago) 18h
deplot-emtrydir-pod-7b8579cfc7-lk6mj 2/2 Running 2 (88m ago) 18h
game-d49cf75fd-6t8nt 1/1 Running 0 8m4s
game-d49cf75fd-gxf7w 1/1 Running 0 8m6s
game-d49cf75fd-vtd76 1/1 Running 0 8m2s
[root@jenkins ~]#
3.?構建項目并測試訪問
這時候就可以發現副本數量變成了5個,因為之前存在。shell腳本的判斷就自動sacle副本數量了。
七、jenkins實現git參數化構建
- 參數化構建:應用場景廣泛,不僅適用于代碼構建,還適用于各類需要動態配置的任務。例如,在自動化測試任務中,可設置參數來指定不同的測試用例集、測試環境;在部署任務中,通過參數指定部署的目標服務器、部署版本等 。
- Git 參數化構建:主要針對基于 Git 進行版本控制的代碼項目。在軟件開發過程中,當需要頻繁在不同分支(開發分支、測試分支、預發布分支等)間進行構建測試,或者基于不同版本標簽構建發布包時,Git 參數化構建能高效地滿足需求。比如開發團隊想測試不同特性分支的代碼,就可以通過 Git 參數化構建選擇對應分支進行構建。
1. 配置Git參數
回到我們創建項目的configuration選項
保存之后就可以看到Git提交的歷史編號了
version來源就是我們的Git提交的歷史?
[root@k8s-node1 ~/container-cicd]# git log
commit 07fe4709d8d6e5e7abe9553e1114a0b98ffdba23 (HEAD -> master, origin/master)
Author: Nova <13943870+cao-facan@user.noreply.gitee.com>
Date: Fri Jul 18 11:30:18 2025 +0800第7個版本commit 76b369a2a01ba653d0f6c6bfb1cd0baf2a4b3513
Author: Nova <13943870+cao-facan@user.noreply.gitee.com>
Date: Fri Jul 18 11:08:59 2025 +0800第6個版本commit fa80d31d63a232be9fb8df7c1c50ed7e62220c06
Author: Nova <13943870+cao-facan@user.noreply.gitee.com>
Date: Fri Jul 18 10:53:22 2025 +0800第三個版本commit bea2441252702157018227d65f11a6269a349b13
Author: Nova <13943870+cao-facan@user.noreply.gitee.com>
Date: Fri Jul 18 10:40:01 2025 +0800修改了Dockerfile語法錯誤commit 11276d088dae825180997a62042864a327f152a9
Author: Nova <13943870+cao-facan@user.noreply.gitee.com>
Date: Fri Jul 18 10:27:44 2025 +0800container-cicd
?git提交的時候最好加上描述信息,不然回滾版本都不知道這個版本做了哪些更新!
?之后的步驟跟我們的選項參數化構建一樣的了,就不再演示。
?2. 驗證Git參數
點擊build進行構建
八、Jenkins的pipeline實現全流程
1.創建pipline項目
?2. 記錄gitee的標識ID
?保存下來
29b12ea5-b5ba-4a91-9635-60ed38d74bab
回到流水線項目的configuration配置
這里的BUILD_NUMBER是構建時的指的時構建的步驟的ID號,沒有v的版本標簽信息,只有1,2,3,4,5,如果要使用harbor的鏡像的標簽前面都是v...,但是如果不想使用harbor已存在的鏡像,想自己重新構建鏡像,重新打標簽,那么就不需要加v.?
pipeline {agent anystages {stage('從gitee拉取代碼') {steps {git credentialsId: '29b12ea5-b5ba-4a91-9635-60ed38d74bab', url: 'https://gitee.com/cao-facan/container-cicd.git'}}stage('編譯鏡像') {steps {sh 'docker build -t 10.0.0.8/jenkins-k8s/game:${BUILD_NUMBER} .'}} stage('推送鏡像到harbor倉庫') {steps {sh '''docker login -u admin -p 1 10.0.0.8
docker push 10.0.0.8/jenkins-k8s/game:${BUILD_NUMBER}
docker logout 10.0.0.8'''}} stage('部署或更新game項目') {steps {sh '''if [ `kubectl get pods -l app=game | wc -l` -eq 0 ] ; then kubectl create deployment game --image=10.0.0.8/jenkins-k8s/game:${BUILD_NUMBER} --port=80 --replicas=3kubectl expose deployment game --port=80 --type=NodePort
else kubectl set image deploy game game=10.0.0.8/jenkins-k8s/game:${BUILD_NUMBER}kubectl scale deployment game --replicas=5
fi'''}} }
}
?3. 配置完成之后構建
沒毛病
九、Jenkins的Jenkinsfile實現全流程
1.創建Jenkinsfile文件
?2. 配置pipeline項目
回到流水線項目的configuration配置選擇Jenkinsfile
3. 構建測試
[root@jenkins ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
deplot-emtrydir-pod-7b8579cfc7-bjtvd 2/2 Running 2 (3h59m ago) 21h
deplot-emtrydir-pod-7b8579cfc7-jvrjd 2/2 Running 2 (4h3m ago) 21h
deplot-emtrydir-pod-7b8579cfc7-lk6mj 2/2 Running 2 (4h ago) 21h
game-6df5459d89-95j8j 1/1 Running 0 20s
game-6df5459d89-kqvgx 1/1 Running 0 18s
game-6df5459d89-mv6nf 1/1 Running 0 18s
game-6df5459d89-zcf28 1/1 Running 0 20s
game-6df5459d89-zs6nx 1/1 Running 0 20s
?十、總結
通過 Jenkins、Gitee、Harbor 與 Kubernetes 的協同配合,我們構建起了一套覆蓋 “代碼提交 - 鏡像構建 - 容器部署” 的全鏈路容器化 CI/CD 流水線。這一方案的核心價值,在于將原本分散的開發、測試、運維環節串聯成自動化流程,不僅縮短了軟件從開發到上線的周期,更通過容器化技術保障了環境一致性,大幅降低了 “在我電腦上能跑” 的尷尬場景。?
從實踐角度看,Gitee 的代碼管理能力為團隊協作提供了堅實基礎,Jenkins 的靈活編排讓復雜流程自動化成為可能,Harbor 的鏡像管控確保了應用交付的安全性,而 Kubernetes 則賦予了應用在生產環境中彈性伸縮、自愈容錯的云原生能力。這套工具鏈的組合并非簡單的技術堆砌,而是云原生時代 DevOps 理念的具象化落地,尤其適合需要快速迭代的企業級應用場景。?
當然,CI/CD 的價值不止于 “自動化”,更在于推動團隊協作模式的變革。在流水線的運轉過程中,開發、測試、運維團隊將圍繞 “共同交付價值” 形成閉環,通過持續反饋優化流程,最終實現軟件交付質量與效率的雙重提升。對于計劃向云原生轉型的團隊而言,這套方案既是可直接復用的實踐模板,也是理解 DevOps “持續改進” 核心思想的絕佳案例。