搭建GItlab实现自动化部署Springboot项目(超详细)

提示:本例程中使用Docker搭建GItlab,Gitlab runner 通过编写CICD文件实现Springboot项目自动部署。

1、拉取GitLab镜像

命令:

bash 复制代码
docker pull gitlab/gitlab-ce

2、部署Gitlab:

我们通过docker搭建的gitlab部署项目的时候会出现一个问题:如果不指定external_url 会出现项目的地址是容器名的情况,而指定了external_url 对应的端口会出现gitlab无法访问的问题,这是因为当我们指定了端口就相当于修改了容器内的80端口为我们指定的端口。所以当我们需要指定端口的时候一定要注意:

1、指定external_url为xxxx则映射的时候需要将xxxx映射出来

2、不指定external_url端口则需要将80端口映射到宿主机的80,不能映射为别的端口否则会出现新的问题(项目的地址会出现不包含宿主机端口的情况),在ci过程中有bug,对应443、22端口映射到宿主机则没有限制。

3、对数据卷进行挂载的时候为了直观的查看日志我们可以直接将具体内容映射到vdata。

编写docker-compose.yml文件:

bash 复制代码
version: '3'
services:
  gitlab:
    image: gitlab/gitlab-ce:latest
    container_name: gitlab
    restart: always
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://192.168.75.159:8888' #宿主机ip和gitlab端口
    ports:
      - "8888:8888"  #因为我们设置了external_url 端口8888所以这里需要将8888映射出去,
      - "443:443"
      - "22:22"
    volumes:
      - ./gitlab/config:/etc/gitlab
      - ./gitlab/logs:/var/log/gitlab
      - ./gitlab/data:/var/opt/gitlab






concurrent = 1
check_interval = 0
shutdown_timeout = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = "vue-blog"
  url = "http://192.168.75.159:8888"
  id = 2
  token = "glrt-cCF71zezuytEkjyo5_rk"
  token_obtained_at = 2024-03-14T05:44:44Z
  token_expires_at = 0001-01-01T00:00:00Z
  executor = "docker"
  [runners.cache]
    MaxUploadedArchiveSize = 0
  [runners.docker]
    tls_verify = false
    image = "docker:19.03.12"
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/var/run/docker.sock:/var/run/docker.sock","/cache","/root/.m2:/root/.m2"]
    pull_policy = "if-not-present"
    shm_size = 0
    network_mtu = 0

运行docker-comspoe.yml:

bash 复制代码
docker compose up -d

gitlab的启动构建时间很长,并且要求电脑最好内存4G以上,如果构建失败可以查看具体日志:

构建成功的日志:

3、进入GItlab并查看

输入对应的地址进入到gitlab我们上文设置的external_url

历程中是:http://192.168.75.159:8888/users/sign_in

gilab的默认账号是:root

查看密码方式:

bash 复制代码
sudo docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password

登录进入:

如何设置中文:点击头像->Preferences->Language

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/09a2e64bbad94de7a9970306a51d7f5d.png

设置中文:当然我们也可以设置自己喜欢的主题和头像等

4、将项目上传到Gitlab:

我们需要将我们的项目上传到gitlab,这个过程首先我们需要在IDEA中登录gitlab:

settings中搜索git:

server是我们的gitlab地址,token可以点击生成会跳转到浏览器自动生成,当然也可以在:访问令牌中自己生成一个:
然后我们可以在命令行将代码推送到gitlab具体做法,但是我们需要先创建一个项目:

然后按照readme添加远程仓库,推送等,这里的步骤跟其他的gitee、gitalb一样不过多赘述了,最后我们查看我们推送完成的项目:

5、配置Gitlab-Runner

要实现CICD我们需要使用Gitlab-Runner来搭建项目需要的运行环境,我们这里使用Docker搭建GItlabRunner:

bash 复制代码
docker run -d --name gitlab-runner --restart always \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v ./gitlab-runner/vdata/gitlab-runner/config:/etc/gitlab-runner \
    gitlab/gitlab-runner:latest

-v /var/run/docker.sock:/var/run/docker.sock \这一行代码不能修改

运行完成之后:
一共两个容器gitlab、gitlab-runner

之后我们可以进行runner的配置,跟我们的项目关联起来:
这里我之前已经建立过Runner了,构建Runner的方式也很简单填写一些基本信息即可,记住要勾选住:运行未打标签的作业,然后回生成一个Runner的令牌:


创建完Runner后:
之后我们通过docker进入到gitlab-runner:

