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

news2024/11/23 1:13:08

介绍

本文件主要介绍如何将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 "结束脚本"

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 "结束脚本"

在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"]

.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

验证

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1164901.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker Tomcat 搭建文件服务器

本文基于openwrt上进行。 步骤 1: 安装 Docker 如果尚未安装Docker&#xff0c;首先需要安装Docker。根据你的操作系统&#xff0c;参考Docker官方文档来完成安装, 这里不做详细介绍。 步骤 2: 拉去docker Tomcat镜像 进入openwrt管理界面&#xff0c;docker选项中 拉取最新…

《算法设计与分析》 蛮力法实验报告一

1.&#xff08;洛谷 P1008&#xff09;将 1,2...9 共 9 个数分成三组,分别组成三个三位数,且使这三个三位数构成 1:2:3 的比例,试求出所有满足条件的三个三位数。 输入格式&#xff1a; 无 输出格式&#xff1a; 若干行&#xff0c;每行 3 个数字。按照每行第 1 个数字升序…

Run, Don‘t Walk: Chasing Higher FLOPS for Faster Neural Networks(CVPR2023)

文章目录 AbstractIntroduction过去工作存在的不足我们的工作主要贡献&#xff08;待参考&#xff09; Related workCNNViT, MLP, and variants Design of PConv and FasterNetPreliminaryPartial convolution as a basic operatorPConv followed by PWConvFasterNet as a gene…

【下载器】NDM和IDM介绍(含安装包和教程)

1 IDM&#xff08;增强型下载管理器&#xff09; 1.1 IDM介绍 官网&#xff1a;Internet Download Manager (IDM) 优缺点&#xff1a; 高速下载&#xff1a; IDM通过多线程下载和分段下载技术&#xff0c;能够显著提高下载速度&#xff0c;从而节省用户的时间。暂停和恢复功…

关于网络编程的3个问题

一、TCP 和 UDP 可以同时绑定相同的端口吗&#xff1f; 答案&#xff1a;可以的 在数据链路层中&#xff0c;通过 MAC 地址来寻找局域网中的主机。在网络层中&#xff0c;通过 IP 地址来寻找网络中互连的主机或路由器。在传输层中&#xff0c;需要通过端口进行寻址&#xff0…

【DP】最长上升公共子序列

一.题目来源 272. 最长公共上升子序列 - AcWing题库 二.简要思路 这道题易知是最长上升子序列&#xff08;LIS&#xff09;和最长公共子序列&#xff08;LCS&#xff09;的综合应用。我们可以先求最长公共子序列&#xff0c;然后再内循环最长上升子序列即可&#xff0c;直接看…

【ES专题】ElasticSearch搜索进阶

目录 前言阅读导航前置知识特别提醒笔记正文一、分词器详解1.1 基本概念1.2 分词发生的时期1.3 分词器的组成1.3.1 切词器&#xff1a;Tokenizer1.3.2 词项过滤器&#xff1a;Token Filter1.3.3 字符过滤器&#xff1a;Character Filter 1.4 倒排索引的数据结构 <font color…

《基于先验未知盲反卷积技术的包络谱重复瞬态的循环平稳性提取》阅读笔记及代码整理

论文阅读笔记及代码整理 《Extracting cyclo-stationarity of repetitive transients from envelope spectrum based on prior-unknown blind deconvolution technique》 代码有优化整理过&#xff0c;需要请下载&#xff1a;https://mbd.pub/o/bread/ZZaTl5ht 贡献&#xff1…

文件如何变成下载链接?

文件如何变成下载链接&#xff1f;有时候工作需要&#xff0c;要把一些文档&#xff08;比如Word&#xff0c;Excel&#xff0c;PPT&#xff0c;PDF等&#xff09;转成下载链接&#xff0c;作为公众号文章的附件&#xff0c;给粉丝们下载。 把文件转成下载链接&#xff0c;有几…

vue生命周期总结

包含页面的生命周期以及路由的生命周期 页面内&#xff1a; <script> export default {name: "",data() {return {value: "路由页面",};},// 组件不具有此钩子beforeRouteEnter(to, from, next) {console.log("beforeRouteEnter",this);/…

IntelliJ IDEA 2023 最新版如何试用?IntelliJ IDEA 2023最新版试用方法及验证ja-netfilter配置成功提示

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

Langchain-Chatchat项目:4.1-P-Tuning v2实现过程

常见参数高效微调方法(Parameter-Efficient Fine-Tuning&#xff0c;PEFT)有哪些呢&#xff1f;主要是Prompt系列和LoRA系列。本文主要介绍P-Tuning v2微调方法。如下所示&#xff1a; Prompt系列比如&#xff0c;Prefix Tuning(2021.01-Stanford)、Prompt Tuning(2021.09-Goo…

OpenGL_Learn04

我这边并不是教程&#xff0c;只是学习记录&#xff0c;方便后面回顾&#xff0c;代码均是100%可以运行成功的。 1. 渐变三角形 #include <glad/glad.h> #include <GLFW/glfw3.h>#include <iostream> #include <cmath>void framebuffer_size_callba…

科学计数法 [极客大挑战 2019]BuyFlag1

打开题目 注意中说&#xff0c;我们需要买flag&#xff0c;首先必须是cuit的学生&#xff0c;其次必须输对正确的密码 查看源代码得到 代码审计 首先&#xff0c;检查是否存在名为 password 的POST请求。 如果 password 存在&#xff0c;将其存储在变量 $password 中。 然后…

你没有见过的 git log 风格

背景 git大家都不陌生&#xff0c;git log 也是大家经常用的指令&#xff0c;今天分享三种 git log的美化格式&#xff0c;大家看看哪种更易读。 git log -15 --graph --decorate --oneline 带有 pretty 格式的git log 风格 log --color --graph --prettyformat:‘%Cred%h%C…

【音视频 | Ogg】RFC3533 :Ogg封装格式版本 0(The Ogg Encapsulation Format Version 0)

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

Vue3入门指南:零基础小白也能轻松理解的学习笔记

文章目录 创建项目开发环境项目目录模板语法属性绑定条件渲染列表渲染事件处理内联事件处理器方法事件处理器&#xff08;常用&#xff09; 事件参数获取 event 事件事件传参 事件修饰符阻止默认事件阻止事件冒泡 数组变化侦测变更方法替换一个数组 计算属性class 绑定单对象绑…

汽车标定技术(一):XCP概述

目录 1.汽车标定概述 2.XCP协议由来及版本介绍 3.XCP技术通览 3.1 XCP上下机通信模型 3.2 XCP指令集 3.2.1 XCP帧结构定义 3.2.2 标准指令集 3.2.3 标定指令集 3.2.4 页切换指令集 3.2.5 数据采集指令集 3.2.6 刷写指令集 3.3 ECU描述文件(A2L)概述 3.3.1 标定上位…

无限上下文,多级内存管理!突破ChatGPT等大语言模型上下文限制

目前&#xff0c;ChatGPT、Llama 2、文心一言等主流大语言模型&#xff0c;因技术架构的问题上下文输入一直受到限制&#xff0c;即便是Claude 最多只支持10万token输入&#xff0c;这对于解读上百页报告、书籍、论文来说非常不方便。 为了解决这一难题&#xff0c;加州伯克利…

物联网AI MicroPython传感器学习 之 QMC5883指南针罗盘传感器

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 一、产品简介 QMC5883是一款表面贴装的集成了信号处理电路的三轴磁性传感器&#xff0c;应用场景主要包括罗盘、导航、无人机、机器人和手持设备等一些高精度的场合。 引脚定义 VCC&#xff1a;3V3&#…