Gitlab+GitlabRunner搭建CICD自動化流水線將應用部署上Kubernetes

文章目錄

  • 安裝Gitlab
    • 服務器準備
    • 安裝版本
    • 安裝依賴和暴露端口
    • 安裝Gitlab
    • 修改Gitlab配置文件
    • 訪問Gitlab
  • 安裝Gitlab Runner
    • 服務器準備
    • 安裝版本
    • 安裝依賴
    • 安裝Gitlab Runner
    • 安裝打包工具
      • 安裝docker
      • 安裝java17
      • 安裝maven
    • 注冊Gitlab Runner
  • 搭建自動化部署
    • 準備SpringBoot項目
    • 添加一個Controller
    • 訪問項目
    • 容器鏡像準備
      • 編寫Dockerfile
      • 準備鏡像倉庫
      • 將項目打包成鏡像
      • 推送鏡像
    • 準備Kubernetes
      • 初始化集群
      • 部署應用
        • 創建命名空間
        • 創建拉取鏡像的Secret
        • 創建部署應用的Deployment控制器
        • 使用Service暴露Deployment
        • 為Service創建ingress暴露應用
    • 編寫.gitlab-ci.yml文件
      • 定義階段
      • 定義變量
      • 用maven打包SpringBoot項目
      • 用Docker將項目打成容器鏡像
      • 將鏡像推送到鏡像倉庫
      • 更新K8S的鏡像
    • 測試自動化部署

安裝Gitlab

本文章視頻地址:https://www.bilibili.com/video/BV1Se411o766/

服務器準備

筆者打算用CentOS7操作系統來搭建自動化部署CI/CD,所以本篇文章相關軟件的下載地址為CentOS7的下載地址。系統版本為 7.9.2009
在這里插入圖片描述

Gitlab對服務器的CPU和內存也提出了最小要求,CPU最小為4核心:
在這里插入圖片描述

內存最小為4GB:
在這里插入圖片描述

硬盤最少要保證為Gitlab預留了2.5GB的存儲空間(為了保險最少預留10GB 個人推薦):
在這里插入圖片描述

安裝版本

想要搭建Gitlab+Gitlab Runner的自動化部署,那么第一步一定是安裝Gitlab。根據Gitlab官方文檔顯示最新的Gilab發行版為 16.6
在這里插入圖片描述

所以我決定安裝 16.6 這個最新的發行版。接下來可以直接下載這個版本(CentOS7):

官網下載界面:https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-16.6.1-ce.0.el7.x86_64.rpm

官網下載地址:https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-16.6.1-ce.0.el7.x86_64.rpm/download.rpm

因為官網在國外非常的慢,國內大名鼎鼎的清華大學建立了一個開源軟件鏡像站,里面收錄了Gitlab。地址為:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/:
在這里插入圖片描述

同版本的清華大學開源軟件鏡像站下載地址:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-16.6.1-ce.0.el7.x86_64.rpm

安裝依賴和暴露端口

Gitlab有一些依賴需要安裝,需要執行下面命令安裝相關以來(命令從Gitlab官網復制而來):

sudo yum install -y curl policycoreutils-python openssh-server perl
# Enable OpenSSH server daemon if not enabled: sudo systemctl status sshd
sudo systemctl enable sshd
sudo systemctl start sshd
# Check if opening the firewall is needed with: sudo systemctl status firewalld
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo systemctl reload firewalldsudo yum install postfix
sudo systemctl enable postfix
sudo systemctl start postfix

上面這些命令還包括防火墻暴露端口。

安裝Gitlab

安裝完成Gitlab的依賴之后就可以開始安裝Gitlab了,上面步驟已經說明了Gitlab的安裝包下載地址,可以直接執行下面命令進行下載(清華源):

curl -LO https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-16.6.1-ce.0.el7.x86_64.rpm

下載結果如圖:
在這里插入圖片描述

因為上一個步驟已經安裝了依賴,所以現在可以直接使用rpm命令安裝gitlab了。執行下面命令(注意更改為自己的文件名):

rpm -ivh gitlab-ce-16.6.1-ce.0.el7.x86_64.rpm

看到大大的Gitlab圖標后代表Gitlab安裝成功:
在這里插入圖片描述

修改Gitlab配置文件

接下來需要修改gitlab配置文件,本次筆者打算使用https訪問gitlab(如果不需要可以將接下來的步驟的https改為http即可)。Gitlab配置文件地址為 /etc/gitlab/gitlab.rb,使用下面命令進行修改:

vi /etc/gitlab/gitlab.rb

修改 external_url 配置項為Gitlab的訪問地址,如無需https可將協議改為http。也可以將域名改為IP地址。如果是域名那么注意域名解析是解析到Gitlab服務器上的:
在這里插入圖片描述

如果不需要使用到https,你可以直接執行 sudo gitlab-ctl reconfigure 然后越過下面配置https的步驟。

接下來開始配置https訪問Gitlab。首先需要準備域名證書,因為訪問Gitlab是通過Nginx,所以域名證書需要準備的是Nginx相關的證書。我之前寫過一篇關于自簽名證書的文章:https://blog.csdn.net/m0_51510236/article/details/124676341。當然我已經在阿里云準備好了相關的免費證書:
在這里插入圖片描述

