【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 [email protected]
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的任务执行记录

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

相关推荐
sauTCc6 小时前
Docker初探
docker
c无序6 小时前
【Docker-7】Docker是什么+Docker版本+Docker架构+Docker生态
docker·容器·架构
FixBug_Nick6 小时前
使用Docker安装及使用最新版本的Jenkins
docker·容器·jenkins
cg50176 小时前
Spring Boot 的配置文件
java·linux·spring boot
Zero_to_zero12348 小时前
解决docker的ubuntu系统中文乱码问题
ubuntu·docker·容器
@郭小茶8 小时前
docker-compose方式部署docker项目
运维·docker·容器
橘猫云计算机设计9 小时前
基于springboot的考研成绩查询系统(源码+lw+部署文档+讲解),源码可白嫖!
java·spring boot·后端·python·考研·django·毕业设计
有一只柴犬10 小时前
深入Spring AI:6大核心概念带你入门AI开发
spring boot·后端
向阳25610 小时前
SpringBoot+vue前后端分离整合sa-token(无cookie登录态 & 详细的登录流程)
java·vue.js·spring boot·后端·sa-token·springboot·登录流程
XiaoLeisj10 小时前
【MyBatis】深入解析 MyBatis XML 开发:增删改查操作和方法命名规范、@Param 重命名参数、XML 返回自增主键方法
xml·java·数据库·spring boot·sql·intellij-idea·mybatis