Gitlab+Jenkins+K8S+Registry 建立 CI/CD 流水線

一、前言

  • DevOps是一種將開發(Development)和運維(Operations)相結合的軟件開發方法論。它通過自動化和持續交付的方式,將軟件開發、測試和部署等環節緊密集成,以提高效率和產品質量。在本篇博客中,我們將介紹如何使用GitLab、Jenkins和Kubernetes(k8s)來構建一個完整的CI/CD解決方案。

  • DevOps通過打破開發和運維之間的壁壘,促進了更緊密的合作和快速響應變化的能力。它強調團隊間的協作、自動化和持續改進。通過引入DevOps實踐,組織可以更快地交付軟件,并確保高質量的發布。

  • CI/CD代表持續集成(Continuous Integration)和持續交付(Continuous Delivery)。持續集成是指團隊成員將其工作頻繁地集成到共享存儲庫中,并進行自動化構建和測試,以減少集成問題。持續交付是指將應用程序更頻繁地交付給用戶,以便快速獲得反饋并提供新功能。本次使用的CI/CD工具為Jenkins。

二、系統環境

服務器版本

docker?版本

k8s?版本

cpu?架構

CentOS Linux 7 (Core)

26.1.4

v1.26.6

x86_64

CI/CD?架構圖:

CI/CD?架構圖描述:

  • 程序員寫好代碼之后,向gitlab代碼倉庫提交代碼,gitlab檢測到變化之后,觸發CI/CD服務器Jenkins,CI/CD服務器

  • Jenkins構建鏡像,鏡像構建好之后推送到registry鏡像倉庫,最后使用新的鏡像在Kubernetes(k8s)環境部署。

服務器分配:

服務器

操作系統版本

cpu架構

進程

10.0.41.250

CentOS Linux 7 (Core)

x86_64

docker,kube-apiserver,etcd,kube-scheduler,kube-controller-manager,kubelet,kube-proxy,coredns,calico

10.0.41.251

CentOS Linux 7 (Core)

x86_64

docker,kube-apiserver,etcd,kube-scheduler,kube-controller-manager,kubelet,kube-proxy,coredns,calico

10.0.41.252

CentOS Linux 7 (Core)

x86_64

docker,kube-apiserver,etcd,kube-scheduler,kube-controller-manager,kubelet,kube-proxy,coredns,calico

10.0.41.253

CentOS Linux 7 (Core)

x86_64

docker,jenkins, registry,gitlab,Git

10.0.41.254

CentOS Linux 7 (Core)

x86_64

三、使用?registry?搭建鏡像倉庫

10.0.41.253:
# 拉取鏡像
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/registry:latest# 創建registry容器,registry鏡像生成容器作為私有倉庫,-p 5000:5000做端口映射,物理機端口5000:容器端口5000,
# -v /myregistry:/var/lib/registry數據卷掛載,物理機目錄/myregistry:容器目錄/var/lib/registry
docker run -d --name registry -p 5000:5000 --restart=always -v /myregistry:/var/lib/registry  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/registry:latest

  • 現在?/myregistry/?還沒有任何東西,因為還沒有鏡像推送到?registry?倉庫

  • 下面是流水線搭建好,有鏡像推送后,產生的鏡像目錄和鏡像tag目錄

四、配置?docker?參數

集群內所有節點操作

