【GitLab CI/CD、SpringBoot、Docker】GitLab CI/CD 部署SpringBoot应用,部署方式Docker

介绍

本文件主要介绍如何将SpringBoot应用使用Docker方式部署,并用Gitlab CI/CD进行构建和部署。

环境准备

  1. 已安装Gitlab仓库
  2. 已安装Gitlab Runner,并已注册到Gitlab和已实现基础的CI/CD使用
  3. 创建Docker Hub仓库,教程中使用的是阿里云的Docker Hub仓库
  4. Gitlab Runner所在服务器和部署应用的服务器都已安装好Docker,并成功登录上创建好的Docker Hub仓库
  5. Gitlab Runner所在服务器与部署应用的服务器之间已实现免登陆访问
  6. 能成功访问的SpringBoot应用

第1,2点可参考文章GitLab CI/CD 应用

第3,4点可参考文章 Docker之镜像上传(阿里云镜像仓库)使用Dockerfile创建镜像并运行容器

第5点可参考文章 服务器间免登陆访问

Gitlab Runner服务器配置脚本

进入目录/home/gitlab-runner,在该目录下新增两个脚本

pre-docker-start.sh脚本内容

bash 复制代码
#!/bin/bash
echo "开始检查是否存在运行中的容器 $1 ..."
count=$(docker ps | grep $1 | wc -l)
echo "运行中的容器数量: $count"
if [[ $count -gt 0 ]];then
  docker stop $1
fi
count1=$(docker ps -a | grep $1 | wc -l)
echo "已停止的容器数量: $count1"
if [[ $count1 -gt 0 ]];then
  docker rm $1
fi
echo "结束脚本"

after-docker-start.sh脚本内容

bash 复制代码
#!/bin/bash
echo "开始检查是否存在运行中的容器 $1 ..."
count=$(docker ps | grep $1 | wc -l)
echo "运行中的容器数量: $count"
if [[ $count -gt 0 ]];then
  echo "$1 启动成功"
else
  echo "$1 启动失败"
fi
echo "结束脚本"

在SpringBoot项目的根目录中新增Dockerfile和.gitlab-ci.yml文件

Dockerfile文件内容,推荐文章 使用Dockerfile创建镜像并运行容器,详细语法介绍可查看 官方文档-参考手册

typescript 复制代码
FROM openjdk:8-jre

MAINTAINER gitlab gitlab@test.com
ENV LANG en_US.utf8
ENV LC_ALL C.UTF-8
# 挂载目录
VOLUME /home/gitlab-demo
# 时区设置
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/Shanghai" > /etc/timezone
# 创建目录
RUN mkdir -p /home/gitlab-demo
# 指定路径
WORKDIR /home/gitlab-demo
EXPOSE 18000
COPY ./target/gitlab-demo-1.0-SNAPSHOT.jar app.jar
ENV SPRING_PROFILES_ACTIVE="dev" EXTRA_OPTS=""
ENTRYPOINT ["/bin/sh", "-c", "java ${EXTRA_OPTS} -Dspring.profiles.active=${SPRING_PROFILES_ACTIVE} -jar app.jar"]

.gitlab-ci.yml文件内容,详细语法介绍可查看 官方文档-CI/CD YAML 语法参考

yml 复制代码
variables:
  APP_NAME: gitlab-demo
  VERSION: 0.0.1
  PORT: 18000
stages:
  - build
  - deploy

build:
  stage: build
  tags:
    - build
  rules:
    - if: $CI_COMMIT_BRANCH == "dev"
      variables:
        DOCKER_PREFIX: gitlab-dev
    - if: $CI_COMMIT_BRANCH == "test"
      variables:
        DOCKER_PREFIX: gitlab-test
    - if: $CI_COMMIT_BRANCH == "main"
      variables:
        DOCKER_PREFIX: gitlab-prod
  script:
    - echo "==================before docker build ================"
    - echo "variables = {DOCKER_PREFIX = ${DOCKER_PREFIX}}"
    # - docker images | grep uwell-gateway | awk '{print $3}' | xargs docker rmi
    - mvn clean install -DskipTests
    - docker build -t ${APP_NAME}:${VERSION} ./
    - docker tag ${APP_NAME}:${VERSION} registry.cn-hangzhou.aliyuncs.com/${DOCKER_PREFIX}/${APP_NAME}:${VERSION}
    - docker push registry.cn-hangzhou.aliyuncs.com/${DOCKER_PREFIX}/${APP_NAME}:${VERSION}
    - docker rmi ${APP_NAME}:${VERSION}

deploy:
  stage: deploy
  tags:
    - deploy
  rules:
    - if: $CI_COMMIT_BRANCH == "dev"
      variables:
        DOCKER_PREFIX: gitlab-dev
        SERVER_PATH: 开发环境IP
        SPRING_PROFILES_ACTIVE: dev
    - if: $CI_COMMIT_BRANCH == "test"
      variables:
        DOCKER_PREFIX: gitlab-test
        SERVER_PATH: 测试环境IP
        SPRING_PROFILES_ACTIVE: test
  script:
    - echo "==================before docker deploy ================"
    - echo "variables = {DOCKER_PREFIX = ${DOCKER_PREFIX}, SERVER_PATH = ${SERVER_PATH}, SPRING_PROFILES_ACTIVE = ${SPRING_PROFILES_ACTIVE}}"
    - ssh root@${SERVER_PATH} "docker pull registry.cn-hangzhou.aliyuncs.com/${DOCKER_PREFIX}/${APP_NAME}:${VERSION}"
    - ssh root@${SERVER_PATH} 'bash -s' < /home/gitlab-runner/pre-docker-start.sh $APP_NAME
    - ssh root@${SERVER_PATH} "docker run -d -p ${PORT}:${PORT} -e SPRING_PROFILES_ACTIVE=${SPRING_PROFILES_ACTIVE} --name=${APP_NAME} registry.cn-hangzhou.aliyuncs.com/${DOCKER_PREFIX}/${APP_NAME}:${VERSION}"
    - ssh root@${SERVER_PATH} 'bash -s' < /home/gitlab-runner/after-docker-start.sh $APP_NAME

验证

提交代码后,打开Gitlab的web页面,找到CI/CD的任务执行记录

每个阶段都执行成功后,查看部署应用的服务器,看应用是否成功部署

相关推荐
绘梨衣5479 小时前
Docker+FastAPI+MySQL 项目部署报错汇总
mysql·docker·fastapi
HackTorjan9 小时前
深度神经网络的反向传播与梯度优化原理
人工智能·spring boot·神经网络·机器学习·dnn
百年੭ ᐕ)੭*⁾⁾12 小时前
docker使用neo4j
docker·容器·neo4j
春风有信14 小时前
【2026.05.01】Windows10安装Docker Desktop 4.71.0.0步骤及问题解决
运维·docker·容器
lisanmengmeng18 小时前
Gitlab搭建
gitlab
sthnyph18 小时前
docker compose安装redis
redis·docker·容器
W.A委员会19 小时前
Docker基本使用流程
运维·docker·容器
直奔標竿19 小时前
Java开发者AI转型第二十五课!Spring AI 个人知识库实战(四)——RAG来源追溯落地,拒绝AI幻觉
java·开发语言·人工智能·spring boot·后端·spring
GuokLiu20 小时前
260502-Clawith-Docker安装过程
运维·docker·容器·claw
敖正炀20 小时前
WebFlux 深度:Reactor 线程模型、背压与错误处理
spring boot