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:定义了部署的命令步骤:
docker stop $DOCKER_CONTAINER_NAME || true:尝试停止正在运行的同名容器。如果容器不存在,则忽略错误。docker rm $DOCKER_CONTAINER_NAME || true:删除同名容器,确保新的容器可以被启动。cd achun-gallery-app:进入项目目录。docker build -t $DOCKER_IMAGE .:基于当前目录的 Dockerfile 构建一个新的 Docker 镜像,名称为achun-gallery-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_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 容器化应用,并在服务器上启动。整个过程包含了项目的编译、打包、镜像构建与容器部署,自动化程度高且维护方便。
核心步骤:
- 构建阶段:利用 Maven 清理、编译并打包项目。
- 部署阶段:使用 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。由于这类作业可能存在的时长不足以被主动抓取…...
【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# 批量更改文件后缀名称
解决问题思路 解决固定文件夹下更改文件后缀名,采用轮询的方式, 流程如下: 获取当前文件名(带后缀的文件名)截取文件名称,去掉后缀另存为带更改后的后缀文件 注意:采用第三方插件࿰…...
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 框架ÿ…...
LeetCode:2398. 预算内的最多机器人数目 双指针+单调队列,时间复杂度O(n)
2398. 预算内的最多机器人数目 today 2398. 预算内的最多机器人数目 题目描述 你有 n 个机器人,给你两个下标从0开始的整数数组 chargeTimes 和 runningCosts ,两者长度都为 n 。第 i 个机器人充电时间为 chargeTimes[i] 单位时间,花费 ru…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
9-Oracle 23 ai Vector Search 特性 知识准备
很多小伙伴是不是参加了 免费认证课程(限时至2025/5/15) Oracle AI Vector Search 1Z0-184-25考试,都顺利拿到certified了没。 各行各业的AI 大模型的到来,传统的数据库中的SQL还能不能打,结构化和非结构的话数据如何和…...
用递归算法解锁「子集」问题 —— LeetCode 78题解析
文章目录 一、题目介绍二、递归思路详解:从决策树开始理解三、解法一:二叉决策树 DFS四、解法二:组合式回溯写法(推荐)五、解法对比 递归算法是编程中一种非常强大且常见的思想,它能够优雅地解决很多复杂的…...
【技巧】dify前端源代码修改第一弹-增加tab页
回到目录 【技巧】dify前端源代码修改第一弹-增加tab页 尝试修改dify的前端源代码,在知识库增加一个tab页"HELLO WORLD",完成后的效果如下 [gif01] 1. 前端代码进入调试模式 参考 【部署】win10的wsl环境下启动dify的web前端服务 启动调试…...