vim /etc/docker/daemon.json
{"registry-mirrors": ["https://oi87dmig.mirror.aliyuncs.com","https://docker.mirrors.ustc.edu.cn","https://hub-mirror.c.163.com","https://mirror.baidubce.com","https://registry.docker-cn.com"],"insecure-registries":["10.0.41.253:5000"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"},"storage-driver": "overlay2"
}vim /usr/lib/systemd/system/docker.service
...
ExecStart=/usr/bin/dockerd  -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
...systemctl daemon-reload
systemctl restart docker

五、安裝?gitlab?代碼倉庫

# 拉取鏡像
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/gitlab/gitlab-ce:17.4.1-ce.0
docker tag  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/gitlab/gitlab-ce:17.4.1-ce.0  docker.io/gitlab/gitlab-ce:17.4.1-ce.0# 創建 gitlab 配置文件目錄,日志目錄,代碼目錄,授予777權限
mkdir -p /data/gitlab/etc /data/gitlab/log /data/gitlab/data
chmod 777 /data/gitlab/etc /data/gitlab/log /data/gitlab/data# 啟動容器
docker run -dit --name=gitlab --restart=always -p 8443:443 -p 80:80 -p 222:22 -v /data/gitlab/etc:/etc/gitlab -v /data/gitlab/log:/var/log/gitlab -v /data/gitlab/data:/var/opt/gitlab --privileged=true gitlab/gitlab-ce:17.4.1-ce.0# 創建gitlab容器,使用--privileged=true參數,使container內的root擁有真正的root權限。否則,container內的root只是外部的一個普通用戶權限。--privileged=true啟動的容器,可以看到很多host上的設備,并且可以執行mount。甚至允許你在docker容器中啟動docker容器。
# -v指定數據卷,gitlab容器的配置文件,日志文件,數據文件也都存儲到了物理機上,我們修改對應數據卷的內容,gitlab容器的相關內容也隨之改變。-p指定端口映射。# 查看 gitlab 容器
[root@milvus-04 ~]# docker ps | grep gitlab
fb0f281e76ab   gitlab/gitlab-ce:17.4.1-ce.0       "/assets/wrapper"      22 hours ago    Up 7 hours (healthy)   0.0.0.0:80->80/tcp, 0.0.0.0:222->22/tcp, 0.0.0.0:8443->443/tcp   gitlab

六、修改?gitlab?容器的配置文件

  • 注意先讓gitlab容器運行一段時間,讓其數據進行初始化,然后再停止gitlab容器,修改配置文件

docker stop gitlab
  • 下面開始修改?gitlab?的配置文件

  • 修改/data/gitlab/etc/gitlab.rb,external_url指的是gitlab所在的機器IP,gitlab_ssh_host指定gitlab所在的機器IP,gitlab_shell_ssh_port指定ssh端口,因為我們把gitlab容器的22端口映射為了222,所以gitlab_shell_ssh_port為222

vim /data/gitlab/etc/gitlab.rb
gitlab_rails['gitlab_shell_ssh_port'] = 222
external_url 'http://10.0.41.253'
gitlab_rails['gitlab_ssh_host'] = '10.0.41.253'
  • 修改/data/gitlab/data/gitlab-rails/etc/gitlab.yml,host指定gitlab所在的機器IP,端口為80,不使用https

vim /data/gitlab/data/gitlab-rails/etc/gitlab.ymlgitlab:## Web server settings (note: host is the FQDN, do not include http://)host: 10.0.41.253port: 80https: false
  • 啟動?gitlab?容器

systemctl start gitlab
  • 訪問 gitlab?web?界面

  • 瀏覽器訪問gitlab所在機器的IP地址和80端口,即可訪問gitlab web界面

  • 訪問gitlab界面http://10.0.41.253,gitlab登錄界面如下

  • 新版的?gitlab , 在安裝完啟動 GitLab 后,應該就可以在網頁上訪問到 GitLab 的登錄界面了,不過 GitLab 已事先創建了一個賬號了,這個賬號就是管理員賬號。即便是注冊新 GitLab 賬號,也需要登錄管理員賬號進行審批

  • 這個管理員賬號的賬號名為 root,而密碼在一個自動生成的文件?/etc/gitlab/initial_root_password?中(密碼不會含空格),且會在 24 小時后自動被刪除

[root@milvus-04 ~]# find / -name initial_root_password
/home/gitlab/etc/initial_root_password
/data/gitlab/etc/initial_root_password
[root@milvus-04 ~]# cat /data/gitlab/etc/initial_root_password
# WARNING: This value is valid only in the following conditions
#          1. If provided manually (either via `GITLAB_ROOT_PASSWORD` environment variable or via `gitlab_rails['initial_root_password']` setting in `gitlab.rb`, it was provided before database was seeded for the first time (usually, the first reconfigure run).
#          2. Password hasn't been changed manually, either via UI or via command line.
#
#          If the password shown here doesn't work, you must reset the admin password following https://docs.gitlab.com/ee/security/reset_user_password.html#reset-your-root-password.Password: 4A3dXlNq5pZebrMBqkdBk1xdP3i+1UsjrleAHm9Tw7Q=# NOTE: This file will be automatically deleted in the first reconfigure run after 24 hours.

所以,賬號密碼為:root/4A3dXlNq5pZebrMBqkdBk1xdP3i+1UsjrleAHm9Tw7Q=

七、使用?gitlab

  • 登錄gitlab之后,首頁如下

  • 點擊創建一個項目, 設置項目名稱為:my-project,項目描述(可選),可見等級設置為公開

  • 選擇SSH的方式拉取和推送代碼,點擊新建SSH公鑰,否則無法通過SSH拉取和推送代碼

  • 現在回到?gitlab?服務器,復制公鑰信息到?gitlab?的密鑰里

# 如果有公鑰則直接復制,沒有要創建# 生成密鑰,-N ""表示提供一個新密語,密語為空
ssh-keygen -N ""
# 查看生成的密鑰,id_rsa是私鑰 ,id_rsa.pub是公鑰
ls ~/.ssh/
# 查看公鑰,并復制公鑰信息到Gitlab的密鑰里
[root@milvus-04 ~]# cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD1Vdzn50NtP5dBHzCUSSU/YpC3+GOt3k5i3Gw5jmI36HQYLy3tCjWLzzI0+A82iSP6gnmCh6lpmy59Px7+u1VOmNb8qC32OND9J0Deni8tmkURcaiR85HtAoKpFBXZ8vzUEi9Nmj+6Ju550s94n7pBuGTa6a12VYkdHdMFWCXdWQdpU92r1SlT9DTkM4HFIpiJFll7rLvKUoQsM7b85q/rJyJkdKjmYwL+9FdLTxlNseZrXWpSCMmKwZoAHFRMSWc4x+2Ee8IobgmwuNKV586KL1958NNRRKmv1ybcd2wIkUyYGO2/dFajbr/JrqqWTLvYCrAkMyxhxNs9ALhZ3yIl root@bogon

  • 創建?git?版本庫,在服務器上安裝?git

yum -y install git
  • --global表示Git 全局設置,設置用戶名和郵箱

git config --global user.name "Administrator"
git config --global user.email "docker_01@163.com"
  • 把我們gitlab上的項目克隆下來

git clone ssh://git@10.0.41.253:222/root/my-project.git
  • 創建?index.html?文件

cd my-project/
vim index.html
hello everyone
i am Liu Jichao, a strong man.
Hahahahaha~git config --global push.default matching
git config --global push.default simple# git add 命令可將該文件添加到暫存區
git add index.html
git commit -m "add index.html"# git push命令用于將本地分支的更新,推送到遠程主機
git push
  • 去gitlab界面上看文件是否推送過去,可以看到index.html被推送到gitlab代碼倉庫了

  • 自此gitlab代碼倉庫配置完成,但是還缺觸發jenkins,等安裝好jenkins再配置

八、安裝部署 CI/CD?服務器?jenkins

  • 創建?jenkins?容器

# 拉取鏡像
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/jenkins/jenkins:latest-jdk17
docker tag  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/jenkins/jenkins:latest-jdk17  docker.io/jenkins/jenkins:latest-jdk17# 創建 jenkins 數據卷需要的目錄,并把所有者和所屬組改為 1000
# /jenkins的屬主UID要改成1000的原因為:容器里是以jenkins用戶的身份去讀寫數據,而在容器里 jenkins 的 uid 是 1000,可以看下此鏡像的 Dockerfile 內容
mkdir  /jenkins
chown 1000:1000 /jenkins# 啟動容器
docker run -dit -p 8080:8080 -p 50000:50000 --name jenkins --privileged=true --restart=always -v /jenkins:/var/jenkins_home jenkins/jenkins:latest-jdk17

  • 讓jenkins容器運行一段時間之后,再訪問jenkins web界面,瀏覽器訪問:10.0.41.253:8080,即可訪問jenkins的web界面

  • 下面需要修改jenkins容器的配置文件,因為jenkins容器使用了數據卷:-v /jenkins:/var/jenkins_home,我們修改物理機/jenkins下面的文件,對應容器里的文件也就相應改變

docker stop jenkins
vim /jenkins/hudson.model.UpdateCenter.xml
<?xml version='1.1' encoding='UTF-8'?>
<sites><site><id>default</id><url>https://mirrors.tuna.tsinghua.edu.cn/jenkins</url></site>
</sites>
# 這個地址是用來更新jenkins和安裝jenkins插件的網址,把該地址換為清華大學的地址,提高安裝jenkins插件的下載速度vim /jenkins/updates/default.json
{"connectionCheckUrl":"http://www.baidu.com/"
# /jenkins/updates/default.json文件的connectionCheckUrl修改為:"connectionCheckUrl":"http://www.baidu.com/"# 重新啟動Jenkins
docker start jenkins# 查看 jenkins 管理員密碼并登錄,jenkins管理員密碼在/jenkins/secrets/initialAdminPassword文件,查看密碼
cat /jenkins/secrets/initialAdminPassword
180f181649bf4b0d89360c0e3bd786eb
  • 點擊安裝推薦的插件

  • Jenkins插件安裝完成之后,會出現創建管理員用戶界面

jenkinsadmin

devopsjenkins123

docker_01@163.com

  • 安裝?docker?插件

  • 安裝完,重啟jenkins

  • 在jenkins主頁依次點擊系統管理-->插件管理-->已安裝,搜索docker,發現 docker 插件和 docker-build-step插件已經安裝好了

九、配置?jenkins?連接?docker

  • Docker Host URI輸入連接docker的地址,此處為:tcp://10.0.41.253:2375?,再點擊test connection,如果出現docker的版本號,則jenkins連接docker成功,最后保存即可

  • 在首頁點擊系統管理-->系統配置,找到 Docker Builder,在docker URL里輸入連接的docker地址:tcp://10.0.41.253:2375,點擊 test connection,如果出現Connected to?tcp://10.0.41.253:2375,這樣說明jenkins和docker就關聯起來了,最后點擊保存

  • 此時jenkins就能連接docker了

十、安全設置

  • gitlab要觸發jenkins操作,需要做相關安全設置,首頁依次點擊系統管理-->全局安全配置-->授權策略,勾選"匿名用戶具有可讀權限"

  • 注意下面的跨站請求偽造保護(CSFR)必須要關閉,但是在Jenkins版本自2.2xx版本之后,在 web 界面里已經沒法關閉了,所以在當前 web 界面里暫且不要管它,點擊下面的保存。

  • gitlab 要觸發 jenkins 的話,就必須要關閉跨站請求偽造保護,既然web 界面里已經沒法關閉了,那么我們在命令行里操作

  • 進入?jenkins?容器,找到/usr/local/bin/jenkins.sh

  • 在該文件中的:exec java -Duser.home="$JENKINS_HOME" ${FUTURE_OPTS} "${java_opts_array[@]}" -jar ${JENKINS_WAR} "${jenkins_opts_array[@]}" "$@" 一行中,增加:

-Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true

vi /usr/local/bin/jenkins.sh
#修改后內容如下:
......
exec java -Duser.home="$JENKINS_HOME" -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true ${FUTURE_OPTS} "${java_opts_array[@]}" -jar ${JENKINS_WAR} "${jenkins_opts_array[@]}" "$@"
  • 配置完成后重啟Jenkins容器

  • 重啟好jenkins之后,登錄jenkins web界面。

  • 首頁依次點擊系統管理-->全局安全配置,此時跨站請求偽造保護已經被關閉了。

十一、配置?jenkins?連接 k8s?集群

  • jenkins需要把鏡像部署到Kubernetes(k8s)集群,所以jenkins需要kubectl客戶端工具和kubeconfig文件連接k8s環境,現在回到Kubernetes(k8s)集群

  • master?節點:

scp /ur/local/bin/kubectl root@10.0.41.253:/root
scp /root/.kube/config root@10.0.41.253:/root
  • 把 kubect l和 config 文件拷貝到 jenkins 容器

  • jenkins?節點:

docker cp kubectl jenkins:/
docker cp config jenkins:/
# 以root身份進入jenkins容器
[root@milvus-04 ~]# docker exec -it -u root jenkins /bin/sh
# ls
bin  boot  config  dev  etc  home  kubectl  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
chmod +x kubectl
chmod 644 config
# ./kubectl --kubeconfig=config get node
NAME           STATUS   ROLES           AGE   VERSION
controller-0   Ready    control-plane   69d   v1.26.6
controller-1   Ready    control-plane   69d   v1.26.6
controller-2   Ready    control-plane   69d   v1.26.6
worker-0       Ready    <none>          75d   v1.26.6
worker-1       Ready    <none>          75d   v1.26.6
# ./kubectl --kubeconfig=config get pod -A
NAMESPACE      NAME                                                 READY   STATUS              RESTARTS        AGE
default        nfs-client-nfs-client-provisioner-799d7f54fd-tdskb   0/1     ContainerCreating   0               47h
default        nginx-d969465bc-bsb26                                1/1     Running             0               21h
devops         nginx-9bbffc845-mmshq                                1/1     Running             0               16h
kube-flannel   kube-flannel-ds-4x42v                                1/1     Running             6 (23h ago)     69d
kube-flannel   kube-flannel-ds-76btm                                1/1     Running             1 (41h ago)     69d
kube-flannel   kube-flannel-ds-cvcjn                                1/1     Running             2 (41h ago)     69d
kube-flannel   kube-flannel-ds-v4ww9                                1/1     Running             1 (41h ago)     69d
kube-flannel   kube-flannel-ds-zt7s5                                1/1     Running             2 (41h ago)     69d
kube-system    coredns-7db6d4f6d7-crsfv                             1/1     Running             2 (41h ago)     72d
kube-system    metrics-server-574b6ff575-zfl7z                      1/1     Running             4 (41h ago)     69d
logging        es-0                                                 0/1     Pending             0               2d18h
my-milvus      my-milvus-datacoord-74b4d5ffd9-9rcz6                 1/1     Running             1 (41h ago)     47h
my-milvus      my-milvus-datacoord-74b4d5ffd9-cpqgz                 1/1     Running             20 (41h ago)    9d
my-milvus      my-milvus-datanode-58f96b6cbd-jflls                  1/1     Running             20 (41h ago)    9d
my-milvus      my-milvus-indexcoord-7bb79f98d8-8996w                1/1     Running             1 (41h ago)     13d
my-milvus      my-milvus-indexcoord-7bb79f98d8-xhv2t                1/1     Running             1 (41h ago)     47h
my-milvus      my-milvus-indexnode-67cc4f94dc-d8fv4                 1/1     Running             5 (41h ago)     47h
my-milvus      my-milvus-proxy-77cb496596-mbdcl                     1/1     Running             669 (41h ago)   13d
my-milvus      my-milvus-querycoord-5775855487-9c8h2                1/1     Running             698 (41h ago)   13d
my-milvus      my-milvus-querycoord-5775855487-hct8w                1/1     Running             1 (41h ago)     47h
my-milvus      my-milvus-querynode-5b464fddb9-zmqk5                 1/1     Running             5 (41h ago)     47h
my-milvus      my-milvus-rootcoord-777cbd9949-hhh42                 1/1     Running             1 (41h ago)     13d
my-milvus      my-milvus-rootcoord-777cbd9949-nm8g5                 1/1     Running             4 (41h ago)     47h
  • 可以發現在?jenkins?容器內可以管理 k8s?集群。自此,jenkins就可以遠程連接k8s環境了

十二、創建?jenkins?項目

  • 首頁點擊新建任務,任務名稱可以自定義,選擇構建一個自由風格的軟件項目,點擊確定。

  • 配置構建觸發器,這樣gitlab就可以觸發jenkins了,在構建觸發器那里選中觸發遠程構建(例如,使用腳本),身份驗證令牌自定義。

  • 注意:鏈接 JENKINS_URL/job/devopsProject/build?token= TOKEN_NAME,這個鏈接用于 gitlab 在觸發 jenkins 時用到的鏈接,我們這里,TOKEN_NAME 的值是connect123,JENKINS_URL 是 192.168.110.133:8080,所以整個鏈接為:

http://10.0.41.253:8080/job/devopsProject/build?token=connect123。

  • 當gitlab代碼倉庫內容變動之后,會去觸發jenkins,所以需要增加構建步驟。

  • 點擊構建-->增加構建步驟,選擇執行shell。

  • 程序員提交了代碼到gitlab之后,jenkins需要重新拉取新代碼,這時要先刪除家目錄下的舊代碼,再拉取新代碼,不然會報錯。

  • 對于jenkins容器來說,家目錄就是/var/jenkins_home,進入Jenkins容器。

  • 在構建-->增加構建步驟-->執行shell里輸入如下語句,意思為進入jenkins容器家目錄,刪除舊代碼,拉取新代碼。

cd 
rm -rf my-project
git clone http://10.0.41.253/root/my-project.git

  • Jenkins把新代碼拉取下來之后,需要進行編譯,接下來繼續增加構建步驟,這次類型選擇Build/Publish Docker Image。

  • Build/Publish Docker Image-->Directory for Dockerfile里填/var/jenkins_home/my-project/,jenkins拉取代碼是放在家目錄下,Dockerfile也在家目錄/var/jenkins_home/my-project/下

  • Cloud選擇docker,使用docker編譯Dockerfile

?

  • 把新代碼拉取下來,Dockerfile被編譯好并推送到鏡像倉庫之后,需要把新鏡像部署到k8s環境,接下來繼續增加構建步驟,這次類型選擇執行shell。

export KUBECONFIG=/config
/kubectl set image deployment/nginx nginx="10.0.41.253:5000/devopsproject/nginx:${BUILD_NUMBER}" -n devops

# export KUBECONFIG=/kctest定義KUBECONFIG,不然每次執行kubectl命令都要加上kubectl --kubeconfig=config

# export KUBECONFIG=/config

# 在devops命名空間里,替換deployment/nginx的鏡像為192.168.110.133:5000/devopsproject/nginx:${BUILD_NUMBER}

/kubectl set image deployment/nginx nginx="192.168.110.133:5000/devopsproject/nginx:${BUILD_NUMBER}" -n devops

最后點擊保存。

十三、創建?deployment

  • 現在回到Kubernetes(k8s)集群,因為jenkins把新鏡像部署到devops命名空間下,所以創建一個命名空間devops。

kubectl create namespace devops
  • 使用Nginx鏡像創建一個deploy,創建?deployment、service,?Pod副本數為1

vim nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginxnamespace: devops  # 指定命名空間為 devopslabels:app: nginx
spec:replicas: 1  # 指定需要運行的Pod副本數量為1個。selector:matchLabels:app: nginxstrategy: {}template:metadata:labels:app: nginxspec:terminationGracePeriodSeconds: 0  # 當需要關閉容器時,立即殺死容器而不等待默認的30秒優雅停機時長。containers:- name: nginximage: nginx:latest  # 指定要使用的鏡像為"nginx"。imagePullPolicy: IfNotPresent  # IfNotPresent:表示如果本地已經存在該鏡像,則不重新下載;否則從遠程 Docker Hub 下載該鏡像。resources: {}
---
apiVersion: v1
kind: Service
metadata:name: nginx-servicenamespace: devops  # 確保服務也在devops命名空間下
spec:selector:app: nginx  # 選擇標簽為"nginx"的Podports:- protocol: TCPport: 80  # 服務暴露的端口targetPort: 80  # 指定Pod內部的端口type: NodePort  # 服務類型為NodePort
kubectl apply -f nginx.yaml
[root@milvus-01 ~]# kubectl get all -n devops
NAME                        READY   STATUS    RESTARTS   AGE
pod/nginx-9bbffc845-mmshq   1/1     Running   0          17h
NAME                    TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
service/nginx-service   NodePort   172.16.159.236   <none>        80:32237/TCP   19h
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx   1/1     1            1           20h
  • 在瀏覽器訪問 10.0.41.253:32237? 即可訪問?nginx?界面

十四、配置?gitlab?觸發?jenkins

  • 接下來回到gitlab,配置gitlab觸發jenkins。

  • gitlab首頁依次點擊管理區域-->設置-->Outbound requests,展開Outbound requests,勾選允許鉤子和服務訪問本地網絡,保存修改,這樣jenkins才能訪問gitlab代碼倉庫。

  • 配置?鉤子

http://10.0.41.253:8080/job/devopsProject/build?token=connect123

  • 如果看到如上,則test成功,gitlab 能觸發 jenkins了。?自此整個DevOps環境就搭建成功了

十五、測試?DevOps?流水線

  • 寫代碼

[root@milvus-04 my-project]# ls
Dockerfile  index.html  README.md
[root@milvus-04 my-project]# vim Dockerfile
FROM nginx:latest
MAINTAINER liujichao
ADD index.html /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g","daemon off;"]
[root@milvus-04 my-project]# vim index.html
hello everyone
i am Liu Jichao, a strong man
Hahahahaha~
  • 上傳代碼到?gitlab

  • git add命令把Dockerfile和index.html添加到暫存區

[root@milvus-04 my-project]# git add .
[root@milvus-04 my-project]# git commit -m "a new code"
[main e45fbb9] a new code
1 file changed, 2 insertions(+), 4 deletions(-)
[root@milvus-04 my-project]# git push
Counting objects: 5, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 304 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To ssh://git@10.0.41.253:222/root/my-project.git666e8ba..e45fbb9  main -> main
  • 去gitlab界面看文件是否推送成功,可以看到git push成功

  • 去?jenkins?界面查看是否有部署任務

  • 再去 k8s?環境看部署的項目?pod

  • 最后查看項目部署成果

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

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

相關文章

【Linux】特效爆滿的Vim的配置方法 and make/Makefile原理

一、軟件包管理器 1、Linux下安裝軟件的常見方式&#xff1a; 1&#xff09;源代碼安裝——不推薦。 2&#xff09;rpm包安裝——不推薦。 3&#xff09;包管理器安裝——推薦 2、安裝軟件命令 # Centos$ sudo yum install -y lrzsz# Ubuntu$ sudo apt install -y lrzsz 3、卸…

Spring Boot Actuator 監控功能的簡介及禁用

Spring Boot Actuator: Production-ready Features 1. 添加依賴 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency> </dependencie…

Matlab(1)

一、基本操作1. matlab四則運算規則&#xff1a;先乘除后加減&#xff0c;從左到右2、對數和指數的表示sin(pi^0.5)log(tan(1))exp&#xff08;sin&#xff08;10&#xff09;&#xff09;3、類型&#xff1a;matlab變量默認為double4、who&whos&#xff1a;命令行輸入who&…

Kotlin Android 開發腳手架封裝

Kotlin Android 開發腳手架封裝&#xff08;模塊化版本&#xff09; 我將按照模塊化設計原則&#xff0c;將腳手架拆分為多個文件&#xff0c;每個文件負責特定功能領域&#xff1a; 1. 核心初始化模塊 文件路徑: core/AppScaffold.kt object AppScaffold {lateinit var contex…

Flutter 報錯解析:No TabController for TabBar 的完整解決方案

目錄 Flutter 報錯解析&#xff1a;No TabController for TabBar 的完整解決方案 一、錯誤場景&#xff1a;當 TabBar 失去 "指揮官" 二、為什么 TabBar 必須依賴 Controller&#xff1f; 1. TabBar 與 TabController 的協作關系 2. 狀態管理的核心作用 3. 實戰…

【24】C++實戰篇——【 C++ 外部變量】 C++多個文件共用一個枚舉變量,外部變量 extern,枚舉外部變量 enum

文章目錄1 方法2 外部變量 應用2.1 普通外部全局變量2.2 枚舉外部全局變量 應用2.2.2 枚舉外部變量優化c多個文件中如何共用一個全局變量 c頭文件的使用和多個文件中如何共用一個全局變量 C共享枚舉類型給QML 1 方法 ①頭文件中 聲明外部全局變量&#xff1b; ②在頭文件對…

Linux SELinux 核心概念與管理

Linux SELinux 核心概念與管理一、SELinux 基本概念 SELinux 即安全增強型 Linux&#xff08;Security-Enhanced Linux&#xff09;&#xff0c;由美國國家安全局&#xff08;NSA&#xff09;開發&#xff0c;是一套基于強制訪問控制&#xff08;MAC&#xff09;的安全機制&…

Git 中**未暫存**和**未跟蹤**的區別:

文件狀態分類 Git 中的文件有以下幾種狀態&#xff1a; 工作區文件狀態&#xff1a; ├── 未跟蹤 (Untracked) ├── 已跟蹤 (Tracked)├── 未修改 (Unmodified) ├── 已修改未暫存 (Modified/Unstaged)└── 已暫存 (Staged)1. 未跟蹤 (Untracked) 定義&#xff1a;Gi…

前端1.0

目錄 一、 什么是前端 二、 HTML 1.0 概述 2.0 注釋 三、開發環境的搭建 1.0 插件 2.0 筆記 四、 常見標簽&#xff08;重點&#xff09; 四、案例展示&#xff08;圖片代碼&#xff09; 五、CSS引入 一、 什么是前端 web前端 用來直接給用戶呈現一個一個的網頁 …

Flutter鏡像替換

一、核心鏡像替換&#xff08;針對 Maven 倉庫&#xff09; Flutter 依賴的 Google Maven 倉庫&#xff08;https://maven.google.com 或 https://dl.google.com/dl/android/maven2&#xff09;可替換為國內鏡像&#xff0c;常見的有&#xff1a;阿里云鏡像&#xff08;推薦&am…

MATLAB實現的改進遺傳算法用于有約束優化問題

基于MATLAB實現的改進遺傳算法&#xff08;GA&#xff09;用于有約束優化問題的代碼&#xff0c;包括處理非線性約束。此代碼通過引入懲罰函數和修復機制&#xff0c;有效處理約束條件&#xff0c;提高算法的魯棒性和收斂速度。 1. 定義優化問題 % 定義目標函數 function f ob…

Qt子類化QWidget后,使用setStyleSheet設置樣式無效的解決方案

關鍵代碼&#xff1a; #include <QPainter> #include <QStyleOption>void paintEvent(QPaintEvent *e) {QStyleOption opt;opt.init(this);QPainter p(this);style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);QWidget::paintEvent(e); }定義…

【python中級】關于Flask服務在同一系統里如何只被運行一次

【python中級】關于Flask服務在同一系統里如何只被運行一次 1.背景 2.方案1 2.方案2 1.背景 python Flask實現的一個http服務,打包成應用程序exe后在windows10系統運行; 由于我會不斷的更新這個http服務,我希望運行這個http服務的時候之前的http服務被停掉; 即實現 Pytho…

git配置公鑰/密鑰

遇到 “gitgithub.com: Permission denied (publickey)” 錯誤通常意味著你嘗試通過 SSH 連接到 GitHub 時&#xff0c;SSH 密鑰沒有被正確設置或者 GitHub 無法識別你的公鑰。這里有幾個步驟可以幫助你解決這個問題&#xff1a; 檢查 SSH 密鑰 首先&#xff0c;確保你已經在本…

【機器學習】“回歸“算法模型的三個評估指標:MAE(衡量預測準確性)、MSE(放大大誤差)、R2(說明模型解釋能力)

文章目錄一、MAE、MSE、r概念說明二、MAE&#xff08;平均絕對誤差&#xff09;&#xff1a;用"房價預測"理解誤差測量三、MSE&#xff08;均方誤差&#xff09;&#xff1a;誤差的"放大鏡"1、概念說明2、 sklearn代碼實踐3、流程總結四、R&#xff1a;理解…

智慧城市SaaS平臺|市容環衛管理系統

【生活垃圾中轉設施監管】1) 設施信息管理a) 設施基本信息支持記錄中轉設施的名稱、位置、類型、容量、負責人等基本信息。b) 設施分布地圖支持通過GIS地圖展示中轉設施的分布情況&#xff0c;支持地圖查詢和導航。2) 垃圾收運監控a) 垃圾收運記錄支持記錄垃圾收運的時間、車輛…