點擊下載Nginx版本的證書:
在這里插入圖片描述

下載好后如圖:
在這里插入圖片描述

然后執行下面命令將文件的權限改為 755(注意修改為你自己的文件地址):

chmod -R 755 /etc/gitlab/ssl

修改后如圖:
在這里插入圖片描述

繼續修改 /etc/gitlab/gitlab.rb 文件,將 letsencrypt['enable'] 配置項改為false:
在這里插入圖片描述

配置內容:

letsencrypt['enable'] = false

然后根據圖片提示修改nginx相關配置:
在這里插入圖片描述

配置內容:

nginx['enable'] = true
nginx['redirect_http_to_https'] = true
nginx['ssl_certificate'] = "/etc/gitlab/ssl/domain.pem"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/domain.key"

其余更多配置如redis、PostgreSQL和STMP等,可參考Gitlab配置的官方文檔:https://docs.gitlab.com/omnibus/settings,配置好后可以直接執行下面命令使配置生效:

sudo gitlab-ctl reconfigure

配置的耗時會有點長,看到如下提示代表配置成功:
在這里插入圖片描述

訪問Gitlab

可以通過下面命令查看生成的初始Gitlab的root密碼(此密碼24小時后過期):

cat /etc/gitlab/initial_root_password

生成初始密碼如圖:
在這里插入圖片描述

然后訪問你的Gitlab服務器,默認來到登錄界面。默認用戶為root,輸入上面查詢到的初始root密碼之后可直接登錄:
在這里插入圖片描述

登錄之后可以來到首頁:
在這里插入圖片描述

然后點擊頭像后點擊 Edit profile
在這里插入圖片描述

你可以設置一些個人信息:
在這里插入圖片描述

然后注意修改一下密碼(必須):
在這里插入圖片描述

同時為了免密拉取代碼,設置一下 SSH Keys
在這里插入圖片描述

好了Gitlab安裝完畢了

安裝Gitlab Runner

如果需要使用Gitlab來進行自動化部署,則你需要安裝最少一個Gitlab Runner。

服務器準備

本次一樣也是使用CentOS7安裝Gitlab Runner,系統版本:
在這里插入圖片描述

因為構建對服務器配置需求變動很大,可能配置很低的服務器就能完成構建。但構建任務非常多或非常頻繁,那么則可能需要配置更高的Gitlab Runner,或者說安裝多臺Gitlab Runner服務器。官網沒有對服務器需求有明確的需求,如圖:
在這里插入圖片描述

本次筆者使用的是2c2g配置的服務器,如圖:
在這里插入圖片描述

安裝版本

與Gitlab安裝的版本一樣,使用的是 16.6.1 版本,各個系統的下載界面:https://gitlab-runner-downloads.s3.amazonaws.com/v16.6.1/index.html
在這里插入圖片描述

官網下載地址:https://gitlab-runner-downloads.s3.amazonaws.com/v16.6.1/rpm/gitlab-runner_amd64.rpm

同樣因為在國外下載比較慢,可以使用清華大學開源軟件鏡像站下載,下載地址:https://mirrors.tuna.tsinghua.edu.cn/gitlab-runner/yum/el7-x86_64/gitlab-runner-16.6.1-1.x86_64.rpm

安裝依賴

Gitlab Runner的依賴只有一個那就是git,為了方便直接使用yum安裝:

yum install -y git

安裝成功可以查看版本:
在這里插入圖片描述

安裝Gitlab Runner

上一個步驟已經寫了下載地址,可以使用下面這行命令進行下載(清華源):

curl -LO https://mirrors.tuna.tsinghua.edu.cn/gitlab-runner/yum/el7-x86_64/gitlab-runner-16.6.1-1.x86_64.rpm

下載成功如圖:
在這里插入圖片描述

然后使用下面命令安裝Gitlab Runner:

rpm -ivh gitlab-runner-16.6.1-1.x86_64.rpm

安裝成功如圖:
在這里插入圖片描述

安裝打包工具

安裝docker

安裝docker比較簡單,直接使用下面命令進行安裝:

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
sudo systemctl enable --now docker

為了避免gitlab-runner使用docker打包失敗,需要將運行gitlab-runner的用戶設置為root。首先先查看gitlab-runner的執行用戶,使用這行命令:

ps aux | grep gitlab-runner

可以看到執行的用戶為gitlab-runner,切換到這個用戶之后查看docker的鏡像列表報權限不足:
在這里插入圖片描述

執行下面代碼將gitlab-runner的執行用戶改為root:

# 卸載掉gitlab-runner的默認用戶
gitlab-runner uninstall
# 將gitlab-runner的用戶設置為root
gitlab-runner install --working-directory /home/gitlab-runner --user root
# 重啟gitlab-runner
systemctl restart gitlab-runner

執行完成后再次查看可以看到gitlab-runner的執行用戶已變為root:
在這里插入圖片描述

安裝java17

待會會打包SpringBoot應用,而根據Spring官網顯示Spring2.*已于2023年11月24日停止官方支持,僅保留商業版支持:
在這里插入圖片描述

