当前位置: 首页 > news >正文

Gitlab runner的使用示例(二):Maven + Docker 自动化构建与部署

Gitlab runner的使用示例(二):Maven + Docker 自动化构建与部署

在本篇文章中,我们将详细解析一个典型的 GitLab CI/CD 配置文件(gitlab-ci.yml),该文件主要用于通过 Maven 构建 Java 应用,并使用 Docker 容器化部署。

配置文件整体长这样:

image: maven:3.8.4-openjdk-17stages:- build- deployvariables:DOCKER_IMAGE: "achun-gallery-image"DOCKER_CONTAINER_NAME: "achun-gallery-container"# 构建阶段:Maven 打包
build-job:stage: buildscript:- mvn clean install -DskipTests- cd achun-gallery-app- mvn clean package -DskipTeststags:- m5_serviceonly:- mainartifacts:paths:- achun-gallery-app/target/**# 部署阶段:使用 Docker 启动项目
deploy-job:stage: deployscript:- docker stop $DOCKER_CONTAINER_NAME || true- docker rm $DOCKER_CONTAINER_NAME || true- cd achun-gallery-app- docker build -t $DOCKER_IMAGE .- docker run -d -v /data/logs/:/data/logs -v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro --restart always --name $DOCKER_CONTAINER_NAME -p 9519:9519 $DOCKER_IMAGEtags:- m5_serviceonly:- maindependencies:- build-jobartifacts:paths:- achun-gallery-app/target/**

下面会逐步解释各个部分。

1. 基本镜像选择

image: maven:3.8.4-openjdk-17

在 GitLab CI/CD 中,image 用于指定 CI/CD 流水线运行时使用的基础镜像。这里我们选择的是 maven:3.8.4-openjdk-17,这是一个预装了 Maven 3.8.4 和 OpenJDK 17 的官方 Docker 镜像,适合构建基于 Java 的 Maven 项目。

解释:

  • Maven:负责项目的构建与管理,执行 mvn 命令。
  • OpenJDK 17:项目使用的 Java 版本,确保代码可以在此 JDK 上编译和运行。

2. 定义阶段(stages)

stages:- build- deploy

在 GitLab CI/CD 中,stages 定义了流水线的阶段。这个配置文件中包含两个阶段:

  • build:构建 Java 项目。
  • deploy:部署已经构建的项目。

流水线会按顺序依次执行这些阶段。

3. 定义全局变量

variables:DOCKER_IMAGE: "achun-gallery-image"DOCKER_CONTAINER_NAME: "achun-gallery-container"

variables 定义了 CI/CD 流水线中使用的全局变量。在这个配置文件中:

  • DOCKER_IMAGE:指定 Docker 镜像的名称为 achun-gallery-image
  • DOCKER_CONTAINER_NAME:指定 Docker 容器的名称为 achun-gallery-container

这些变量会在后续的 deploy 阶段使用,方便代码维护和复用。

4. 构建阶段:Maven 打包

build-job:stage: buildscript:- mvn clean install -DskipTests- cd achun-gallery-app- mvn clean package -DskipTeststags:- m5_serviceonly:- mainartifacts:paths:- achun-gallery-app/target/**

解释:

  • stage:指定该作业属于 build 阶段。
  • script:定义构建项目时执行的命令:
    • mvn clean install -DskipTests:清理项目、安装依赖并编译项目,跳过测试。
    • cd achun-gallery-app:进入子目录 achun-gallery-app,这是项目的主要代码所在目录。
    • mvn clean package -DskipTests:再次清理项目,并打包应用程序的可执行文件(如 .jar 文件),跳过测试。
  • tags:指定该作业运行在哪些 Runner 上,此处 m5_service 是 GitLab Runner 的标签,表明该作业将被分配到具备此标签的 Runner 上运行。
  • only:限制该作业仅在 main 分支上执行。
  • artifacts:指定构建产物的路径。在这里,它保存了 achun-gallery-app/target/ 目录下的所有文件,主要是打包后的 .jar 文件,供后续的 deploy 阶段使用。

Maven 命令:

  • mvn clean install:会下载依赖项并将应用编译为 .class 文件。
  • mvn package:创建最终的可执行 .jar 文件,用于部署。

5. 部署阶段:使用 Docker 启动项目

deploy-job:stage: deployscript:- docker stop $DOCKER_CONTAINER_NAME || true- docker rm $DOCKER_CONTAINER_NAME || true- cd achun-gallery-app- docker build -t $DOCKER_IMAGE .- docker run -d -v /data/logs/:/data/logs -v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro --restart always --name $DOCKER_CONTAINER_NAME -p 9519:9519 $DOCKER_IMAGEtags:- m5_serviceonly:- maindependencies:- build-jobartifacts:paths:- achun-gallery-app/target/**

解释:

  • stage:此作业属于 deploy 阶段。
  • script:定义了部署的命令步骤:
    1. docker stop $DOCKER_CONTAINER_NAME || true:尝试停止正在运行的同名容器。如果容器不存在,则忽略错误。
    2. docker rm $DOCKER_CONTAINER_NAME || true:删除同名容器,确保新的容器可以被启动。
    3. cd achun-gallery-app:进入项目目录。
    4. docker build -t $DOCKER_IMAGE .:基于当前目录的 Dockerfile 构建一个新的 Docker 镜像,名称为 achun-gallery-image
    5. docker run -d -v /data/logs/:/data/logs -v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro --restart always --name $DOCKER_CONTAINER_NAME -p 9519:9519 $DOCKER_IMAGE:运行一个新的 Docker 容器,指定容器的日志路径和时间设置,并将容器端口 9519 映射到主机的 9519 端口。

详细说明:

  • docker stop/rm:先停止并移除同名的现有容器,避免名称冲突。

  • docker build:使用当前目录中的 Dockerfile 构建新的 Docker 镜像。

  • docker run

    • -d:后台运行容器。
    • -v:挂载日志目录和时间设置,确保容器中的日志可以与主机同步,并保持主机的时区设置。
    • --restart always:保证 Docker 容器异常退出后自动重启。
    • -p 9519:9519:将容器的端口映射到主机上,允许外部访问应用。
  • tags:同样使用 m5_service 标签来指定 Runner。

  • only:限制部署阶段只在 main 分支上执行,确保代码已经被合并到主分支后才会进行生产环境的部署。

  • dependencies:定义作业的依赖关系,deploy-job 依赖于 build-job,确保部署是在构建成功后进行的。

  • artifacts:再一次定义打包产物的路径,以确保 Docker 部署时可以获取到正确的构建文件。

总结

这个 GitLab CI/CD 配置文件为 Java 项目定义了一个自动化的构建和部署流程。通过 Maven 进行代码编译和打包,再通过 Docker 容器化应用,并在服务器上启动。整个过程包含了项目的编译、打包、镜像构建与容器部署,自动化程度高且维护方便。

核心步骤:

  1. 构建阶段:利用 Maven 清理、编译并打包项目。
  2. 部署阶段:使用 Docker 镜像化应用并启动容器,映射日志和时间设置,确保应用的持久运行。

通过 GitLab CI/CD 自动化管道,我们可以确保项目的持续集成与交付(CI/CD),大大提升开发和运维效率。

参考链接

  • GitLab CI/CD 官方文档
  • Maven 官方文档
  • Docker 官方文档

在这里插入图片描述

相关文章:

Gitlab runner的使用示例(二):Maven + Docker 自动化构建与部署

Gitlab runner的使用示例(二):Maven Docker 自动化构建与部署 在本篇文章中,我们将详细解析一个典型的 GitLab CI/CD 配置文件(gitlab-ci.yml),该文件主要用于通过 Maven 构建 Java 应用&…...

QNX Hypervisor(十)Linux Guest IPC 二

上文还遗留了一个问题,就是在测试ipc的时候挂死了。相关原理我写在了另外一篇文章。 内存管理 所以导致挂死的问题就是因为没有进行地址映射,mmu无法转换。从kernel代码看,只有ram区域才会进行映射。我们的qvmconf文件也确实没有配置0xb8000000,只配置了pass。 pass loc …...

怎样把PPT上顽固的图标删了

例如: 解决: 首先打开下载好的PPT模板,然后在视图选项卡里面找到幻灯片母版。 进入幻灯片母版后,找到第一页母版页就会看到LOGO了,这时使用鼠标就可以选中删除啦。...

【论文阅读】Slim Fly: A Cost Effective Low-Diameter Network Topology 一种经济高效的小直径网络拓扑

文章目录 Slim Fly: A Cost Effective Low-Diameter Network Topology文章总结1. 摘要2. indroduction3. 主要工作 主要思想references Slim Fly: A Cost Effective Low-Diameter Network Topology Slim Fly:一种经济高效的小直径网络拓扑 SC’14 Maciej Besta 苏…...

Prometheus使用Pushgateway推送数据

Pushgateway简介 Prometheus 的 Pushgateway 是一个简单的 HTTP 服务器,它允许数据被推送到该服务器,而不是通过拉取的方式获取。它的存在是为了让临时和批处理作业能够将其指标暴露给 Prometheus。由于这类作业可能存在的时长不足以被主动抓取&#xf…...

【Oracle】调优与oracle最大连接数配置

博主介绍: 大家好,我是想成为Super的Yuperman,互联网宇宙厂经验,17年医疗健康行业的码拉松奔跑者,曾担任技术专家、架构师、研发总监负责和主导多个应用架构。 技术范围: 目前专注java体系,DDD&…...

Unity教程(十六)敌人攻击状态的实现

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程(零)Unity和VS的使用相关内容 Unity教程(一)开始学习状态机 Unity教程(二)角色移动的实现 Unity教程(三)角色跳跃的实现 Unity教程&…...

​图像超分辨率(ISR)​

图像超分辨率(Image Super-Resolution, ISR)是一种图像处理技术,旨在通过软件算法从低分辨率的图像中重建出高分辨率的图像。这种技术对于改善图像质量、增加细节清晰度等方面非常重要,特别是在图像放大、卫星成像、医学成像和视频…...

园区网基础组网保姆级(mstp,vrrp,irf,eth-trunk,route-policy,ospf,bgp,rbm,nat,mlag等等)

本文实验使用模拟器:H3C HCL 5.10.2版本 一、园区核心/接入架构1.1.三层架构1.2.二层架构二、园区核心 To 接入实践2.1.MSTP+VRRP派系2.1.1.MSTP+VRRP配置2.1.2.MSTP+VRRP验证2.2.IRF+Eth-Trunk派系2.2.1.IRF+Eth-Trunk配置2.3.两种派系的对比2.4.VXLAN结构三、园区核心/出口架…...

大数据技术原理与应用

第一章、大数据概述 1、大数据时代的特征,并结合生活实例谈谈带来的影响。 (一)特征 1、Volume 规模性:数据量大。 2、Velocity高速性:处理速度快。数据的生成和响应快 摩尔定律:每两年,数…...

《黑神话悟空》开发框架与战斗系统解析

本文主要围绕《黑神话悟空》的开发框架与战斗系统解析展开 主要内容 《黑神话悟空》采用的技术栈 《黑神话悟空》战斗系统的实现方式 四种攻击模式 连招系统的创建 如何实现高扩展性的战斗系统 包括角色属性系统、技能配置文件和逻辑节点的抽象等关键技术点 版权声明 本…...

网络资源模板--Android Studio 通讯录App

目录 一、项目演示 二、项目测试环境 三、项目详情 四、完整的项目源码 一、项目演示 网络资源模板--基于Android studio 通讯录 二、项目测试环境 三、项目详情 首页 MainActivity 类是一个 Android 地址簿应用的核心部分,负责管理联系人列表的显示、搜索和添…...

Spring 出现 No qualifying bean of type ‘com.xxx‘ available 解决方法

目录 1. 问题所示2. 原理分析3. 解决方法4. 彩蛋4.1 bug彩蛋4.2 完整Demo4.3 补充Springboot1. 问题所示 出现如下问题: 19:58:23.476 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean o…...

C# 批量更改文件后缀名称

解决问题思路 解决固定文件夹下更改文件后缀名,采用轮询的方式, 流程如下: 获取当前文件名(带后缀的文件名)截取文件名称,去掉后缀另存为带更改后的后缀文件 注意:采用第三方插件&#xff0…...

KIC算法介绍及pyrosetta示例代码

Kinetic Loop Closure (KIC) 是 Rosetta 中一种重要的环区(loop region)建模算法,主要用于解决蛋白质中的柔性区域(特别是环区)的重构问题。环区是蛋白质中非常灵活的部分,通常结构不确定。KIC 算法采用基于运动学的解决方案,通过设置特定的几何约束,能够在给定的两端锚…...

【论文串烧】多媒体推荐中的模态平衡学习 | 音视频语音识别中丢失导致的模态偏差对丢失视频帧鲁棒性的影响

文章目录 一、多媒体推荐中的模态平衡学习1.1 研究背景1.2 解决问题1.3 实施方案1.4 文章摘要1.5 文章重点1.6 文章图示图 1:不同模型变体在 AmazonClothing 数据集上的初步研究图 2:CKD模型架构的说明图 3:在 Amazon-Clothing 数据集上训练过…...

【C语言二级考试】循环结构设计

C语言二级考试——循环结构程序设计 五.循环结构程序设计 1.for循环结构 2.while和do-while循环结构 3.continue语句和break语句 4.循环的嵌套 知识点参考【C语言】循环-CSDN博客 文章目录 1.for循环2.while和do-while循环结构3.continue语句和break语句4.循环的嵌套 1.for循环…...

诗文发布模板(python代码打造键盘录入诗文自动排版,MarkDown源码文本)

python最好用的f-string,少量代码打造键盘录入诗文自动排版。 (笔记模板由python脚本于2024年09月19日 19:11:50创建,本篇笔记适合喜欢写诗的pythoner的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free&am…...

GO主流开源框架

GO主流开源框架 Go 语言有着丰富的开源框架生态,涵盖了多种应用场景,如 Web 开发、数据库操作、微服务、日志处理等。以下是一些常见的 Go 框架及其典型作用场景: 1. Web 框架 Gin: 作用:一个高性能的轻量级 Web 框架&#xff…...

LeetCode:2398. 预算内的最多机器人数目 双指针+单调队列,时间复杂度O(n)

2398. 预算内的最多机器人数目 today 2398. 预算内的最多机器人数目 题目描述 你有 n 个机器人,给你两个下标从0开始的整数数组 chargeTimes 和 runningCosts ,两者长度都为 n 。第 i 个机器人充电时间为 chargeTimes[i] 单位时间,花费 ru…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

算法刷题-回溯

今天给大家分享的还是一道关于dfs回溯的问题,对于这类问题大家还是要多刷和总结,总体难度还是偏大。 对于回溯问题有几个关键点: 1.首先对于这类回溯可以节点可以随机选择的问题,要做mian函数中循环调用dfs(i&#x…...