JAVA-13常用類(2025.08.02學習記錄)

String類String類equals方法String類compareTo方法String類valueOf方法boolean參數內存分析_字符串拼接只會在內存中開辟一個對象內存分析_字符串new創建對象內存分析_變量和字符串拼接字節碼執行過程String類內存分析package com.cn;public class test01 {public static void …

QT----簡單的htttp服務器與客戶端

HTTP協議學習 協議的相關學習可以參考這篇 csdn學習連接 總體流程如下 HTTP服務器 監聽ip和端口,有連接時接收請求,發送回復 server.h #pragma once #include <QtWidgets/QMainWindow> #include "ui_httpServer.h" #include <QTcpServer> #include &l…

飛 算 JavaAI 解 析:有 了 它,麻 麻 再 也 不 用 擔 心 我 不 會 寫 代 碼 了!

聲 明&#xff1a;本 篇 博 客 為 測 評 體 驗 非 廣 告。 文 章 目 錄一、產 品 簡 介二、注 冊 與 上 手方 法 一 - - - 從 IDEA 插 件 市 場 安 裝方 法 二產 品 使 用三、產 品 體 驗智 能 引 導 功 能理 解 需 求設 計 接 口表 結 構 設 計處 理 邏 輯生 成 源 碼Java ch…

iOS混淆工具有哪些?在集成第三方 SDK 時的混淆策略與工具建議

許多 iOS 項目中&#xff0c;不可避免地會集成各種第三方 SDK&#xff0c;比如支付、統計、廣告、社交登錄等。這些 SDK 常常存在逆向被 Hook 或提取業務邏輯的風險&#xff0c;尤其是在流程敏感或要求合規的行業中。 當你無法對第三方源碼進行控制或重新編譯時&#xff0c;混淆…