從SpringBoot3.*開始SpringBoot應用需要Java17:
在這里插入圖片描述

所以本次需要為服務器安裝java17,oracle官網下載界面:https://www.oracle.com/java/technologies/downloads/#java17
在這里插入圖片描述

下載到服務器后我打算將其安裝在 /opt/environment 目錄下,執行下面命令解壓:

mkdir /opt/environment
tar -zxvf jdk-17_linux-x64_bin.tar.gz -C /opt/environment

然后將下面幾行代碼添加到 /etc/profile 文件的最后:

# Set java environment
JAVA_HOME=/opt/environment/jdk-17.0.9
PATH=$PATH:$JAVA_HOME/bin
export JAVA_HOME PATH

最后執行下面命令使它生效:

source /etc/profile

最后可以看到安裝成功:
在這里插入圖片描述

當然也可以為此構建一個鏡像,為之后部署到Kubernetes做準備。Dockerfile內容:

FROM ubuntu:22.04
LABEL org.opencontainers.image.authors="XiaoHH <***@qq.com>"
ADD jdk-17_linux-x64_bin.tar.gz /opt
ENV PATH=${PATH}:/opt/jdk-17.0.9/bin

然后執行下面命令構建并測試打包是否成功:

# 構建鏡像
docker build -t {鏡像名稱}:{鏡像版本} .
# 運行鏡像并執行java -version查看鏡像是否構建成功
docker run --name test-jdk {鏡像名稱}:{鏡像版本} java -version

可以看到鏡像打包成功:
在這里插入圖片描述

安裝maven

使用下面命令下載maven-3.8.8:

curl -LO https://dlcdn.apache.org/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz

下載如圖:
在這里插入圖片描述

我打算將其安裝在 /opt/environment 目錄下,所以執行以下命令:

tar -zxvf apache-maven-3.8.8-bin.tar.gz -C /opt/environment

然后將下面幾行代碼添加到 /etc/profile 文件的最后:

# Set maven environment
MAVEN_HOME=/opt/environment/apache-maven-3.8.8
PATH=$PATH:$MAVEN_HOME/bin
export MAVEN_HOME PATH

最后執行下面命令使它生效:

source /etc/profile

然后可以查看maven的版本:
在這里插入圖片描述

maven的配置文件配置可以參考我之前寫的文章:https://blog.csdn.net/m0_51510236/article/details/115218790

注冊Gitlab Runner

現在已經完成了所有準備操作,可以將Gitlab Runner注冊到Gitlab上了。按照圖片提示來到Runners界面:
在這里插入圖片描述

復制注冊Runner的Token,接下來一個步驟要用到這個Token:
在這里插入圖片描述

在Gitlab Runner服務器中執行下面命令注冊Runner:

gitlab-runner register

然后按照圖片提示填寫對應內容:
在這里插入圖片描述

然后回到Runner界面可以看到Runner注冊成功。點擊編輯Runner:
在這里插入圖片描述

勾選 Run untagged jobs 然后點擊保存:
在這里插入圖片描述

默認情況下Gitlab Runner是開機自啟動的,但是還是建議執行這行命令確認一下:

systemctl enable gitlab-runner

搭建自動化部署

接下來將要準備一個項目來測試這個自動化部署,將以一下步驟進行搭建:

  • 準備一個SpringBoot項目
  • 當新增tag的時候自動構建項目
  • 將SpringBoot項目用Maven打包
  • 將Maven打包好的jar包使用Docker打成Docker鏡像
  • 將Docker鏡像推送到鏡像倉庫
  • 將Docker鏡像部署到Kubernetes

如果你不是java web工程師你也可以繼續讀本篇文章讀下去,搭建自動化部署只是個思路,按照這個步驟你修改一下完全可以自動化部署其他語言的應用程序。

準備SpringBoot項目

直接使用Spring初始化器來初始化一個SpringBoot應用。Spring初始化器地址:https://start.spring.io。然后填寫項目基本信息:
在這里插入圖片描述

添加一個Controller

然后將其導入到開發工具后新增一個Controller,Controller的代碼如下:

package city.yueyang.cicd.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/test")
public class TestController {/*** 測試CI/CD的Controller* @return 版本信息*/@GetMapping("/hello")public String hello() {return "Hello! Gilab CI/CD --- v1.0.0";}
}

如圖:
在這里插入圖片描述

然后再到 pom.xml 文件的 build 中添加這么一個屬性:

<finalName>${artifactId}</finalName>

如圖:
在這里插入圖片描述

訪問項目

現在項目就準備好了,直接運行并訪問剛剛的那個Controller可以看到訪問成功:
在這里插入圖片描述

容器鏡像準備

編寫Dockerfile

然后需要準備一個Dockerfile,用于將項目打成Docker鏡像。可以看到使用Maven打包之后打包成功了:
在這里插入圖片描述

因為文件名為 gitlab-cicd.jar ,直接編寫Dockerfile(注意更改jar包名稱):

