前文提到了怎么部署一个gitlab平台以及配套的runner,下面就应用这套来进行一个项目实战,部署官方的SpringBoot示例

首先新建一个仓库,然后选择模板,选择SpringBoot模板

image-20241104221741954

image-20241104221756520

设置一些基本信息,可以随便填,仓库选择私人或者内部

然后进入仓库页面确定创建成功

接下来需要用idea拉取代码,有两种方式,如果安装gitlab插件的话,可以使用访问令牌登录之后,直接选择有权限的仓库直接拉取到本地

image-20241104221925411

如果没装gitlab插件,也可以在项目界面直接点击克隆链接,在idea输入也可

image-20241104222058401

idea这边创建新项目选择来自版本控制

image-20241104222135014

这里就会遇到前文提到的为什么要在docker设置里写好ip,如果没写ip这里点复制git地址的时候,ip那里会是一串代码(docker镜像id),不过如果按照我的教程走的就应该不会遇到了

如果提示需要登录,那就输入root账号和密码,如果提示输入邮箱和用户名,这俩可以随便填

ok在输入一些信息之后,代码应该已经克隆到本地了

这个代码在本地可以直接跑,输入localhost:8080即可

如果要使用CICD来跑的话,还需要更改一些设置

首先打开项目里的pom.xml,记录下文件名

image-20241104222513860

然后修改Dockerfile文件,输入以下内容

1
2
3
4
5
6
7
8
9
10
11
12
#基础镜像
FROM openjdk:8
#作者
MAINTAINER name
# 设置工作目录
WORKDIR /app
# 复制编译后的 Spring Boot 可执行 Jar 文件到容器中其中demo-0.0.1.jar是package生产的具体名字是pom.xml决定
COPY target/demo-0.0.1.jar /app/
# 暴露 Spring Boot 应用程序的端口号
EXPOSE 8080
# 设置容器启动时运行的命令
CMD ["java", "-jar", "demo-0.0.1.jar"]

只需要把jar的名字改成自己的

最后修改一个叫做.gitlab-ci.yml的文件,内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
workflow:
rules:
- if: '$CI_PIPELINE_SOURCE == "web"'
# 这行的意义在于关闭推送的自动集成,仅手动启动流水线,方便后面了解操作,如果想要每次推送新代码都自动构建,可以把上面三行全删掉

stages: # 定义构建阶段
# - build # 构建阶段
- package # 打包阶段
- deploy # 部署阶段

variables: # 定义变量
DOMAIN: "sp-api" # 定义域名变量
PORT: "8080" # 定义端口变量
IMAGE_NAME: "sp:latest" # 定义镜像名称变量
MAVEN_IMAGE: "maven:3.8.4-jdk-11" # 定义 Maven 镜像变量

cache: # 配置缓存
key: "$CI_COMMIT_REF_NAME" # 缓存键
paths: # 缓存路径
- /root/.m2 # Maven 缓存路径
# build: # 构建阶段
# stage: build # 设置阶段
# image: $MAVEN_IMAGE # 使用 Maven 镜像
# script: # 执行脚本
# - echo "项目开始构建......" # 开始构建阶段
# - mvn clean compile -DskipTests=true -Dmaven.javadoc.skip=true # 编译项目代码并跳过测试和 Javadoc 生成
# - echo "跳过测试......" # 打印测试跳过消息
# - echo "跳过文档生成......" # 打印 Javadoc 生成跳过消息
# - echo "构建完成......"

package: # 打包阶段
stage: package # 设置阶段
image: $MAVEN_IMAGE # 使用 Maven 镜像
script: # 执行脚本
- echo "开始打包阶段......" # 开始打包阶段
- echo "打包中......" # 打印打包项目的消息
- mvn clean package -DskipTests=true -Dmaven.javadoc.skip=true # 打包项目
artifacts: # 配置构建产物
paths: # 产物路径
- target/*.jar # 将打包的 JAR 文件作为构件发布

deploy: # 部署阶段
stage: deploy # 设置阶段为部署阶段
script: # 执行脚本
- echo "开始部署阶段......" # 开始部署阶段
# - apk add --no-cache mpg123 #安装 mpg123
# - apk add --no-cache curl # 安装 curl
- docker stop $DOMAIN || true # 停止同名容器,如果不存在则忽略错误
- docker rm $DOMAIN || true # 删除同名容器,如果不存在则忽略错误
- docker rmi $IMAGE_NAME || true # 删除旧版镜像,如果不存在则忽略错误
- echo "开始构建 Docker 镜像文件......"
- docker build -t $IMAGE_NAME . # 构建 Docker 镜像
- echo "正在启动 Docker 容器......"
- docker run -d -p $PORT:8080 --name $DOMAIN $IMAGE_NAME # 运行 Docker 容器

弄完之后,直接点击idea的提交并推送,将代码推送至自己的远程仓库

这时候再回到gitlab的仓库界面,在该仓库的左侧点击构建->流水线,然后点击右侧的New pipeline,选择master分支,不用填东西,直接运行流水线,开始等

在作业界面可以观察每个步骤的进度,并查看日志(注:在deploy阶段会拉取docker镜像,所以需要有网络环境,自己准备好)

如果不出意外,两个任务都全绿,说明项目已经启动了,这时候再打开ip:8080,就会看到如下界面,说明部署成功

image-20241104223313569

这样的话,就有了一套自己的代码远程仓库+持续集成持续部署平台,写完代码简单一推就可以等着看在服务器运行的结果了

测试完我发现jdk的镜像不会保存在本地,导致每次新建流水线都需要重新拉镜像,所以在有科学环境的时候应该提前把jdk的镜像拉到本地,这样每次新建流水线就直接用这个镜像来构建就可以了

1
docker pull openjdk:8

SpringBoot项目如何写不在本文的讨论范围内,后端项目如何编写移步黑马程序员

一般的项目管理的话,每个人都要有自己的账号,root一般不用,这个平台可以支持多人注册账号,如果有团队协作的任务,需要每人都注册不同的账号,方便管理

一般情况下,一个多人协作项目的流程是这样的

  1. 组长新建项目,并push基本代码
  2. 参加的开发人员使用自己的账号拉取master分支代码,然后checkout一个专属自己的分支来开发(严禁直接开发master分支)
  3. 开发人员可以在本地自测部分功能,代码随时push到自己的远程分支
  4. 待功能开发完成之后,发起合并请求,审核人选择组长的账号(不然就得root来审核了)
  5. 组长进行codereview,确认无误之后将代码合入master分支,master分支自动触发流水线,开始打包并部署
  6. 部署完成,查看合入代码的运行情况以及和旧代码是否存在冲突,有问题随时回滚