GitLab CI/CD 持续集成/部署 SpringBoot 项目

一、GitLab CI/CD 介绍

GitLab CI/CD(Continuous Integration/Continuous Deployment)是 GitLab 提供的一种持续集成和持续部署的解决方案。它可以自动化软件的构建、测试和部署过程,以便开发者更快地、更频繁地发布可靠的产品。

整体过程如下图所示:

首先需要在目标机器上部署 Runner 服务,并注册到 gitLab 中,然后在项目中编写 .gitlab-ci.yml 文件,并执行流水线规则,当开发人员提交代码到远程仓库时,根据 .gitlab-ci.yml 文件配置信息,通知 Runner 执行相关脚本等 ,其中会涉及到几个核心特征如下:

  • Pipeline:一系列按照特定顺序执行的作业。这些作业可以被分配到不同的阶段,每个阶段都会按照定义的顺序依次执行。如果一个阶段中的所有作业成功完成,那么就会执行下一个阶段。

  • Jobs and Stages :构成 pipeline 的基本单元,每个作业都包含一系列的脚本命令。阶段则是用来组织作业的方式,它允许你控制作业的执行顺序。

  • Runners :执行作业的服务器。Runner 可以在各种环境中安装和使用,包括 Linux, Windows, Docker, Kubernetes 等。

  • Artifacts :由作业生成的文件,可以在作业结束后保留下来。你可以在之后的作业中使用这些 artifacts,或者直接从 GitLab 下载。

  • Environment and Deployment :GitLab CI/CD 允许定义多个环境,例如测试环境、预生产环境和生产环境,然后在这些环境中部署你的应用。

  • .gitlab-ci.yml :GitLab CI/CD 的配置文件,定义了 pipeline 中的所有作业和阶段。

下面通过GitLab CI/CD 持续集成/部署 SpringBoot 项目以演示整个的使用过程。

其中 SpringBoot 项目通过 docker 运行并采用 docker-compose 管理,因此需要保证服务器端环境已经部署好了 docker 和 docker-compose ,由于是 java 项目,jdk 也要事先准备完成。

二、环境部署

2.1 GitLab 安装

关于 GitLab 的部署可以参考下面这篇文章:

使用 docker-compose 搭建私服 Gitlab

2.2 创建 SpringBoot 项目

这里先创建一个 SpringBoot 项目,并编写好测试接口:

java 复制代码
@RestController
@RequestMapping("/test")
public class TestController {

    @GetMapping("/t1")
    public String t1(){
        return "this is server >>> t1 ";
    }

}

由于采用 docker 运行,所以在项目根目录创建 Dockerfile 文件,内容如下:

shell 复制代码
FROM java:8
MAINTAINER bxc
WORKDIR /app
ADD target/test-project-0.0.1-SNAPSHOT.jar /app/app.jar
CMD ["java", "-jar", "app.jar","--spring.profiles.active=pro"]

在 gitlab 上创建项目 test-project :

将刚刚创建好的 SpringBoot 项目 push 到 test-project 中:

2.2 Runner 部署安装:

Runner 可以部署在目标机器上,也就是最终运行服务的机器上,也可以是单独的机器通过 ssh 控制目标机器部署服务。

安装 Runner :

shell 复制代码
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh" | sudo bash
shell 复制代码
yum install gitlab-runner

2.3 注册 Runner

首先到 GitLab test_project 项目下设置下的 CI/CD 下:

找到 Runners 点击展开:


将上面红框中的数据记录下来,等下注册时需要使用。

再次回到部署 Runner 的服务器中,执行下面指令:

shell 复制代码
gitlab-runner register

按照提示的步骤输入上述相关信息:

  • GitLab instance URL :GitLab 服务器的 URL,上面图片中的第二点。
  • registration token :用于注册 Runner 的令牌,上面图片中的第三点。
  • description : Runner 的描述,用于在 GitLab UI 中识别你的 Runner。
  • tags :用于帮助你组织和选择 Runner。当你在 .gitlab-ci.yml 文件中定义作业时,可以指定需要哪些标签的 Runner 来执行这个作业,这里我的 tags 为:runner。
  • optional maintenance note :可选,主要用于记录有关 Runner 的额外信息,比如配置详情、负责维护的人、最后一次更新或维护的日期等。
  • Enter an executor :决定了 Runner 如何执行 CI/CD 作业。GitLab Runner 支持多种 Executor,包括 shell, docker, ssh, virtualbox 等,我这里选择 shell 的形式。

操作完后可以到 gitlab 上刷新页面查看是否注册成功:

2.4 部署 Maven

由于是基于 Maven 管理的 SpringBoot 依赖,因此需要在 Rnner 的机器上部署 Maven:

下载 maven 包 :

https://maven.apache.org/download.cgi

将下载的安装包上传至服务器中,这里我是 /opt/maven 下

解压安装包:

shell 复制代码
tar -zxvf apache-maven-3.9.5-bin.tar.gz