# 使用在安裝jdk那個步驟時候制作好的jdk鏡像
FROM registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/java:17.0.9-jdk# 作者
LABEL org.opencontainers.image.authors="XiaoHH <xiaohh@yueyang.city>"# 將可執行的jar包放到容器當中去
ADD java/gitlab-cicd.jar app.jar# 暴露8080端口
EXPOSE 8080# JVM 調優參數,使用G1垃圾回收器
ENV JAVA_OPTION="-Dfile.encoding=UTF-8 -XX:+UseG1GC"# JVM 內存默認值
ENV XMX=1g
ENV XMS=1g
ENV XMN=512m# 運行程序
ENTRYPOINT ["sh", "-c", "java -Djava.security.egd=file:/dev/./urandom -jar -Xmx${XMX} -Xms${XMS} -Xmn${XMN} ${JAVA_OPTION} /app.jar"]

準備鏡像倉庫

為了方便這篇文章就以阿里云鏡像倉庫為例搭建了,如果你需要私有化的鏡像倉庫可以參考我寫的文章:https://blog.csdn.net/m0_51510236/article/details/125030239。阿里云容器鏡像服務地址:https://www.aliyun.com/product/acr。

將項目打包成鏡像

鏡像倉庫準備好后就可以打包鏡像了,可以將項目拉取到一個Linux環境當中,如圖:
在這里插入圖片描述

然后先使用下面命令將其打成jar包:

mvn clean package -Dmaven.test.skip

然后可以可以看到在target目錄當中生成了jar包文件:
在這里插入圖片描述

然后執行下面幾條命令將其移動到 docker/java 目錄當中去:

mkdir docker/java
mv target/gitlab-cicd.jar docker/java

然后可以執行這行命令來清空打包殘余:

mvn clean

最后來到docker目錄,查看現在的目錄結構:
在這里插入圖片描述

并且在Dockerfile當中也需要在java目錄下有gitlab-cicd.jar包:
在這里插入圖片描述

接下來使用下面這條命令將項目打成鏡像:

docker build -t registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/gitlab-cdci:v1.0.0 .

可以看到鏡像打包成功:
在這里插入圖片描述

然后可以使用這行命令啟動這個鏡像測試鏡像有沒有問題(??修改為自己的鏡像倉庫地址):

docker run -itd --name gitlab-cicd -p 8080:8080 registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/gitlab-cdci:v1.0.0

可以看到應用啟動成功:
在這里插入圖片描述

嘗試訪問一下java代碼當中的接口(訪問docker部署應用的服務器):
在這里插入圖片描述

推送鏡像

鏡像制作好后就開始推送鏡像了,首先先登錄到鏡像倉庫,使用這條命令:

docker login --username={用戶名} {服務器地址}

執行后還需要輸入密碼,然后可以看到登錄成功(??修改為自己的鏡像倉庫地址):
在這里插入圖片描述

然后直接執行這行命令即可推送(??修改為自己的鏡像倉庫地址):

docker push registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/gitlab-cdci:v1.0.0

執行完后可以看到執行成功:
在這里插入圖片描述

阿里云鏡像倉庫里面也可以看到推送成功:
在這里插入圖片描述

準備Kubernetes

初始化集群

我之前寫過兩篇安裝Kubernetes集群的文章:

  • 單主節點集群:https://blog.csdn.net/m0_51510236/article/details/130842122
  • 多主節點集群:https://blog.csdn.net/m0_51510236/article/details/134142834

這篇文章為了方便就直接使用阿里云的容器服務 Kubernetes 版 ACK了(本文章沒有做廣告,私有化Kubernetes集群也可以完成自動化部署的流水線搭建),可以點擊立即購買(或看看新用戶有沒有免費試用):
在這里插入圖片描述

按照自己的需求選擇配置即可:
在這里插入圖片描述

因為要用本地的gitlab-runner遠程操控k8s,所以需要用公網暴露apiserver,注意勾選這個選項:
在這里插入圖片描述

初始化成功,然后點擊詳情:
在這里插入圖片描述

然后點擊集群信息下的基本信息->鏈接信息,里面有kubeconfig配置文件內容,點擊左上角的復制:
在這里插入圖片描述

下載kubectl,直接執行這行命令即可下載(可修改其中的版本號):

curl -LO https://dl.k8s.io/release/v1.26.11/bin/linux/amd64/kubectl

然后執行以下命令安裝kubectl:

chmod +x kubectl
mv kubectl /usr/local/bin/

然后將之前復制的kubeconfig保存到 ~/.kube/config 當中,執行以下命令:

mkdir ~/.kube
vi ~/.kube/config
# 保存之前復制的kubeconfig內容

保存之后可獲取節點內容:
在這里插入圖片描述

更多關于遠程連接Kubernetes集群的內容可參考我寫的文檔:https://blog.csdn.net/m0_51510236/article/details/133710224

部署應用

創建命名空間

因為上一個步驟鏡像推送,推送了鏡像。現在可以部署應用了。首先先來創建命名空間:

  • 命令創建:
kubectl create namespace gitlab-cicd
  • yaml文件創建:
apiVersion: v1
kind: Namespace
metadata:name: gitlab-cicd

可以看到命名空間創建成功:
在這里插入圖片描述

創建拉取鏡像的Secret

因為準備的鏡像倉庫為私有,所以需要創建一個拉取鏡像的secret,用于存儲拉取鏡像的用戶名和密碼:
在這里插入圖片描述

