云原生 DevOps 實戰之Jenkins+Gitee+Harbor+Kubernetes 構建自動化部署體系

技術背景?

在云原生生態中,工具鏈的選擇直接決定 CI/CD 流水線的效率與穩定性。本次方案的工具組合并非偶然,而是基于各組件的核心優勢與生態適配性:?

  • 代碼管理層:Gitee 作為國內主流的代碼托管平臺,支持 Git 分布式版本控制,提供代碼評審、分支管理等功能,適配國內網絡環境,成為團隊協作的高效載體;?(當然這里也可以使用Gitlab私有倉庫,如何部署和使用可以參考我的另一篇CICD文章,這里滿足多樣化,所以介紹使用多個工具。點我學習Gitlab集成的CI/CD)
  • 構建調度層:Jenkins 作為開源 CI/CD 領域的 “瑞士軍刀”,通過豐富的插件生態可無縫對接各類工具,靈活編排構建、測試、部署等步驟,實現流程自動化;?
  • 鏡像存儲層:Harbor 作為企業級容器鏡像倉庫,支持鏡像加密、漏洞掃描和訪問控制,為容器化應用提供安全可靠的存儲底座;?
  • 部署運維層:Kubernetes(簡稱 K8s)憑借強大的容器編排能力,實現應用的自動擴縮容、滾動更新和故障自愈,成為容器化部署的事實標準。?

這一工具鏈的組合,既滿足了代碼 - 鏡像 - 容器的全生命周期管理需求,又兼顧了國產化適配(如 Gitee)與云原生兼容性(如 K8s),適合中大型企業在混合云或私有云環境中落地實踐。通過這套體系,團隊可將部署周期從 “天級” 壓縮至 “小時級” 甚至 “分鐘級”,同時通過自動化測試與環境一致性保障,顯著降低生產故障概率 —— 這正是本文探索的核心價值所在。

主機清單

全文采用的操作系統均為Ubuntu22.04LTS版本。

主機與角色IP地址
Jenkins10.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 “持續改進” 核心思想的絕佳案例。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/91479.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/91479.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/91479.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

二建機電工程專業都考哪些知識點?

二建機電工程專業需要考《建設工程施工管理》《建設工程法規及相關知識》和《機電工程管理與實務》三個科目。其中《機電工程管理與實務》是專業科目&#xff0c;也是考試重點&#xff0c;主要考查機電工程技術、機電工程相關法規與標準、機電工程項目管理實務等內容。具體如下…

React + ts + react-webcam + CamSplitter 實現虛擬攝像頭解決win攝像頭獨占的問題

一、安裝 CamSplitter 這塊網上有很多教程了&#xff0c;這里不再贅述&#xff0c;就一點&#xff0c;需要分幾個虛擬攝像頭&#xff0c;就要在CamSplitter 的安裝目錄下 driver_install.cmd 執行幾次。二、React ts react-webcam 調用虛擬攝像頭import { useState, useEffec…

【深度學習①】 | Numpy數組篇

0 序言 本文為NumPy數組庫的系統學習筆記&#xff0c;將自己先前的筆記做一個總結歸納。內容涵蓋數組基礎、創建、索引、變形、運算、函數、布爾型數組及與張量的銜接等內容。通過具體示例解析核心概念與操作&#xff0c;幫助讀者掌握NumPy的使用邏輯與方法&#xff0c;為后續深…

5.實現 call

call 是 JavaScript 中非常核心的函數方法之一。它能改變函數的執行上下文&#xff08;也就是 this 的指向&#xff09;&#xff0c;在日常開發和面試中都極其常見。本文將帶你一步步實現一個 Function.prototype.call 的自定義版本&#xff0c;真正理解它的底層原理。? 一、c…

Go語言中的盲點:競態檢測和互斥鎖的錯覺

&#x1f9e0; Go語言中的盲點&#xff1a;競態檢測和互斥鎖的錯覺 使用 -race 就能發現所有并發問題&#xff1f;加了 mutex 就萬無一失&#xff1f; 這篇文章揭示了 Go 并發編程中的一個“危險盲區” —— 互斥鎖并不能總能保護你免受數據競爭的影響&#xff0c;尤其是在 -ra…

從文件到文件描述符:理解程序與文件的交互本質

一、理解文件 拋一個概念&#xff1a; 文件 內容 屬性。 1. 那么&#xff0c;空文件有大小嗎&#xff1f;答案是有的。因為空文件指的是文件內容為空&#xff0c;文件屬性也要占據大小啊。 將來對文件操作&#xff0c;無非分為兩類&#xff1a; 1.對文件內容做修改。 2.對文件…

優化算法專欄——閱讀導引

前言 提醒&#xff1a; 文章內容為方便作者自己后日復習與查閱而進行的書寫與發布&#xff0c;其中引用內容都會使用鏈接表明出處&#xff08;如有侵權問題&#xff0c;請及時聯系&#xff09;。 其中內容多為一次書寫&#xff0c;缺少檢查與訂正&#xff0c;如有問題或其他拓展…

[ The Missing Semester of Your CS Education ] 學習筆記 Vim篇

