SpringBoot整合GitLab-CI实现持续集成

news2024/7/6 3:46:46

写在前面

🍁个人主页:微枫Micromaple

✨本期专栏:《0到1项目搭建》欢迎订阅学习~

📌源码获取:GitCode、GitHub、码云Gitee 持续更新中,别忘了 star 喔~

在企业开发过程中,我们开发的功能或者是修复的BUG都需要部署到服务器上去,而这部分部署操作又是重复且繁琐的工作,GitLab-CI 持续集成为我们解决了这一痛点,将重复部署的工作自动化,大大的节省了程序员们的宝贵时间。本文详细讲述了 GitLab-CI 持续集成的安装、部署、以及配置。

文中的工具包有需要的话也可以私信博主哟~

目录

    • 写在前面
    • 一、概述
      • 1.1、什么是CI/CD
      • 1.2、持续集成(CI)
      • 1.3、持续交付(CD)
    • 二、CI/CD流水线
      • 2.1、Pipeline
      • 2.2、Stages
      • 2.3、Jobs
      • 2.4、Runners
    • 三、安装GitLab Runner
      • 3.1、环境准备
      • 3.2、创建Dockerfile
      • 3.3、创建docker-compose
      • 3.4、注册Runner
      • 3.4、项目配置
        • 3.4.1、依赖管理模块
        • 3.4.2、通用模块
        • 3.4.3、服务模块

一、概述

在这里插入图片描述

1.1、什么是CI/CD

CI/CD 属于 DevOps,代表持续集成、持续交付/部署。CI/CD 自动化了传统上将新代码从提交到生产(例如构建、测试和部署)以及基础设施配置所需的大部分或全部手动人工干预。借助 CI/CD ,开发人员可以对代码进行更改,然后自动测试并推出以进行交付和部署。以实现停机时间最小化,代码发布速度更快。

1.2、持续集成(CI)

持续集成是在提交或合并代码时,自动测试每个更改,并自动启动构建。可以大大减少开发和运维人员的重复工作,可以在软件开发生命周期的更早阶段更轻松的发现并修复错误和安全问题。

1.3、持续交付(CD)

持续交付是一种软件开发实践,一般与持续集成结合使用,以自动化基础设置供应和应用程序发布过程。

一旦代码作为 CI 流程的一部分进行了测试和构建,持续交付将在最后阶段接管,以确保可以随时部署并将部署所需要的环境打包在一起。

通过持续交付,可以随时将构建的软件部署到生产环境。可以手动触发部署,也可以进行自动化部署。

二、CI/CD流水线

2.1、Pipeline

在这里插入图片描述

Pipeline 相当于构建任务,里面可以包含多个流程,如安装依赖、运行测试、编译、部署测试服务器、部署生产服务器等流程。

任何提交或合并代码都可以触发 Pipeline。

2.2、Stages

在这里插入图片描述

Stages 表示构建阶段,可以在一次 Pipeline 中定义多个 Stages。

Stages 有以下特点:

  • 所有 Stages 会按照顺序运行,即当一个 Stage 完成后,下一个 Stage 才会开始
  • 只有当所有 Stages 完成后,该构建任务 (Pipeline) 才会成功
  • 如果任何一个 Stage 失败,那么后面的 Stages 不会执行,该构建任务 (Pipeline) 失败

2.3、Jobs

在这里插入图片描述

Jobs 表示构建工作,表示某个 Stage 里面执行的工作。可以在 Stages 里面定义多个 Jobs。

Jobs 有以下特点:

  • 相同 Stage 中的 Jobs 会并行执行
  • 相同 Stage 中的 Jobs 都执行成功时,该 Stage 才会成功
  • 如果任何一个 Job 失败,那么该 Stage 失败,即该构建任务 (Pipeline) 失败

2.4、Runners

Runner 是一个在 GitLab CI/CD 管道中运行作业的应用程序。简而言之,就是由 Runner 来执行这些构建任务。

GitLab Runner 可以安装到不同的机器上,也可以在容器或 Kubernetes 集群中运行。Runner 在安装机器上处理作业,在构建任务运行期间并不会影响到 GitLab 的性能。

三、安装GitLab Runner

3.1、环境准备

创建目录

mkdir -p /usr/local/docker/runner
mkdir -p /usr/local/docker/runner/environment

下载 jdk-8u341-linux-x64.tar.gzapache-maven-3.5.3-bin.tar.gzsettings.xmldocker-compose,并将其上传至 environment 目录

