Gitlab+GitlabRunner搭建CICD自动化流水线将应用部署上Kubernetes

news2024/11/28 10:48:51

文章目录

  • 安装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 firewalld

sudo 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-cicd
  name: gitlab-cicd
  namespace: gitlab-cicd
spec:
  replicas: 1
  selector:
    matchLabels:
      app: gitlab-cicd
  template:
    metadata:
      labels:
        app: gitlab-cicd
    spec:
      containers:
      # 设置一些环境变量
      - env:
      	# JVM调优参数,设置UTF-8编码字符集和使用G1垃圾回收器
        - name: JAVA_OPTION
          value: "-Dfile.encoding=UTF-8 -XX:+UseG1GC"
        # 调整一下内存大小
        - name: XMX
          value: "2g"
        - name: XMS
          value: "2g"
        - name: XMN
          value: "1g"
        image: registry-vpc.cn-shenzhen.aliyuncs.com/xiaohh-docker/gitlab-cdci:v1.0.0
        # 存活探针
        livenessProbe:
          httpGet:
            path: /actuator/health
            port: 8080
            scheme: HTTP
          initialDelaySeconds: 30
          periodSeconds: 10
        name: gitlab-cdci
        ports:
        - containerPort: 8080
          protocol: TCP
        # 资源限制,最多使用2核心CPU和4G内存
        resources:
          limits:
            cpu: 1000m
            memory: 4Gi
          requests:
            cpu: 1000m
            memory: 4Gi
      # 因为镜像仓库是私有的,所以带上拉取镜像的Secret
      imagePullSecrets:
      - 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-cdci
  IMAGE_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-cache
    paths:
      - 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 Docker
  rules:
    - if: $CI_COMMIT_TAG
  script:
    - 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_TAG
    paths:
      - docker
  cache:
    key: binaries-cache
    paths:
      - target/*.jar

将镜像推送到镜像仓库

镜像已经在上一个步骤打包好了,接下来直接推送,推送完后为了节省空间可以将打包好的镜像给删除。完整的yml代码为:

push-image:
  stage: Push Image To Repository
  rules:
    - if: $CI_COMMIT_TAG
  script:
    - 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 Kubernetes
  rules:
    - if: $CI_COMMIT_TAG
  script:
  	# 这里使用了阿里云的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.coloradmin.cn/o/1295791.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华媒舍:引擎霸屏推广,10个技巧帮助你登上霸者!

下面我们就向您介绍引擎霸屏推广&#xff0c;及其10个技巧&#xff0c;这种技巧将帮助你在市场上获得不菲的成绩。 引擎霸屏推广引擎霸屏推广是一种营销策略&#xff0c;希望通过规模性推广产品&#xff0c;帮助品牌在顾客脑中占主导地位。这是一种依靠检索引擎等途径&#xf…

总线(什么是南北桥?您都用过哪些总线?)

什么是总线&#xff1f; 计算机系统中的总线&#xff08;Bus&#xff09;是指计算机设备和设备之间传输信息的公共数据通道&#xff0c;是连接计算机硬件系统内多种设备的通信线路&#xff0c;它的一个重要特征是由总线上的所有设备共享&#xff0c;因此可以将计算机系统内的多…

嵌入版python作为便携计算器(安装及配置ipython)

今天用别的电脑调试C&#xff0c;需要计算反三角函数时发现没有趁手工具&#xff0c;忽然想用python作为便携计算器放在U盘&#xff0c;遂想到嵌入版python 懒得自己配可以直接下载&#xff0c;使用方法见第4节 1&#xff0c;下载embeddable python&#xff08;嵌入版python&…

[mysql]linux安装mysql5.7

之前安装的时候遇到了很多问题&#xff0c;浪费了一些时间。整理出这份教程&#xff0c;照着做基本一遍过。 这是安装包: 链接&#xff1a;https://pan.baidu.com/s/1gBuQBjA4R5qRYZKPKN3uXw?pwd1nuz 1.下载安装包&#xff0c;上传到linux。我这里就放到downloads目录下面…

循环单向链表与约瑟夫问题

循环链表介绍 先不急着看约瑟夫问题是什么&#xff0c;先了解循环链表的结构&#xff0c;那什么是循环链表&#xff1f; 循环&#xff0c;顾名思义&#xff0c;从链表中第一个节点出发&#xff0c;还会遇到第一个节点&#xff0c;形成循环的一环。也就是说链表中最后一个节点…

项目实战之RabbitMQ冗余双写架构

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;啥技术都喜欢捣鼓捣鼓&#xff0c;喜欢分享技术、经验、生活。 &#x1f60e;人生感悟&#xff1a;尝尽人生百味&#xff0c;方知世间冷暖。 &#x1f4d6;所属专栏&#xff1a;项…

12.6每日一题(备战蓝桥杯程序的控制结构)

12.6每日一题&#xff08;备战蓝桥杯程序的控制结构&#xff09; 题目 1638: 【入门】判断正负数或零题目描述输入输出样例输入样例输出来源/分类 题解 1638: 【入门】判断正负数或零题目 1348: 【入门】求绝对值题目描述输入输出样例输入样例输出来源/分类 题解 1348: 【入门】…

【教学类-35-05】17号的学号字帖(A4竖版1份)

作品展示&#xff1a; 背景需求&#xff1a; 大四班17号男孩目前无法自主数学数字。他表示自己能够认识数字&#xff0c;但不会写。 保育老师说&#xff1a;我曾经教过他&#xff0c;抓着手示范的。但是他记不住。家里估计也不练习的。年龄还没到&#xff0c;下学期再看看能不…

SpringBoot项目访问resources下的静态资源

1.新建一个配置文件夹&#xff0c;放配置类 2.编辑 WebMvcConfig.java package com.southwind.configuration;import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import or…

期末速成数据库极简版【查询】(2)

目录 select数据查询----表 【1】筛选列 【2】where简单查询 【3】top-n/distinct/排序的查询 【4】常用内置函数 常用日期函数 常用的字符串函数 【5】模糊查询 【6】表数据操作——增/删/改 插入 更新 删除 【7】数据汇总 聚合 分类 ​ &#x1f642;&#…

2.6 A 的 LU 分解

一、A LU 线性代数很多关键的概念实际上就是矩阵的分解&#xff08;factorization&#xff09;。原始矩阵 A A A 变成两个或三个特殊矩阵的乘积。第一个分解&#xff0c;实际上也是最重要的分解&#xff0c;来自消元法。因子 L L L 和 U U U 都是三角形矩阵&#xff0c;分…

自动化测试:PO模式详解!

PO&#xff08;Page Object&#xff09;模式是一种在自动化测试中常用的设计模式&#xff0c;将页面的每个元素封装成一个对象&#xff0c;通过操作对象来进行页面的交互。 概括来说就是&#xff0c;每个页面都有对应的PO类&#xff0c;PO类中包含了页面的元素定位和操作方法。…

ArkTS语言难吗?鸿蒙指南

HarmonyOS的开发语言是ArkTS、JS(JavaScript)。 ArkTS简介 ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript&#xff08;简称TS&#xff09;生态基础上做了进一步扩展&#xff0c;继承了TS的所有特性&#xff0c;是TS的超集。因此&#xff0c;在学习…

c语言-动态内存管理

文章目录 一、为什么会有动态内存管理二、申请内存函数1、malloc2、free3、calloc4、realloc 三、常见的动态内存的错误四、练习 一、为什么会有动态内存管理 1.我们一般的开辟空间方式&#xff1a; int a 0;//申请4个字节空间 int arr[10] { 0 };//申请40个字节空间2.这样…

如何运用gpt改写出高质量的文章 (1)

大家好&#xff0c;今天来聊聊如何运用gpt改写出高质量的文章 (1)&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 如何运用GPT改写出高质量的文章 一、引言 随着人工智能技术的飞速发展&#xff0c;自然…

QT 重定向qdebug输出到自绘界面

因为在嵌入式中调试qt需要查看输出信息,特意写了一个类用户便捷查看qdebug信息 界面如下: 提供了开始,停止,保存,清空,退出功能,具体代码下文给出 文件如下 #ifndef QDEBUGREDIRECT_H #define QDEBUGREDIRECT_H /**qdebug 重定向类 定向到界面控件*李吉磊 2023.12.7* */#in…