bash 复制代码
docker exec -it <容器id> /bin/bash

进入容器后运行命令gitlab-runner register即可,会让我们填写一些基本的信息,

name随便填写, url、token填写上文界面提供的执行器executer填写dokcer,因为我们使用docker构建

image填写一个dokcer发行版就行这里是:docker:19.03,12

最后我们填写完成之后退出容器,进入我们部署docker-runner的配置文件:

上文中我的地址是:./gitlab-runner/vdata/gitlab-runner/config,这个地址根据自己的配置来:会有一个配置文件:

config.toml

这里对配置文件讲解一下,我们使用docker构建项目volumes一定要对,另外我们CICD过程中需要指定maven缓存,如果不指定Maven缓存,会出现每次构建项目都需要下载依赖的情况,非常耗时,同时我们需要指定maven镜像仓库,加快第一次构建速度
上述文件的/root/.m2是容器内的maven仓库地址,我们将其映射到xxxxx/maven/ 这个路径按照需求自定义,同时我们要将settings.xml放到xxxxx/maven/ 下对于宿主机路径xxxxx/maven/ 我们在CICD的时候还需要使用最好写成跟容器内一致的地址,

settings.xml:

bash 复制代码
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                          https://maven.apache.org/xsd/settings-1.0.0.xsd">
    <mirrors>
        <mirror>
            <id>aliyunmaven</id>
            <mirrorOf>central</mirrorOf>
            <name>阿里云公共仓库</name>
            <url>https://maven.aliyun.com/repository/public</url>
        </mirror>
    </mirrors>

</settings>

到此设置Runner结束

6、配置编写Dockerfile、CICD文件

要实现自动化构建需要项目的镜像:
上面的三个阶段当然我们可以使用但是耗时长,我们可以直接使用maven的clean然后打包,在进行构建:

首先提供Dockerfile:

bash 复制代码
#基础镜像
FROM openjdk:8

#作者
MAINTAINER hery

# 设置工作目录
WORKDIR /app

# 复制编译后的 Spring Boot 可执行 Jar 文件到容器中其中blog-springboot-1.0.jar是package生产的具体名字是pom.xml决定
COPY target/blog-springboot-1.0.jar /app/

# 暴露 Spring Boot 应用程序的端口号
EXPOSE 8989

# 设置容器启动时运行的命令
CMD ["java", "-jar", "blog-springboot-1.0.jar"]

命令很详细具体不在解释

CICD文件:

bash 复制代码
stages:  # 定义构建阶段
  # - build  # 构建阶段
  - package  # 打包阶段
  - deploy  # 部署阶段

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

cache:  # 配置缓存
  key: "$CI_COMMIT_REF_NAME"  # 缓存键
  paths:  # 缓存路径
    - /home/桌面/gitlab-runner/vdata/gitlab-runner/maven  # 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    # 删除同名容器,如果不存在则忽略错误
    - echo "开始构建 Docker 镜像文件......"
    - docker build -t $IMAGE_NAME .  # 构建 Docker 镜像
    - echo "正在启动 Docker 容器......"
    - docker run -d -p $PORT:8989 --name $DOMAIN $IMAGE_NAME  # 运行 Docker 容器

接下来进行一次测试,我们在IDEA中进行项目的修改然后推送:

可以看见正在构建:

可以正常访问:

相关推荐
杨荧5 分钟前
【JAVA毕业设计】基于Vue和SpringBoot的服装商城系统学科竞赛管理系统
java·开发语言·vue.js·spring boot·spring cloud·java-ee·kafka
计算机-秋大田2 小时前
基于Spring Boot的船舶监造系统的设计与实现,LW+源码+讲解
java·论文阅读·spring boot·后端·vue
代码之光_19803 小时前
保障性住房管理:SpringBoot技术优势分析
java·spring boot·后端
戴眼镜的猴4 小时前
Spring Boot的过滤器与拦截器的区别
spring boot
尘浮生5 小时前
Java项目实战II基于Spring Boot的光影视频平台(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·后端·maven·intellij-idea
尚学教辅学习资料5 小时前
基于SpringBoot的医药管理系统+LW示例参考
java·spring boot·后端·java毕业设计·医药管理
morris1316 小时前
【SpringBoot】Xss的常见攻击方式与防御手段
java·spring boot·xss·csp
flashman9117 小时前
python在word中插入图片
python·microsoft·自动化·word
阿伟*rui9 小时前
配置管理,雪崩问题分析,sentinel的使用
java·spring boot·sentinel