建議將內容保存在一個yaml文件當中,執行下面命令生產Secret的yaml資源清單文件:

kubectl create secret docker-registry secret名字 --namespace=gitlab-cicd --docker-server='服務器地址' --docker-username='用戶名' --docker-password='密碼' --docker-email='郵箱' --dry-run='client' --output='yaml'

如圖生成成功:
在這里插入圖片描述

將其保存到之前的文件中注意用三條杠分開兩段yaml:
在這里插入圖片描述

執行這段yaml可以看到創建成功:
在這里插入圖片描述

創建部署應用的Deployment控制器

注意因為我的鏡像倉庫和Kubernetes集群都在阿里云的深圳節點,所以可以使用VPC地址拉取鏡像,可以理解為內網地址,這樣會快很多:
在這里插入圖片描述

可以執行下面命令生成Deployment控制器的yaml結構,但是不能直接執行,需要修改那么一些內容:

kubectl create deployment gitlab-cicd --namespace=gitlab-cicd --dry-run='client' --image='registry-vpc.cn-shenzhen.aliyuncs.com/xiaohh-docker/gitlab-cdci:v1.0.0' --output='yaml' --port=8080 --replicas=1

生成成功如圖:
在這里插入圖片描述

同樣將其保存到一個文件當中,注意用三個杠分開兩段yaml:
在這里插入圖片描述

接下來直接出示修改后的結果:

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: gitlab-cicdname: gitlab-cicdnamespace: gitlab-cicd
spec:replicas: 1selector:matchLabels:app: gitlab-cicdtemplate:metadata:labels:app: gitlab-cicdspec:containers:# 設置一些環境變量- env:# JVM調優參數,設置UTF-8編碼字符集和使用G1垃圾回收器- name: JAVA_OPTIONvalue: "-Dfile.encoding=UTF-8 -XX:+UseG1GC"# 調整一下內存大小- name: XMXvalue: "2g"- name: XMSvalue: "2g"- name: XMNvalue: "1g"image: registry-vpc.cn-shenzhen.aliyuncs.com/xiaohh-docker/gitlab-cdci:v1.0.0# 存活探針livenessProbe:httpGet:path: /actuator/healthport: 8080scheme: HTTPinitialDelaySeconds: 30periodSeconds: 10name: gitlab-cdciports:- containerPort: 8080protocol: TCP# 資源限制,最多使用2核心CPU和4G內存resources:limits:cpu: 1000mmemory: 4Girequests:cpu: 1000mmemory: 4Gi# 因為鏡像倉庫是私有的,所以帶上拉取鏡像的SecretimagePullSecrets:- name: gitlab-cicd-registry

執行這個文件可以看到創建成功:
在這里插入圖片描述

使用Service暴露Deployment

可以使用下面這行命令創建Service的yaml資源清單文件:

kubectl expose deployment gitlab-cicd --port=8080 --target-port=8080 --namespace=gitlab-cicd --name=gitlab-cicd --protocol=TCP --type=ClusterIP --dry-run=client --output=yaml

生成如圖:
在這里插入圖片描述

將其拼接到yaml文件的后面,記得用三個橫杠分開兩段yaml:
在這里插入圖片描述

執行創建可以看到創建成功:
在這里插入圖片描述

為Service創建ingress暴露應用

上一個步驟已經創建了Service,這個步驟需要用ingress將服務給暴露給外部訪問。可以先執行這行命令看看集群內有哪些ingress類:

kubectl get ingressclass

可以看到有個nginx的ingress,關于私有化集群的nginx-ingress可參考我寫的文章:https://blog.csdn.net/m0_51510236/article/details/132536519
在這里插入圖片描述

接下來可以使用這行命令創建ingress的yaml資源清單(注意修改域名和服務名):

kubectl create ingress gitlab-cicd --class=nginx --rule="域名/*=服務名稱:8080" --namespace=gitlab-cicd --dry-run=client --output=yaml

生成如圖:
在這里插入圖片描述

將其拼接到yaml文件的后面,記得用三個橫杠分開兩段yaml:
在這里插入圖片描述

進行創建并獲取IP地址:
在這里插入圖片描述

注意域名解析,當然你也可以更改自己操作系統的hosts配置文件:
在這里插入圖片描述

接下來訪問之前寫過的接口,可以看到訪問成功:在這里插入圖片描述

編寫.gitlab-ci.yml文件

.gitlab-ci.yml文件定義了CI/CD流水線的任務,需要編寫一下幾個步驟來完成這個流水線的搭建:

  • 使用maven打包SpringBoot項目
  • 使用Docker將SpringBoot的jar包打成Docker鏡像
  • 將Docker鏡像推送到鏡像倉庫
  • 使用kubectl更新Kubernetes上的鏡像

.gitlab-ci.yml文件語法官方文檔地址:https://docs.gitlab.com/16.6/ee/ci/yaml/index.html

定義階段