$ ll
total 197168
drwxr-xr-x 2 root root      4096 Dec  3 20:13 ./
drwxr-xr-x 3 root root      4096 Dec  3 20:13 ../
-rw-r--r-- 1 root root   8799579 Dec  3 20:13 apache-maven-3.5.3-bin.tar.gz
-rw-r--r-- 1 root root  44924928 Dec  3 20:13 docker-compose
-rw-r--r-- 1 root root 148162542 Dec  3 20:13 jdk-8u341-linux-x64.tar.gz
-rw-r--r-- 1 root root     10596 Dec  4 20:13 settings.xml

settings.xml 中增加了 maven 部署的 server 节点,否则项目 deploy 时会失败

3.2、创建Dockerfile

environment目录下创建 daemon.json

vi /usr/local/docker/runner/environment/daemon.json

内容如下:

{
  "registry-mirrors": [
    "https://mirror.ccs.tencentyun.com"
  ],
  "insecure-registries": [
    "192.168.110.158:5000"
  ]
}
  • registry-mirrors:为镜像加速地址,这里是使用的腾讯云的镜像加速地址。
  • insecure-registries:Docker仓库的IP。

注意:需要提前搭建Docker 私服(Docker Registry)

environment目录下创建 Dockerfile

vi /usr/local/docker/runner/environment/Dockerfile

内容如下:

FROM gitlab/gitlab-runner:v11.0.2

# 修改软件源
RUN echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse' > /etc/apt/sources.list && \
    echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse' >> /etc/apt/sources.list && \
    echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse' >> /etc/apt/sources.list && \
    echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse' >> /etc/apt/sources.list && \
    apt-get update -y && \
    apt-get clean

# 安装 Docker
RUN apt-get -y install apt-transport-https ca-certificates curl software-properties-common && \
    curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add - && \
    add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" && \
    apt-get update -y && \
    apt-get install -y docker-ce
COPY daemon.json /etc/docker/daemon.json

# 安装 Docker Compose
WORKDIR /usr/local/bin
COPY docker-compose /usr/local/bin
RUN chmod +x docker-compose

# 安装 Java
RUN mkdir -p /usr/local/java
WORKDIR /usr/local/java
COPY jdk-8u341-linux-x64.tar.gz /usr/local/java
RUN tar -zxvf jdk-8u341-linux-x64.tar.gz && \
    rm -fr jdk-8u341-linux-x64.tar.gz

# 安装 Maven
RUN mkdir -p /usr/local/maven
WORKDIR /usr/local/maven
COPY apache-maven-3.5.3-bin.tar.gz /usr/local/maven
RUN tar -zxvf apache-maven-3.5.3-bin.tar.gz && \
    rm -fr apache-maven-3.5.3-bin.tar.gz
COPY settings.xml /usr/local/maven/apache-maven-3.5.3/conf/settings.xml

# 配置环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_341
ENV MAVEN_HOME /usr/local/maven/apache-maven-3.5.3
ENV PATH $PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin

WORKDIR /

3.3、创建docker-compose

runner目录下创建 docker-compose.yml

vi /usr/local/docker/runner/docker-compose.yml

内容如下:

version: '3.1'
services:
  gitlab-runner:
    build: environment
    restart: always
    container_name: gitlab-runner
    privileged: true
    volumes:
      - ./config:/etc/gitlab-runner
      - /var/run/docker.sock:/var/run/docker.sock

构建启动

docker-compose up -d

启动后,会自动进行构建

3.4、注册Runner

需要将每一个项目都注册 Runner。

进入到我们需要注册Runner的项目

在这里插入图片描述

点击设置->CI/CD,在右侧找到Runner,点击展开
在这里插入图片描述

可以看到这个项目的 Runner 的详细信息,其中注册令牌是我们接下来注册 Runner 时必须要用到的

在这里插入图片描述

在 GitLab Runner 部署服务器上执行命令

docker exec -it gitlab-runner gitlab-runner register
# 输入 GitLab 地址
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
http://192.168.110.158:8080/

# 输入 Gitlab-ci token
Please enter the gitlab-ci token for this runner:
78qwWqvR9xDc5_BjYpwo

# 输入 Runner 的说明
Please enter the gitlab-ci description for this runner:
[cdc79d8453ec]: 

# 设置 Tag
Please enter the gitlab-ci tags for this runner (comma separated):
deploy

# 选择 runner 执行器
Registering runner... succeeded                     runner=78qwWqvR
Please enter the executor: kubernetes, docker-ssh, parallels, virtualbox, docker-ssh+machine, docker, shell, ssh, docker+machine:
shell

Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded! 

配置完后,项目中会显示一个有效可用的 runner
在这里插入图片描述