“Writing English words and writing code are very different activities. When programming, you spend more time switching files, reading, navigating, and editing code compared to writing a long stream.” —— < The Missing Semester of Your CS Education &g…

Linux 系統中定時執行指定命令 crontab 定時任務配置

crontab 定時任務配置是 Linux/Unix 系統中用于自動、周期性執行指定命令或腳本的工具&#xff0c;相當于系統的 “定時鬧鐘”。它可以讓系統在預設的時間&#xff08;如每天凌晨、每周一、每月 1 號等&#xff09;自動完成重復性工作&#xff0c;無需人工干預。自動化運維定期…

[ Leetcode ]---快樂數

題目鏈接 Leetcode快樂數 題目描述 如下圖&#xff1a; 題目解析&#xff1a; 1.雙指針法 算法核心思路 判斷快樂數的關鍵挑戰是如何檢測是否進入無限循環。這里使用了快慢指針法&#xff08;Floyd 循環檢測算法&#xff09;&#xff0c;這是一種高效檢測循環的技巧&#…

智慧社區構建——2

1.實現Token校驗## Token校驗URLjson GET /checkToken 參數json HttpServletRequest request 返回json {"msg": "操作成功","code": 200,"status": "ok" }{"msg": "操作成功","code": 200,&q…

K-Means聚類:當數據沒有標簽時,如何讓計算機自動“物以類聚”?

K-Means聚類&#xff1a;當數據沒有標簽時&#xff0c;如何讓計算機自動“物以類聚”&#xff1f;&#x1f44b; 大家好&#xff0c;我是小瑞瑞&#xff01;歡迎回到我的專欄&#xff01; 在我們之前的旅程中&#xff0c;解決的問題大多都有一個明確的“目標”&#xff0c;比如…

萬事皆可用 GeeLark AI

在今年4月&#xff0c;GeeLark AI 全面接入 DeepSeek AI 大模型&#xff0c;你可以在獨立窗口中便捷地使用 GeeLark AI。除了幫助你編寫文案等基礎內容&#xff0c;在使用 GeeLark 過程中&#xff0c;如果遇到問題&#xff0c;也可以通過詢問 GeeLark AI&#xff0c;及時獲取幫…

3D 高保真處理:聲網讓游戲聲音隨角色動作變化

傳統游戲的聲音體驗像老式收音機&#xff0c;不管聲源位置、距離和障礙物&#xff0c;僅靠左右聲道機械調音量&#xff0c;毫無方向感和空間感&#xff0c;如同蒙眼聽聲辨位。射擊游戲中敵人從左邊來&#xff0c;耳機卻兩邊同響且音量相近&#xff0c;讓人暈頭轉向&#xff1b;…

Nestjs框架: 請求生命周期與應用生命周期

概述 在 NestJS 框架中&#xff0c;中間件&#xff08;Middleware&#xff09;、管道&#xff08;Pipes&#xff09;、過濾器&#xff08;Filters&#xff09;、攔截器&#xff08;Interceptors&#xff09; 均屬于請求處理流程的核心組件&#xff0c;它們共同構成了 NestJS 的…

Nastool+cpolar:群暉NAS用戶的全場景影音自由方案

文章目錄前言1. 本地搭建Nastool2. nastool基礎設置3. 群暉NAS安裝內網穿透工具4. 配置公網地址小結5. 配置固定公網地址**第二版&#xff1a;技術整合與效率提升導向****第二版&#xff1a;技術整合與效率提升導向****第二版&#xff1a;技術整合與效率提升導向**Nastool與cpo…

從零開始:Kaggle 競賽實戰入門指南

一、Kaggle社區概述 Kaggle 是全球最大的數據科學和機器學習社區&#xff0c;由Anthony Goldbloom于2010年創立&#xff0c;2017年被Google收購。平臺專注于數據科學競賽、開源數據集共享、協作編程以及技能學習&#xff0c;吸引了從初學者到專業數據科學家的廣泛用戶群體。 …

sqli-labs:Less-16關卡詳細解析

1. 思路&#x1f680; 本關的SQL語句為&#xff1a; $uname".$uname."; $passwd".$passwd."; $sql"SELECT username, password FROM users WHERE username($uname) and password($passwd) LIMIT 0,1";注入類型&#xff1a;字符串型&#xff08;…

Lipschitz連續函數

Lipschitz function 一、說明 在數學分析中&#xff0c;Lipschitz連續性以德國 數學家 魯道夫利普希茨 (Rudolf Lipschitz)的名字命名&#xff0c;是函數一致連續性的強形式。直觀地說&#xff0c;Lipschitz連續函數的變化速度有限&#xff1a;存在一個實數&#xff0c;使得對于…

Dynamics 365 business central 與Shopify集成

Dynamics 365 Business Central&#xff08;簡稱 D365 BC&#xff09; 與 Shopify 的集成&#xff0c;能幫助企業實現前端電商平臺&#xff08;Shopify&#xff09;與后端 ERP 系統&#xff08;Business Central&#xff09;之間的無縫數據同步&#xff0c;是一種典型的 ERP 與…