階段(stages)定義了一組任務組(groups of jobs),同時它也約定了任務執行的順序。根據上面的描述,可以定義四個階段:

  • Package With Maven:使用maven打包SpringBoot項目
  • Build With Docker:使用Docker將SpringBoot的jar包打成Docker鏡像
  • Push Image To Repository:將Docker鏡像推送到鏡像倉庫
  • Deploy To Kubernetes:使用kubectl更新Kubernetes上的鏡像

對應.gitlab-ci.yml的代碼為:

stages:- Package With Maven- Build With Docker- Push Image To Repository- Deploy To Kubernetes

定義變量

我打算將鏡像的地址定義為一個變量,可以先來到鏡像倉庫看一下倉庫地址:
在這里插入圖片描述

.gitlab-ci.yml中定義變量的關鍵字為 variables ,定義兩個變量分別指向這兩個地址:

variables:IMAGE_REPOSITORY_ADDRESS: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/gitlab-cdciIMAGE_REPOSITORY_VPC_ADDRESS: registry-vpc.cn-shenzhen.aliyuncs.com/xiaohh-docker/gitlab-cdci

用maven打包SpringBoot項目

因為約定當中的流水線任務只在手動創建新tag的情況下才執行,那么需要用到流水線的一個內置變量 CI_COMMIT_TAG ,Gitlab內置變量的官方文檔:https://docs.gitlab.com/16.6/ee/ci/variables/predefined_variables.html,需要注意的是這個變量只有在Gitlab9以后才有哦,可以參考官方文檔:
在這里插入圖片描述

當然使用maven打包SpringBoot的命令很簡單,只有一條:

mvn clean package -Dmaven.test.skip

同時為了避免此任務執行完畢將構建好的jar包給刪除,需要心中一個cache字段,完整的yml代碼為:

package-maven:# 階段,對應定義階段當中的用Maven打包的配置內容stage: Package With Maven# 定義在只有手動創建新tag的時候才執行此程序rules:- if: $CI_COMMIT_TAG# 使用script腳本進行打包script:- mvn clean package -Dmaven.test.skip# 使用cache關鍵字讓Runner在執行完此階段的任務后不要刪除target文件當中的jar包cache:key: binaries-cachepaths:- target/*.jar

文件內容為:
在這里插入圖片描述

用Docker將項目打成容器鏡像

項目中的Dockerfile在docker目錄當中,同時需要在docker目錄當中有一個java目錄,且里面有一個gitlab-cicd.jar的jar包文件,如圖Dockerfile文件內容:
在這里插入圖片描述

接下來需要將target目錄下的gitlab-cicd.jar移動到docker/java目錄當中,相關命令:

# 下面命令不需要在服務器當中執行,將要被寫在.gitlab-ci.yml當中
mkdir docker/java
mv target/gitlab-cicd.jar docker/java
cd docker
# 使用之前定義的鏡像倉庫地址和Gitlab內置的Tag變量打成Docker包
docker build -t ${IMAGE_REPOSITORY_ADDRESS}:$CI_COMMIT_TAG .

然后為了避免執行此job之前會刪除target目錄,這個步驟也需要加上cache關鍵字。同時使用 artifacts 保存一下編譯的內容,完整的yml代碼為:

