使用Gitlab CI/CD功能在本地部署 Spring Boot 项目

前提条件:
1.Docker安装Gitlab,地址:https://www.cnblogs.com/sanduzxcvbnm/p/13814730.html
2.Docker安装Gitlab-runner,地址:https://www.cnblogs.com/sanduzxcvbnm/p/13815594.html

在Gitlab上创建项目

1.新建项目

2.选择springboot模板创建

3.创建项目

创建好项目后查看克隆的地址
我这边是根据前提条件来创建的,所以使用的克隆地址中会有端口号

4.添加本机ssh秘钥到项目设置中

5.本机克隆该项目到本机
使用git地址克隆

使用http地址克隆

项目修改

1.修改项目中自带的Dockerfile文件,具体内容如下

# 原先的内容
FROM maven:3-jdk-8-alpine
WORKDIR /usr/src/app
COPY . /usr/src/app
RUN mvn package
ENV PORT 5000
EXPOSE $PORT
CMD [ "sh", "-c", "mvn -Dserver.port=${PORT} spring-boot:run" ]

# 修改后的内容
FROM openjdk:8-jdk-alpine
VOLUME /tmp
COPY  /target/demo-0.0.1-SNAPSHOT.jar app.jar # 正常情况下target前面没有/,但是在这里需要有,不能省略,否则会报错。
ENV PORT 5000
EXPOSE $PORT
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Dserver.port=${PORT}","-jar","/app.jar"]

按正常情况下target前面没有/的报错信息

target前面加上/后可以正确执行

2.创建.gitlab-ci.yml文件,具体内容如下

image: docker:latest  #1
variables:  #2
  DOCKER_DRIVER: overlay2
  # DOCKER_HOST: tcp://192.168.0.253:2375  # docker host,本地可不写,
  TAG: root/hello-spring:v0.1  # 生成的镜像名称
cache:  #3
  paths:
    - .m2/repository
services:  #4
  - docker:dind
stages:  #5
  - package
  - deploy
maven-package:  #6
  image: maven:3.5-jdk-8-alpine
  tags:
    - maven # 使用的gitlab-runner需要有这个标签
  stage: package
  script:
    - mvn clean package -Dmaven.test.skip=true
  artifacts:
    paths:
      - target/*.jar
build-master:  #7
  tags:
    - docker # 使用的gitlab-runner需要有这个标签
  stage: deploy
  script:
    - docker build -t $TAG . # 根据Dockerfile文件构建镜像
    - docker rm -f test || true # 删除测试容器
    - docker run -d --name test -p 5000:5000 $TAG # 运行容器,$TAG是开头设置的变量,表示的是镜像
  only:
    - master

说明:

  • 1:需要用到的镜像
  • 2:必须配置的一些环境变量。如果本地可不配置 DOCKER_HOST。作用是生成的docker镜像是在本机上还是在其他主机上
  • 3:配置缓存,配置后,maven 下载的依赖可以被缓存起来,下次不需要重复去下载了。
  • 4:配置需要用到的额外的服务。docker:dind,这个貌似是用于在 docker 中运行 docker 的一种东西,在项目的构建中需要。
  • 5:stages,这是 Gitlab CI 中的概念,Stages 表示构建阶段,就是一些按序执行的流程,具体执行是依赖于 Jobs 的。在CI/CD流水线中可以看到
  • 6:定义的 Jobs 之一,用于构建 jar 包。内部又引入 maven 镜像来处理,负责执行 package 这一流程。script 为具体执行的脚本。
  • 7:定义的 Jobs 之一,用于构建 Docker 镜像。负责执行 deploy 这一流程。具体执行 build 和 run。only 节点表示只监控 master 分支。


所有的配置工作都已经完成了,接下来 Git 执行 commit&push,自动构建就开始了。
整个项目的目录结构如下:

开始构建

在本机上修改上述俩文件后提交到Gitlab上,此时自动构建就开始了。
我这边已经操作过了,直接看结果

第一阶段的第一个jobs,可以查看到编译生成好的jar文件

其中生成的这个jar文件可以下载下来,下载下来一个artifacts.zip文件,解压缩后有个target文件夹,这个文件夹下也就是编译生成的项目jar文件

这个功能在.gitlab-ci.yml配置文件中的体现

第二阶段的第一个jobs

这个功能在.gitlab-ci.yml配置文件中的体现

再次提交内容,又会开始自动构建,生成的docker镜像会发生变化,运行的容器也发生变化.
根据这个情况,可以在提交代码的时候修改编译生成的docker镜像版本

# 第一次构建
~ # docker image ls
REPOSITORY                              TAG                  IMAGE ID            CREATED             SIZE
root/hello-spring                       v0.1                 35937b860369        8 minutes ago       121MB

~ # docker ps                                                                                                                  
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS                 PORTS                                                               NAMES
b8ab41b5bbc7        root/hello-spring:v0.1        "java -Djava.securit…"   6 minutes ago       Up 6 minutes           0.0.0.0:5000->5000/tcp 

# 第二次构建
~ # docker image ls
REPOSITORY                              TAG                  IMAGE ID            CREATED              SIZE
root/hello-spring                       v0.1                 661f48a8d64c        About a minute ago   121MB

~ # docker ps
CONTAINER ID        IMAGE                         COMMAND                  CREATED              STATUS                 PORTS                                                               NAMES
ab619c680e77        root/hello-spring:v0.1        "java -Djava.securit…"   About a minute ago   Up About a minute      0.0.0.0:5000->5000/tcp 

继续延伸:
1.每次提交代码之前都得手动修改docker镜像版本,有没有其他更简便的办法
2.最后阶段的最后jobs可以把生成的docker镜像推动到镜像仓库,比如Harbor,Nexus等
3.跟k8s进行配置关联
4.多阶段,多jobs构建

posted @   哈喽哈喽111111  阅读(4090)  评论(3编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥
历史上的今天:
2018-10-15 在Windows下配置svn服务端钩子程序
2018-10-15 解决SVN UUID客户端和服务器不一致的问题
2018-10-15 批量删除.svn目录
2018-10-15 Flask-SQLAlchemy中解决数据库连接1366报错
2018-10-15 查询mysql版本
2018-10-15 mysql修改用户密码的方法及命令
2018-10-15 备份/还原mysql数据库
点击右上角即可分享
微信分享提示