在 conf/settings.xml 增加阿里镜像源:

xml 复制代码
<mirror>
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <mirrorOf>central</mirrorOf>
</mirror>

将 maven 命令添加到环境变量中:

shell 复制代码
vi /etc/profile

追加以下内容:

shell 复制代码
export MAVEN_HOME=/opt/maven/apache-maven-3.9.5
export PATH=$MAVEN_HOME/bin:$PATH

刷新配置

shell 复制代码
source /etc/profile

测试查看maven版本

shell 复制代码
mvn -v

三、测试 Runner 是否正常

在 SpringBoot 项目根目录创建 .gitlab-ci.yml 文件,先测试下打印 hello world,内容如下:

yml 复制代码
stages:
  - deploy

deploy-job:
  tags:
    - runner
  stage: deploy
  script:
    - echo "hello world"

提交代码至远程仓库:

shell 复制代码
git add .
git commit -m 'ci'
git push

到 gitlab 中刷新查看:

这里绿色的对号表示已经执行成功了 .gitlab-ci.yml 中的定义,可以点击进去查看:

点击 deploy-job 可以查看执行结果:

四、CI/CD 持续集成/部署 SpringBoot 项目

由于是采用 docker-compose 管理运行 SpringBoot 项目,这里在根目录创建 docker-compose.yml ,内容如下:

yml 复制代码
version: '2.0'

services:
  test-project:
    restart: always
    image: test-project:1.0
    container_name: test-project
    ports:
      - "8080:8080"
    networks:
      - test
networks:  
  test:

修改 .gitlab-ci.yml 文件,增加打包部署的脚本:

yml 复制代码
stages:
  - deploy

deploy:
  tags:
    - runner
  stage: deploy
  script:
    - pwd
    - mvn clean package
    - docker-compose down
    - docker build -t test-project:1.0  .
    - docker-compose up -d

提交至远程仓库:

到 gitlab 中查看:


点击可以看到运行的日志:

如果在打包镜像的时候报下面错误:

Couldn't connect to Docker daemon at http+docker://localhost - is it running?

在安装 Runner 的时候会默认创建一个 gitlab-runner 用户,该用户需要有操作 docker 的权限 :

为 gitlab-runner 用户授权:

shell 复制代码
sudo usermod -aG docker gitlab-runner

重启 docker:

shell 复制代码
sudo systemctl restart docker

然后再重新运行流水线。

流水线运行结束后到机器上docker ps 查看是否有 test-project 容器:

容器已经启动了,可以通过浏览器访问测试接口:

shell 复制代码
http://ip:8080/test/t1

成功访问!

下面再创建一个测试接口 t2 :

java 复制代码
@RestController
@RequestMapping("/test")
public class TestController {

    @GetMapping("/t1")
    public String t1(){
        return "this is server >>> t1 ";
    }

    @GetMapping("/t2")
    public String t2(){
        return "this is server >>> t2 ";
    }

}

提交代码到远程仓库:

等待流水线构建成功:

访问 t2 测试接口:

shell 复制代码
http://ip:8080/test/t2

成功访问到 t2 测试接口。

相关推荐
凤山老林4 小时前
Spring Boot 集成 Redis Stream 做可靠消息队列:持久化、消费组重组与流式处理实战
spring boot·redis·后端
.Hypocritical.5 小时前
SpringBoot+Vue 前后端分离项目部署到云服务器
服务器·vue.js·spring boot
空空dream6 小时前
04 | 用 Jenkins 打通 CI自动构建镜像并推送到本地 Harbor
运维·ci/cd·jenkins
云和数据.ChenGuang6 小时前
用 Claude Code 重构遗留系统:从评估到落地的完整指南
java·人工智能·spring boot·后端·重构·springai
豆角焖肉6 小时前
SpringBoot 集成腾讯 AI 人脸识别
人工智能·spring boot·后端·人脸识别·腾讯 ai·base64 图片
十年Java程序媛7 小时前
Java String、StringBuilder、StringBuffer 底层原理|字符串拼接性能与线程安全
java·开发语言·spring boot·安全·面试
她的男孩7 小时前
升级 Spring Boot 4 后流程起不来、登录却报缺租户:Forge Admin 补上 applicationTaskExecutor 与旧 Sa-Tok
spring boot·安全·工作流引擎
AIGC小尼7 小时前
本地 AI 漫剧流水线模型缓存与特征向量持久化:IPAdapter 预编码、特征池复用与内存池管理实战
人工智能·spring boot·缓存·预编码算法·comfyui·ai漫剧
IT研究室8 小时前
最新计算机毕业设计选题推荐-基于spring boot的幼儿园管理系统-网站-文档指导-Java-springboot
java·spring boot·课程设计
威哥爱编程8 小时前
【AI全栈12-10】Spring Boot 用多模态做商品图审核 / 发票识别
java·spring boot·后端