vue2中使用jsplumb完成流程图

前言 之前的几个demo都是在vue3中写的,虽然可以直接拿去复用。 但是根据有些看客反馈,想用一个vue2版本的,毕竟很多人开发功能的时间都不是特别富裕。大多时候还是用现成的demo更好一些。 这里我就写一个简易版本的demo,可以实现绘制,并且删除连接线和节点等功能,篇幅也不大…

麻雀1号开发板开箱

麻雀1号是上海睿赛德电子科技有限公司全新推出的一款高性价比音频Wi-Fi开发板&#xff0c;内置RT-Thread&#xff0c;主打 Wi-Fi、音频和摄像头拍照功能&#xff0c;配合丰富的组件及例程&#xff0c;可降低多媒体应用的开发门槛。 开发板介绍 正面&#xff1a; 背面&#x…

手搓图片滑动验证码_JavaScript进阶

手搓图片滑动验证码 背景代码效果图展示网站 背景 在做前端项目开发的时候&#xff0c;少不了登录注册部分&#xff0c;既然有登录注册就少不了机器人验证&#xff0c;验证的方法有很多种&#xff0c;比如短信验证码、邮箱验证码、图片滑动、图片验证码等。 由于鄙人在开发中…

docker安装与详细配置redis

docker安装redis 连接虚拟机 vagrant up //启动虚拟机 vagrant ssh //连接虚拟机进入root用户 su root输入密码&#xff1a;和账户名一样 vagrant 下载redis 直接下载redis镜像,下载redis最新镜像 docker pull redis下载的都是DockerHub中默认的官方镜像 创建文件目…