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:定义了部署的命令步骤:
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 官方文档