3.4、项目配置

项目中需要添加一个 .gitlab-ci.yml 文件,用于定义要运行的脚本。

3.4.1、依赖管理模块

刚刚在my-project-dependencies项目中配置了 Runner,而 my-project-dependencies 项目只需要将其部署到 Nexus私服中,所以此项目的 .gitlab-ci.yml 文件脚本内容就只需要将其deployNexus即可。

在这里插入图片描述

内容如下:

stages:
  - deploy

deploy:
  stage: deploy
  script:
    - /usr/local/maven/apache-maven-3.5.3/bin/mvn deploy

项目结构图如下:

在这里插入图片描述

提交my-project-dependencies项目,可以在GitLab看到我们刚刚创建的流水线

在这里插入图片描述

如果状态一直在运行中,在设置里面的 Runner 中,勾选运行没有标签的作业

在这里插入图片描述

3.4.2、通用模块

my-project-common通用模块,也需要注册Runner,这里就不重复赘述了,参考上文。

通用模块持续集成步骤:

在这里插入图片描述

  • 清理
  • 打包

.gitlab-ci.yml 文件内容如下:

stages:
  - deploy

deploy:
  stage: deploy
  script:
    - /usr/local/maven/apache-maven-3.5.3/bin/mvn clean deploy

提交my-project-common通用模块,可以在Nexus中看到上传的jar,持续集成成功。

在这里插入图片描述

在这里插入图片描述

3.4.3、服务模块

my-project-server项目服务模块,同样需要注册Runner。

项目服务模块持续集成步骤:

在这里插入图片描述

  • 打包构建Docker镜像
  • 推送Docker仓库
  • 运行容器
  • 清理虚悬镜像

.gitlab-ci.yml 文件内容如下:

stages:
  - build
  - push
  - run
  - clean

build:
  stage: build
  script:
    - /usr/local/maven/apache-maven-3.5.3/bin/mvn clean package -Dmaven.test.skip=true
    - cp target/my-project-server-1.0.0-SNAPSHOT.jar docker
    - cd docker
    - docker build -t 192.168.110.158:5000/my-project-server .

push:
  stage: push
  script:
    - docker push 192.168.110.158:5000/my-project-server

run:
  stage: run
  script:
    - cd docker
    - docker-compose down
    - docker-compose up -d

clean:
  stage: clean
  script:
    - docker rmi $(docker images -q -f dangling=true)

docker 仓库地址更改为自己的IP

提交my-project-server项目服务模块,查看构建结果

在这里插入图片描述

第一次最后一个步骤构建失败,是因为没有可删除的虚悬镜像,导致删除失败,这个不影响

构建成功,访问查询所有用户接口:

http://IP:8899/sys-user/get/all

在这里插入图片描述

可以访问Docker仓库,可以看到刚刚持续集成推送的镜像

$ curl 192.168.110.158:5000/v2/_catalog
{"repositories":["my-project-server"]}

到这里,项目的持续集成就完成啦!!!

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

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

相关文章

python之筛选图像中是否存在黑白背景

python之筛选图像中是否存在黑白背景 紧接上篇文章的需求,需要进行功能增加 某些图片存在背景丢失问题,出现黑白背景现象,这种需要排查,同样交给了自动化处理。 这次不比上次了,我搜罗了一堆资料,全是什么…

【实时数仓】DWD层需求分析及实现思路、idea环境搭建、实现DWD层处理用户行为日志的功能

文章目录一 DWD层需求分析及实现思路1 分层需求分析2 每层的职能3 DWD层职能详细介绍(1)用户行为日志数据(2)业务数据4 DWD层数据准备实现思路二 环境搭建1 创建maven工程2 修改配置文件(1)添加依赖&#x…

Faster RCNN精读

Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks Faster R-CNN:使用区域建议网络实现实时目标检测 优异的网络模型总是经得起时间的推敲,Faster RCNN便是其中一员。 目录 一、摘要 二、结论 三、介绍和相关工作 …

R语言析因设计分析:线性模型中的对比

对比度可用于对线性模型中的处理进行比较。 常见的用途是使用析因设计时,除析因设计外还使用控制或检查处理。在下面的第一个示例中,有两个级别(1和2)的两个处理(D和C),然后有一个对照 处理。此…

周末来哥家小聚一下

欢迎关注勤于奋 每天12点准时更新国外LEAD相关技术 是的,周末来哥家小聚,他们这儿人不多,就是一些认识的人,没有外人,加上疫情,一般不聚集,大家都清楚没事。 在他家没事,就陪小朋友…

