文章目錄
- 安裝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/
好了本篇文章就到這里!祝你們編碼愉快:)