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/
好了本篇文章就到这里!祝你们编码愉快:)
相关文章:
Gitlab+GitlabRunner搭建CICD自动化流水线将应用部署上Kubernetes
文章目录 安装Gitlab服务器准备安装版本安装依赖和暴露端口安装Gitlab修改Gitlab配置文件访问Gitlab 安装Gitlab Runner服务器准备安装版本安装依赖安装Gitlab Runner安装打包工具安装docker安装java17安装maven 注册Gitlab Runner 搭建自动化部署准备SpringBoot项目添加一个Co…...
待做-待补充-每个节点做事,时间,以及与角度的关系
文章目录 纲领1.是否可以通过遍历一遍二叉树得到答案2.是否可以通过两颗子树相同问题的答案推导出树的答案(形式为递归)无论哪种思维模式,都需要思考:单独一个二叉树节点,它需要做什么事情?需要在什么时候做 后序判断问题是否和子树相关&…...
液态二氧化碳储存罐远程无线监测系统
二氧化碳强化石油开采技术,须先深入了解石油储层的地质特征和二氧化碳的作用机制。现场有8辆二氧化碳罐装车,每辆罐车上有4台液态二氧化碳储罐,每台罐的尾部都装有一台西门子S7-200 smart PLC。在注入二氧化碳的过程中,中控室S7-1…...
kafka学习笔记--安装部署、简单操作
本文内容来自尚硅谷B站公开教学视频,仅做个人总结、学习、复习使用,任何对此文章的引用,应当说明源出处为尚硅谷,不得用于商业用途。 如有侵权、联系速删 视频教程链接:【尚硅谷】Kafka3.x教程(从入门到调优…...
UE4 材质实现Glitch效果
材质实现Glitch效果 UE4 材质实现Glitch效果预览1预览2 UE4 材质实现Glitch效果 预览1 添加材质函数: MF_RandomNoise 添加材质: 预览2 添加材质函数MF_CustomPanner: 添加材质函数:MF_Glitch 材质添加: 下面用…...
oracle实验2023-12-8--触发器
第十四周实验 【例】功能要求:增加一新表XS_1,表结构和表XS相同,用来存放从XS表中删除的记录。 分析: 1、创建表 xs_1 SQL> create table xs_1 as select * from xs; Table created SQL> truncate table xs_1; Table truncated题目&a…...
【Python百宝箱】贝叶斯统计的魅力:从PyMC3到ArviZ,探索数据背后的不确定性
标题:预测未来趋势的利器:深入贝叶斯统计和概率编程的世界 前言 贝叶斯统计和概率编程是一种强大的分析方法,可以帮助我们处理不确定性、建立灵活的模型以及进行参数估计和推断。本文将介绍几个常用的Python库,包括PyMC3、ArviZ…...
Knowledge Graph知识图谱—8. Web Ontology Language (OWL)
8. Web Ontology Language (OWL) 在RDFs不可能实现: Property cardinalities, Functional properties, Class disjointness, we cannot produce contradictions, circumvent the Non Unique Naming Assumption, circumvent the Open World Assumption 8.1 OWL Tr…...
排序算法——冒泡排序
排序算法是计算机科学中最基本的概念之一。在众多排序算法中,冒泡排序因其实现简单而被广泛学习。尽管它不是最高效的排序方法,但对于理解基本的排序概念非常有用。本文将深入探讨冒泡排序的原理、实现、优缺点以及应用场景。 1. 冒泡排序原理 冒泡排序…...
边缘智能网关如何应对环境污染难题
随着我国工业化、城镇化的深入推进,包括大气污染在内的环境污染防治压力继续加大。为应对环境污染防治难题,佰马综合边缘计算、物联网、智能感知等技术,基于边缘智能网关打造环境污染实时监测、预警及智能干预方案,可应用于大气保…...
uniapp定时器的应用
1、初始化定时器 data(){return{timer: null, //定时器} } 2、定时器的使用 定时器分两种,setInterval和setTimeout。 二者的区别: setInterval函数会无限执行下去,除非调用clearInterval函数来停止它。setTimeout函数只执行一次&#x…...
Docker中安装Oracle10g和oracle增删改查
Docker中安装Oracle 10g 一、Docker中安装Oracle 10安装步骤二、连接数据库登录三 oracle数据库的增删改查及联表查询的相关操作oracle数据库,创建students数据表,创建100万条数据增删改查 一、Docker中安装Oracle 10安装步骤 Docker中安装Oracle 10g 1.下载镜像 docker pull …...
推荐算法:HNSW【推荐出与用户搜索的类似的/用户感兴趣的商品】
HNSW算法概述 HNSW(Hierarchical Navigable Small Word)算法算是目前推荐领域里面常用的ANN(Approximate Nearest Neighbor)算法了。其目的就是在极大量的候选集当中如何快速地找到一个query最近邻的k个元素。 要找到一个query的…...
C++ //例3.14 找出100~200间的全部素数。
C程序设计 (第三版) 谭浩强 例3.14 例3.14 找出100~200间的全部素数。 IDE工具:VS2010 Note: 使用不同的IDE工具可能有部分差异。 代码块 方法:使用函数的模块化设计 #include <iostream> #include <iomanip> #i…...
虚幻学习笔记11—C++结构体、枚举与蓝图的通信
一、前言 结构体的定义和枚举类似,枚举的定义有两种方式。区别是结构体必须以“F”开头命名,而枚举不用。 额外再讲了一下蓝图生成时暴露变量的方法。 二、实现 2.1、结构体 1、定义结构体 代码如下,注意这个定义的代码一定要在“UCLASS()”…...
【android开发-19】android中内容提供者contentProvider用法讲解
1,内容URI 在Android系统中,Content URI是一种用于唯一标识和访问应用程序中的数据的方法。它由Android系统提供,通过Content Provider来实现数据的共享和访问。 Content URI使用特定的格式来标识数据,通常以"content://&qu…...
浅谈排序——快速排序(最常用的排序)
快速排序(Quick Sort)是一种常见的排序算法,由英国计算机科学家东尼霍尔(Tony Hoare)在1960年发明。这是一种分治算法,基本思想是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所…...
Springboot项目实现简单的文件服务器,实现文件上传+图片及文件回显
文章目录 写在前面一、配置1、application.properties2、webMvc配置3、查看效果 二、文件上传 写在前面 平常工作中的项目,上传的文件一般都会传到对象存储云服务中。当接手一个小项目,如何自己动手搭建一个文件服务器,实现图片、文件的回显…...
5V低压步进电机驱动芯片GC6150,应用于摄像机,机器人 医疗器械等产品中。具有低噪声、低振动的特点
GC6150是双通道5V低压步进电机驱动器,具有低噪声、低振动的特点,特别适用于相机变焦对焦系统、万向架、摇头机等精度、低噪声STM控制系统,该芯片为每个通道集成了一个256微步的驱动器。通过SPI & T2C接口,客户可以方使地调整驱…...
3D Web轻量引擎HOOPS Communicator如何实现对大模型的渲染支持?
除了读取轻松外,HOOPS Communicator对超大模型的支持效果也非常好,它可以支持30GB的包含70万个零件和3.5亿个三角面的Catia装配模型! 那么它是如何来实现对大模型的支持呢? 我们将从以下几个方面与大家分享:最低帧率…...
Harness Engineering 的三个 Scaling 维度:统一框架下的技术架构深度解析
当我们谈论「Harness Engineering」时,究竟在讨论什么?这个看似简单的问题,却揭示了当前AI agent领域最核心的架构挑战。 术语混乱的根源:同一个词,三件完全不同的事 2026年第一季度,OpenAI、Cursor和Ant…...
从输入法到天气预测:一阶与高阶马尔科夫链的建模实战
1. 马尔科夫链:从输入法到天气预测的数学魔法 第一次听说马尔科夫链这个词时,我正盯着手机输入法发呆。当时在打"奥利奥"这个词,刚输入"ao"就自动联想出"奥利奥",而前一天我还在为打不出这个词抓耳…...
从Prompt到Context到Harness:AI工程的三次范式转移,第三次正在发生
2026年初,Anthropic 和 OpenAI 几乎同一周发了各自关于 Harness Engineering 的实践文章。加上两篇关于 Agent 记忆基础设施的学术论文,以及社区里关于三代工程范式演进的讨论,一个完整的图景正在浮现 三代工程范式各解决什么问题 2023到202…...
【VBA】【EXCEL】分类汇总
option explicit option base 1Sub 分类汇总()Dim ws0 As Worksheet, ws1 As WorksheetDim arr0 As Variant, arr1 As VariantDim lastRow As Long, i As Long, m As Long, cnt As LongDim acct As String, opp As String, key As String, pts() As StringDim amt As Double, t…...
终极实战指南:Godot PCK解包器深度解析与高效资源提取
终极实战指南:Godot PCK解包器深度解析与高效资源提取 【免费下载链接】godot-unpacker godot .pck unpacker 项目地址: https://gitcode.com/gh_mirrors/go/godot-unpacker 在游戏开发与逆向工程领域,Godot引擎的PCK文件格式一直是技术爱好者关注…...
智慧校园软件怎么选?手把手教你看懂核心功能
✅作者简介:合肥自友科技 📌核心产品:智慧校园平台(包括教工管理、学工管理、教务管理、考务管理、后勤管理、德育管理、资产管理、公寓管理、实习管理、就业管理、离校管理、科研平台、档案管理、学生平台等26个子平台) 。公司所有人员均有多…...
科技信息最前沿——TurboQuant:以极致压缩重新定义人工智能效率
谷歌TurboQuant技术突破:高效压缩AI内存需求谷歌TurboQuant技术通过创新的免训练压缩方法,有效解决了大语言模型面临的内存瓶颈问题。该技术采用两阶段压缩方案:PolarQuant极坐标量化和QJL误差修正,在不损失精度的前提下实现显著优…...
3种方案高效解决res-downloader配置难题:从故障诊断到场景落地
3种方案高效解决res-downloader配置难题:从故障诊断到场景落地 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 当…...
ICLR 2026 | 大模型当裁判也“翻车“?北大清华联合多校提出TrustJudge,让LLM评估更值得信赖
让 GPT-4 给两篇文章打分,A 拿了 4 分、B 拿了 3 分。按常理 A 应该比 B 好吧?但换成成对比较,同一个模型却说 "B 更好"。更离谱的情况也有——A > B > C > A 的"石头剪刀布"循环,连传递性都守不住。…...
告别重复劳动:用快马ai为ubuntu系统生成自动化运维效率工具
告别重复劳动:用快马AI为Ubuntu系统生成自动化运维效率工具 作为一名长期使用Ubuntu系统的开发者,我经常需要处理各种重复性的运维任务,比如查看日志、备份文件、监控系统资源等。这些工作虽然简单,但日复一日地手动操作不仅耗时…...