灵活的类加载器OSGI

灵活的类加载器OSGI 简介 OSGi中的每个模块(称为Bundle)与普通的Java类库区别并不太大,两者一般都以JAR格式进行 封装[2],并且内部存储的都是Java的Package和Class。但是一个Bundle可以声明它所依赖的Package(通 过I…

最近的一点杂感

这是学习笔记的第 2444篇文章最近居家办公几周了,除了工作也能想想生活的事情,说说最近自己比较深的几四点感受吧。熵增和待办事项最初居家办公的时候,我们也有日会,也会有一些频繁的沟通,但是总是感觉目标的达成效果上…

JavaScript大作业 基于HTML+CSS+JavaScript站酷静态页面官网7页

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

超高质量堆排序详细讲解,图文并茂,看不懂打我

目录 一,题目 二,堆排序 1、堆排序基本介绍 2、堆排序基本思想 3、堆排序步骤图解说明 四,总结堆排序的整体思路 五,整体代码实现 1.普通版 2,STL版 一,题目 给定你一个长度为 n 的整数数列。 请你使用快堆排序对这个数列…

斐波那契数列问题【Java实现】

目录 题目: 背景: 方法一:暴力递归 复杂度O(2^N) 方法二:复杂度O(N) 方法三:O(logN)复杂度 两个矩阵相乘: 求矩阵m的p次方的代码实现: 用矩阵乘法求斐波那契数列第…

Linux | Posix信号量(semaphore) | 环形队列实现生产消费模型 | 线程池实现

文章目录POSIX信号量信号量接口讲解基于信号量和环形队列实现生产消费模型线程池的实现Posix信号量和System V信号量作用相同,都是用于共享资源的同步访问,Posix信号量通常用于线程间通信,而System V信号量常用于进程间通信,这篇博…

2022-12-09 Redis 学习

Redis简介 Nosql NOSQL:即Not-OnlySQL(泛指非关系型的数据库),作为关系型数据库的补充。 作用:应对基于海量用户海量数据前提下的数据处理问题 特征: 可扩容,可伸缩大量数据下高性能灵活的数…

记录在使用git进行上传本地文件到github上遇到的一些问题以及解决办法

1.warning: in the working copy of ‘XXX’, LF will be replaced by 这是一个警告错误,其实可以不用管他。 如果想要不出现这个警告可以参考这个博客:https://blog.csdn.net/Babylonxun/article/details/126598477 2.fatal: ‘origin’ does not app…

阳了别怕,保护好自己

关注、星标公众号,直达精彩内容图片素材来源:网络素材作者:技术让梦想更伟大 | 李肖遥最近已经陆续有四五个同事🐏了,如果是上一周,那我现在也是妥妥的密接了,不过现在放开的趋势愈发明显&#…

Web 服务的概述

Web 服务的概述 由于能够提供图形、声音等多媒体数据,再加上可以交互的动态 Web 语言的广泛普及,WWW(World Wide Web,万维网)深受Internet用户欢迎。一个最重要的证明就是,当前的绝大部分Internet流量都…

用SQL语句进行数据库查询(简单查询)

前言 🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏: 🍔🍟🌯 c语言初阶 🔑个人信条: 🌵知行合一 🍉本篇简介:>: 讲解使用SQL语句进行简单的数据查询、条件查询等. ✨…

考的好不如选的好?中国石油大学(华东)计算机考研报录比

中国石油大学(华东)是一所211大学,位于山东省青岛市。中国石油大学计算机学科评估B-,计算机实力在211大学中还算可以。前段时间,中国石油大学(华东)公布了今年考研的报名人数,区分出…

c#入门-枚举和数字互相转化

枚举的数值绑定 枚举的本质是数字,可以声明为常量。 同类的枚举之间,可以直接使用关系运算符(大于小于等于这些) 同类的枚举之间还可以直接使用数学运算符(但不能直接和数字进行数学运算) 枚举的默认数值…

app自动化环境配置mac版

android sdk 试了各种sdk tools下载、ADT bundle tools总有各种报错,最后直接官网android studio全套,记住下载页面的https改为http 没有试 brew install android-sdkandroid模拟器 能适配mac M1芯片的模拟器好像只有夜神,但是安装后一直卡…

微服务框架 SpringCloud微服务架构 微服务保护 32 隔离和降级 32.5 熔断策略【慢调用】

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 微服务保护 文章目录微服务框架微服务保护32 隔离和降级32.5 熔断策略【慢调用】32.5.1 熔断策略【慢调用】32.5.2 案例32 隔离和降级 32.5…