• 【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脚本内容

    #!/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 "结束脚本"
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    after-docker-start.sh脚本内容

    #!/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 "结束脚本"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

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

    在这里插入图片描述

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

    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"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

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

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    验证

    提交代码后,打开Gitlab的web页面,找到CI/CD的任务执行记录
    在这里插入图片描述
    每个阶段都执行成功后,查看部署应用的服务器,看应用是否成功部署
    在这里插入图片描述

  • 相关阅读:
    《机器学习----简单的分类器》第二章、朴素贝叶斯,项目:使用特征值给语句打标签
    codeforces每日5题(均1700)-第五天
    【C++】stack&queue
    Springboot大学生健康报送系统的设计与实现毕业设计源码091005
    服装供应链:“多快好省”与“供应链”之间的博弈
    第四次考核 Jimmy 学徒考核 Linux安装软件 rnaseq上游分析
    Jmeter 循环和条件控制器
    Gin学习记录4——Controller和中间件
    apk组成和Android的打包流程
    9.缓存优化
  • 原文地址:https://blog.csdn.net/apple_csdn/article/details/134178362