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

news2024/11/13 10:25:06

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

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

配置文件整体长这样:

image: maven:3.8.4-openjdk-17

stages:
  - build
  - deploy

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

# 构建阶段:Maven 打包
build-job:
  stage: build
  script:
    - mvn clean install -DskipTests
    - cd achun-gallery-app
    - mvn clean package -DskipTests
  tags:
    - m5_service
  only:
    - main
  artifacts:
    paths:
      - achun-gallery-app/target/**

# 部署阶段:使用 Docker 启动项目
deploy-job:
  stage: deploy
  script:
    - 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_IMAGE
  tags:
    - m5_service
  only:
    - main
  dependencies:
    - build-job
  artifacts:
    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: build
  script:
    - mvn clean install -DskipTests
    - cd achun-gallery-app
    - mvn clean package -DskipTests
  tags:
    - m5_service
  only:
    - main
  artifacts:
    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: deploy
  script:
    - 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_IMAGE
  tags:
    - m5_service
  only:
    - main
  dependencies:
    - build-job
  artifacts:
    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 官方文档

在这里插入图片描述

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

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

相关文章

电脑明明切换到了中文输入法,却无法打字出汉字?

现象: 自己电脑桌面右下角的电脑输入法,已经是中文了 解决办法: 按一下键盘最左边的【Caps Lock】键, 电脑左上角会出现如下弹窗, 调整为:CAPS LOCK OFF 即可(OFF时,才能打出汉字…

EW内网穿透详解!

EW EW又叫earthworm,是一套便捷式的网络穿透工具,具有socks5服务架构和端口转发两大核心功能,可以在复杂的网络环境下完成网络穿透。该工具能以"正向","反向","多级级联"等方式打通一条…

数据结构之线性表——LeetCode:67. 二进制求和,27. 移除元素,26. 删除有序数组中的重复项

67. 二进制求和 题目描述 67. 二进制求和 给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。 运行代码(javaC) class Solution {public String addBinary(String a, String b) {StringBuilder ansnew StringBuilder();int ca0;for(i…

数据库基础知识---------------------------(3)

MYSQL的索引 用于快速找出在某个列中有一特定值的行,不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行。按实现方式分为Hash索引和BTree索引 单列索引 普通索引 允许在定义索引的列中插入重复值和空值唯一索引 索引列的值必…

凸多边形(Convex Polygon)

凸多边形是边为直边且不向内折叠的特殊形状。连接凸多边形角的所有线都位于形状内部。凸多边形的角始终指向外部。所有边和角都相等的正多边形始终是凸多边形。 如果封闭形状具有曲面,则它不是凸多边形。在几何学中,多边形是具有直边和直角的平面二维形状…

Github 2024-09-20 Java开源项目日报Top10

根据Github Trendings的统计,今日(2024-09-20统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目10Kotlin项目1Python项目1JavaGuide - Java 程序员学习和面试指南 创建周期:2118 天开发语言:Java协议类型:Apache License 2.0Star…

二叉树(下)

目录 判断树是否相同 判断树是不是另一棵树的子树 二叉树翻转 判断平衡二叉树 二叉树层序遍历 这篇主要提供一些关于二叉树例题的讲解,如果对二叉树及其基本操作有疑问的可以转至: 二叉树(上)-CSDN博客二叉树(中&…

imo云办公室 Imo_DownLoadUI.php 任意文件下载漏洞复现

0x01 漏洞描述: imo云办公室由上海易睦网络科技有限公司于2007年创立,总部位于上海,imo云办公室管理运营企业即时通讯平台imo,包括对imo的在线支持,故障处理,客户服务等,对imo进行持续研发&…

第五届“马栏山杯”国际音视频算法大赛创新应用赛投票环节正式启动啦!

本次大赛分为专业奖和大众人气奖。专业奖由评委直接选出。大众人气奖经组委会初筛后选出62组优秀作品,由网络投票选出40名获奖选手! 快快戳链接🔗:https://h5.shuziwenbo.cn/challenge/vote?cxidedcrfv看看自己的作品有没有入选吧…

【AI视频】Runway Gen-2:图文生视频与运动模式详解

博客主页: [小ᶻZ࿆] 本文专栏: AI视频 | Runway 文章目录 💯前言💯仅图片生成视频方法一:通过Midjourney生成图片方法二:通过Runway预览生成图片注意点 💯图加文生成视频方式一:Midjourney…

Web端云剪辑解决方案,BS架构私有化部署,安全可控

传统视频制作流程繁琐、耗时,且对专业设备和软件的高度依赖,常常让企业望而却步,美摄科技凭借其强大的技术实力和创新能力,推出了面向企业用户的Web端云剪辑解决方案,为企业提供一站式、高效、便捷的视频生产平台。 B…

计算机考研408-计算机网络

【题33】下列选项中,不属于网络体系结构所描述的内容是() A.网络的层次 B.每一层使用的协议 C.协议的内部实现细节 D.每一层必须完成的功能 解析: 本题考查的是网络体系结构相关的概念。 图1描述了网络的7层架构以及每一层所要完成…

无人机 PX4 飞控 | EKF 使用传感器汇总与添加传感器方法

无人机 PX4 飞控 | EKF 使用传感器汇总与添加传感器方法 前言飞控自带基本传感器IMU磁力计气压计静态气压位置误差校正气压计偏压补偿 高度传感器测距仪使能测距仪融合有条件 可额外配置的传感器光流外部视觉系统 新传感器确定传感器类型和接口更新硬件定义添加驱动更新EKF 前言…

MySQL:事务的ACID特性隔离级别脏读、不可重复读、幻读、Next-Key锁——场景复现

目录 1、什么是事务 2、 事务的ACID特性 2.1 事务的隔离性 3、为什么要使用事务? 4、查看支持事务的存储引擎 5、使用事务 5.1 控制事务 5.1.1 开启事务 5.1.2 关闭事务 5.2 开始一个事务,执行修改后回滚 5.3 开始一个事务,执行修…

观后感:《中国数据库前世今生》——时代变迁中的数据库崛起

最近观看了《中国数据库前世今生》纪录片,这部影片详细梳理了从1980年代至今,中国数据库技术发展的跌宕历程。作为一名程序员,这部纪录片让我不禁感慨数据库技术的飞速进步,也让我更深入地理解了数据库技术在我们日常生活中的重要…

如何借助项目管理系统实现审批流程的自动化与标准化?

在快节奏的项目申报领域中,繁琐的审批流程往往成为制约项目推进速度的瓶颈。传统的人工审批方式不仅耗时耗力,还容易因人为因素导致审批效率低下、结果不一致等问题。为此,一款能够支持在线审批流程、实现审批自动化与标准化的项目管理系统显…

Canal+RabbitMQ数据同步环境配置

Canal 是阿里巴巴开发的开源工具,主要用于解析 MySQL 的 binlog 日志,从而实现数据同步。Canal 会模拟 MySQL 从库的协议,订阅主库的 binlog,从而获取数据库的变更信息。 将 Canal 解析到的 MySQL 数据库变更消息通过 RabbitMQ 分…

算法打卡 Day34(贪心算法)-分发饼干 + 摆动序列 + 最大子序和

文章目录 理论基础Leetcode 455-分发饼干题目描述解题思路类似题目2410-运动员和训练师的最大匹配数 Leetcode 376-摆动序列题目描述解题思路 Leetcode 53-最大子序和题目描述解题思路 理论基础 贪心算法的本质是选择每一阶段的局部最优,从而达到全局最优。 贪心算…

力扣718-最长重复子数组(Java详细题解)

题目链接:718. 最长重复子数组 - 力扣(LeetCode) 前情提要: 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 dp五部曲。 1.确定dp数组和i下标的含义。 2.确定递推公式。 3.dp初始化。 4.确定dp的遍历顺序。 5…

【CMake】使用CMake在Visual Studio内构建多文件夹工程

一、配置准备 打开VIsual Studio,载入写好的 C M a k e l i s t s . t x t CMakelists.txt CMakelists.txt,在项目中添加以下文件: 创建一个文件夹 f u n c s funcs funcs,里面放入 f u n c . h func.h func.h、 f u n c . c p …