build-docker:stage: Build With Dockerrules:- if: $CI_COMMIT_TAGscript:- mkdir docker/java- mv target/gitlab-cicd.jar docker/java- cd docker- docker build -t ${IMAGE_REPOSITORY_ADDRESS}:$CI_COMMIT_TAG .artifacts:name: gitlab-cicd-$CI_COMMIT_TAGpaths:- dockercache:key: binaries-cachepaths:- target/*.jar

將鏡像推送到鏡像倉庫

鏡像已經在上一個步驟打包好了,接下來直接推送,推送完后為了節省空間可以將打包好的鏡像給刪除。完整的yml代碼為:

push-image:stage: Push Image To Repositoryrules:- if: $CI_COMMIT_TAGscript:- docker push ${IMAGE_REPOSITORY_ADDRESS}:$CI_COMMIT_TAG- docker rmi -f ${IMAGE_REPOSITORY_ADDRESS}:$CI_COMMIT_TAG

更新K8S的鏡像

上兩個步驟構建并推送了Docker鏡像,這個步驟直接將鏡像推送到Kubernetes即可,執行這行命令(??修改自己的命名空間、deployment、應用名字和鏡像):

kubectl set image deployment gitlab-cicd --namespace=gitlab-cicd gitlab-cdci=${IMAGE_REPOSITORY_VPC_ADDRESS}:$CI_COMMIT_TAG --record

完整的yml代碼為:

deploy-kubernetes:stage: Deploy To Kubernetesrules:- if: $CI_COMMIT_TAGscript:# 這里使用了阿里云的VPC網絡地址- kubectl set image deployment gitlab-cicd --namespace=gitlab-cicd gitlab-cdci=${IMAGE_REPOSITORY_VPC_ADDRESS}:$CI_COMMIT_TAG --record

測試自動化部署

之前的步驟部署了應用,也編寫了流水線,接下來就得測試自動化部署了。先來到Gitlab創建一個倉庫:
在這里插入圖片描述

點擊創建一個空倉庫:
在這里插入圖片描述

按照提示填寫內容之后點擊創建倉庫:
在這里插入圖片描述

創建完成后可以復制ssh的倉庫地址:
在這里插入圖片描述

在項目根目錄下執行以下命令初始化本地倉庫并推送代碼,過程簡單就不再過多贅述:

git init
git add --all
git commit -m 'Version 1.0.0'
git remote add origin 倉庫地址
git push origin main

執行結果如圖:
在這里插入圖片描述

代碼也成功提交至代碼倉庫:
在這里插入圖片描述

但是可以看到還沒有進行CI/CD,是因為所有的任務在 .gitlab-ci.yml 當中都被設置了“在手動創建新tag”的情況下才會被執行:
在這里插入圖片描述

執行下面命令創建新tag:

git tag -a v1.0.0 -m 'Version 1.0.0'
git push origin v1.0.0

執行完成之后可以看到tag被創建了,流水線也正在執行:
在這里插入圖片描述

來到 Build -> Pipelines 下,可以看到流水線執行成功:
在這里插入圖片描述

因為之前也是部署的 v1.0.0 的,看不到什么變化:
在這里插入圖片描述

所以現在創建一個新tag v1.1.0 再次觸發自動化構建:
在這里插入圖片描述

可以看到tag v1.1.0 構建成功:
在這里插入圖片描述

再次訪問部署可以看到部署成功:
在這里插入圖片描述

當然也可以手動運行流水線,在 Build -> Pipelines 下點擊 Run pipeline
在這里插入圖片描述

然后選擇對應的tag:
在這里插入圖片描述

然后點擊 Run pipeline
在這里插入圖片描述

等待所有流程執行完畢:
在這里插入圖片描述

再次訪問系統可以看到版本號又改為 v1.0.0 了:
在這里插入圖片描述
本篇文章直接給出了代碼,視頻教程當中會帶著你試試錯誤情況哦。視頻教程地址:https://www.bilibili.com/video/BV1Se411o766/

好了本篇文章就到這里!祝你們編碼愉快:)

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

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

相關文章

驗證碼的多種生成策略

&#x1f60a; 作者&#xff1a; 瓶蓋子io &#x1f496; 主頁&#xff1a; 瓶蓋子io-CSDN博客 第一種 a.導入依賴 <dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.10</ver…

【數據結構】字典樹(Trie樹)算法總結

知識概覽 Trie&#xff1a;高效地存儲和查找字符串集合的數據結構數字、漢字可以用二進制位來存 例題展示 題目鏈接 Trie字符串統計&#xff1a; https://www.acwing.com/problem/content/837/ 代碼 #include <cstdio>const int N 100010;int son[N][26], cnt[N],…

zxjy003- Spring Cloud后端工程搭建

1、創建 sprigboot 工程 guli-parent groupId &#xff1a; com.atguigu artifactId &#xff1a; guli-parent 2.刪除src目錄 3.配置pom.xml 修改版本為 &#xff1a;2.2.1.RELEASE<artifactId> 節點后面添加 pom類型 全部依賴&#xff0c;復制下面的即可&#xff0c…

素材創作平臺,解決企業素材供給問題

企業對于高質量素材的需求日益增長。無論是為了提升品牌形象&#xff0c;還是為了推動產品銷售&#xff0c;都需要大量的專業設計素材。然而&#xff0c;素材的獲取、設計和定制往往是一項耗時耗力的工作。這時&#xff0c;美攝科技素材創作平臺應運而生&#xff0c;為企業提供…

LeetCode [中等]矩陣置零

73. 矩陣置零 - 力扣&#xff08;LeetCode&#xff09; 暴力解法 用兩個標記數組分別記錄每一行和每一列是否有零出現。 遍歷該數組一次&#xff0c;如果某個元素為 0&#xff0c;那么就將該元素所在的行和列所對應標記數組的位置置為 true。再次遍歷該數組&#xff0c;用標…

從0到1,手把手帶你開發截圖工具ScreenCap------001實現基本的截圖功能

ScreenCap---Version&#xff1a;001 說明 從0到1&#xff0c;手把手帶你開發windows端的截屏軟件ScreenCap 當前版本&#xff1a;ScreenCap---001 支持全屏截圖 支持鼠標拖動截圖區域 支持拖拽截圖 支持保存全屏截圖 支持另存截圖到其他位置 GitHub 倉庫master下的Scr…

人工智能技術在數據治理中的一些思考

隨著企業信息化系統的快速建設&#xff0c;以及物聯網的規模化的應用&#xff0c;企業數據規模快速增長&#xff0c;與之同時企業數據的治理模式仍然以傳統的治理方式為主&#xff0c;ChatGPT等人工智能的崛起正深刻改變著數據治理的思路&#xff0c;如何將AI技術引入企業數據治…

C++新經典模板與泛型編程:用成員函數重載實現std::is_convertible

用成員函數重載實現is_convertible C標準庫中提供的可變參類模板std::is_convertible&#xff0c;這個類模板的主要能力是判斷能否從某個類型隱式地轉換到另一個類型&#xff0c;返回的是一個布爾值true或false。例如&#xff0c;一般的從int轉換成float或從float轉換成int&am…

使用Plex結合cpolar搭建本地私人媒體站并實現遠程訪問

文章目錄 1.前言2. Plex網站搭建2.1 Plex下載和安裝2.2 Plex網頁測試2.3 cpolar的安裝和注冊 3. 本地網頁發布3.1 Cpolar云端設置3.2 Cpolar本地設置 4. 公網訪問測試5. 結語 1.前言 用手機或者平板電腦看視頻&#xff0c;已經算是生活中稀松平常的場景了&#xff0c;特別是各…

劇本殺小程序搭建:打造線上劇本殺新體驗

劇本殺是一款以角色扮演為主的游戲&#xff0c;一度成為了年輕人的最喜愛的社交游戲。在劇本殺市場需求下&#xff0c;劇本殺規模也迅速上升。今年第一季度&#xff0c;劇本殺市場規模環比增長47%&#xff0c;市場整體消費水平逐漸呈上升趨勢。 隨著劇本殺的不斷發展&#xff…

echarts繪制一個環形圖2

其他echarts&#xff1a; echarts繪制一個環形圖 echarts繪制一個柱狀圖&#xff0c;柱狀折線圖 echarts繪制一個餅圖 效果&#xff1a; 組件代碼&#xff1a; <template><div class"wrapper"><div ref"doughnutChart2" id"dough…

ORACLE數據庫實驗總集 實驗六 SQL 語句應用

一、 實驗目的 &#xff08;1&#xff09; 掌握數據的插入&#xff08;INSERT&#xff09;、 修改&#xff08;UPDATE&#xff09; 和刪除&#xff08;DELETE&#xff09; 操作。 &#xff08;2&#xff09; 掌握不同類型的數據查詢&#xff08;SELECT&#xff09; 操作。 二、…

阿里滴滴之后,騰訊視頻也崩了!網友追問:下一個是誰?

繼滴滴“崩了”一夜后&#xff0c;剛過去不到一周時間&#xff0c;互聯網“崩了”連續劇又迎來了續集。 就在剛剛&#xff0c;也是晚間時分&#xff0c;網友曝出騰訊視頻崩了&#xff0c;不能追劇了。接著&#xff0c;騰訊視頻官方便現身回應&#xff0c;坐實了傳聞。 還是同…

JVM虛擬機:如何查看JVM初始和最終的參數?

本文重點 在前面的課程中&#xff0c;我們學習了如何查看當前程序所處于的xx參數&#xff0c;本文再介紹一種如何參看JVM的xx參數&#xff1f; 查看JVM的所有初始化參數 方式一&#xff1a;java -XX:PrintFlagsInitial 方式二&#xff1a;java -XX:PrintFlagsInitial -versio…

【自學篇】Python篇-第一天溫度轉換

1、規則 輸入 華氏度 轉換為 攝氏度 輸入 攝氏度 轉換為 華氏度 轉換公式&#xff1a; 華氏度 攝氏度 * 1.8 32 攝氏度 &#xff08;華氏度32 &#xff09;/1.8 2、python代碼 TempStr input() if TempStr[-1] in [F,f]:print("轉換后的溫度值&#xff1a;{:.2f}C&…

淺談Elasticsearch備份和恢復

Elasticsearch 備份和恢復功能 Elasticsearch 是一個分布式搜索和分析引擎&#xff0c;廣泛應用于各種場景&#xff0c;如日志分析、全文搜索和實時數據處理。在使用 Elasticsearch 時&#xff0c;數據的安全和可用性至關重要。本文將詳細講解 Elasticsearch 的備份和恢復功能…

Uncle Maker: (Time)Stamping Out The Competition in Ethereum

目錄 筆記后續的研究方向摘要引言貢獻攻擊的簡要概述 Uncle Maker: (Time)Stamping Out The Competition in Ethereum CCS 2023 筆記 本文對以太坊 1 的共識機制進行了攻擊&#xff0c;該機制允許礦工獲得比誠實同行更高的挖礦獎勵。這種名為“Uncle Maker”的攻擊操縱區塊時間…

mysql數據庫中int字段長度,即int(1)和int(10)的區別

1.起因 為什么想起來看這個問題&#xff0c;是最近有同事問mysql的init類型的字段長度的問題&#xff0c;他問int(1)和int(10)是什么意思&#xff0c;是字段長度越大&#xff0c;能存儲的數字越大么&#xff1f;咋一問&#xff0c;還有點懵&#xff0c;從慣性思維來看&#xf…

React 中虛擬DOM是什么,為什么需要它?

注意&#xff1a;本節主要講React中的虛擬DOM&#xff0c;但是虛擬DOM并不是React中特有的內容。 1. React 中虛擬 DOM是什么&#xff1f; 虛擬DOM是對真實DOM的描述&#xff0c;虛擬DOM是JS對象&#xff0c;實際上就是 JSX 通過 babel 轉換成 React.createElement()&#xff…

8.3 C++11對Unicode的支持

一、C11對Unicode的支持 在C98中&#xff0c;引入wchar_t對Unicode支持&#xff0c;但是后來由于不同平臺下wchar_t的寬度并不相同(8,16,32位)&#xff0c;導致可移植性受到影響。因此從C11開始引入了char16_t、char32_t以及原有的char&#xff0c;分別存儲utf16&#xff0c;u…