DevOps系列文章之 GitlabCICD自动化部署SpringBoot项目

news2024/12/23 19:57:50

一、概述

本文主要记录如何通过Gitlab CI/CD自动部署SpringBoot项目jar包。

二、前期准备

准备三台 CentOS7服务器,分别部署以下服务:

序号系统IP服务
1CentOS7192.168.56.10Gitlab
2CentOS7192.168.56.11Runner (安装Docker)
3CentOS7192.168.56.12SpringBoot 项目 jar 包(安装jdk、maven等)

上述服务也可以只用一台CentOS7,将所有程序都部署在同一机器上,但是更建议分开部署;

三、总体架构图

 

说明:

  • Gitlab Server 用于部署Gitlab远程仓库,对CPU和内存要求比较高,建议4核CPU,4GB以上内存;
  • Runner Server 用于部署执行.gitlab-ci.yml 文件中定义的 stage(阶段);需要具有访问 Gitlab 仓库的权限,可以下载代码,通过注册方式(gitlab-runner register)实现;
  • Your Laptop Server 用户部署你的应用程序,这里就是SpringBoot的 jar 包,需要提前安装 JDK 和 Maven 并配置好环境变量;

四、环境搭建

1、环境准备(可选)

三台服务器执行以下命令:

1

2

3

yum -y upgrade

yum -y install wget

yum -y install vim

2、Gitlab安装

参考地址:
https://about.gitlab.com/install/#centos-7
CentOS8.1搭建Gitlab服务器详细教程_Linux_脚本之家

(1)安装并配置必要的依赖

1

2

3

4

5

6

7

sudo yum install -y curl policycoreutils-python openssh-server

sudo systemctl enable sshd

sudo systemctl start sshd

sudo firewall-cmd --permanent --add-service=http

sudo firewall-cmd --permanent --add-service=https

sudo systemctl reload firewalld

(2)安装邮件服务

1

2

3

sudo yum install postfix

sudo systemctl enable postfix

sudo systemctl start postfix

(3)添加 gitlab 镜像

参考地址:Index of /gitlab-ce/yum/el7/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

1

wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-13.4.0-ce.0.el7.x86_64.rpm

(4)安装 gitlab 安装命令

1

rpm -i gitlab-ce-13.4.0-ce.0.el7.x86_64.rpm --nodeps --force

安装成功后图片:

 

(5)修改gitlab配置文件指定服务器ip和自定义端口

1

vim  /etc/gitlab/gitlab.rb

(6)重置并启动GitLab

1

2

gitlab-ctl reconfigure

gitlab-ctl restart

提示 "ok: run:"表示启动成功

(7)访问 GitLab页面

如果报502,等待一段时间后再刷新试试,一般1-2分钟左右。

GitLab登录页面

本文设置的账号:root ,新密码:11112222

3、安装 Runner

参考官方文档:https://docs.gitlab.com/runner/install/linux-manually.html#install-gitlab-runner-manually-on-gnulinux 中的 Using binary file Install

(1)下载一个二进制文件

1

sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64

(2)修改执行权限

1

sudo chmod a+x /usr/local/bin/gitlab-runner

(3)创建 GitLab CI 用户

1

sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash

(4)安装并作为服务运行

1

2

sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner

sudo gitlab-runner start

如果遇到提示 sudo: gitlab-runner: command not found,切换到 root 用户,可以去掉 sudo 执行上面命令。

(5)注册 Runner

参考地址:Registering runners | GitLab
执行 gitlab-runner register 命令:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

[root@localhost bin]# gitlab-runner register

Runtime platform                                    arch=amd64 os=linux pid=21527 revision=4e1f20da version=13.4.0

Running in system-mode.

Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):

http://192.168.56.10/

Please enter the gitlab-ci token for this runner:

PwF1sZPX_zsB-xChSKjH

Please enter the gitlab-ci description for this runner:

[localhost.localdomain]: test ci cd desc

Please enter the gitlab-ci tags for this runner (comma separated):

my-tag,other-tag

Registering runner... succeeded                     runner=PwF1sZPX

Please enter the executor: ssh, virtualbox, parallels, shell, docker-ssh, docker+machine, docker-ssh+machine, kubernetes, custom, docker:

docker

Please enter the default Docker image (e.g. ruby:2.6):

maven:3.3.9-jdk-8

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

注:这里选择的docker方式,所以服务器上还需要额外多安装docker
参考:史上最全(全平台)docker安装方法! - 知乎

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

#!/bin/bash

# 移除掉旧的版本

sudo yum remove docker \

                  docker-client \

                  docker-client-latest \

                  docker-common \

                  docker-latest \

                  docker-latest-logrotate \

                  docker-logrotate \

                  docker-selinux \

                  docker-engine-selinux \

                  docker-engine

# 删除所有旧的数据

sudo rm -rf /var/lib/docker

#  安装依赖包

sudo yum install -y yum-utils \

  device-mapper-persistent-data \

  lvm2

# 添加源,使用了阿里云镜像

sudo yum-config-manager \

    --add-repo \

    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 配置缓存

sudo yum makecache fast

# 安装最新稳定版本的docker

sudo yum install -y docker-ce

# 配置镜像加速器

sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<-'EOF'

{

  "registry-mirrors": ["http://hub-mirror.c.163.com"]

}

EOF

# 启动docker引擎并设置开机启动

sudo systemctl start docker

sudo systemctl enable docker

# 配置当前用户对docker的执行权限

sudo groupadd docker

sudo gpasswd -a ${USER} docker

sudo systemctl restart docker

这里注册一个全局共享的 Runner(管理员权限,复制服务器地址和 Token),所有项目都可以使用,或者也可以注册项目级别单独的 Runner (进入项目 Runner 设置页面,复制地址和 Token)。

添加GitLab-Runner

注册成功后,Runner 列表可以查看到注册的 Runner

GitLab-Runner添加成功

勾选:Run untagged jobs Indicates whether this runner can pick jobs without tags

GitLab-Runner配置

4、安装应用服务器环境

(1)允许用户远程登录(可选)

1

2

3

4

5

6

7

vi /etc/ssh/sshd_config

修改:

PasswordAuthentication yes                     

PermitRootLogin yes

重启服务:

service sshd restart

(2)安装JDK1.8

(1)下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
(2)解压

1

2

3

tar -zxvf jdk-8u161-linux-x64.tar.gz

重命名:

mv jdk1.8.0_161 java1.8

(3)配置环境变量

1

2

3

4

5

6

7

8

9

10

vi /etc/profile

添加以下内容:

export JAVA_HOME=/usr/local/java1.8

export PATH=$JAVA_HOME/bin:$PATH

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

保存退出

source /etc/profile

java -version

(3) 安装 Maven3.3.9

(1)下载地址:http://maven.apache.org/download.cgi
(2)解压

1

2

3

4

tar -zxvf apache-maven-3.3.9-bin.tar.gz

重命名:

mv apache-maven-3.3.9 maven-3.3.9

(3)配置环境变量

1

2

3

4

5

6

7

8

9

vi /etc/profile

添加以下内容:

export MAVEN_HOME=/usr/local/maven-3.3.9

export PATH=$MAVEN_HOME/bin:$PATH

保存退出

source /etc/profile

mvn -v

五、创建 SpringBoot 项目

1、使用Gitlab Spring 模板快速创建一个 SpringBoot 项目;

GitLab创建SpringBoot项目

SpringBoot项目配置gitlab-ci.yml.jpg

如果报错,删除pom.xml中的这行

报这个错的话:
[FATAL] Non-resolvable parent POM for com.example:demo:0.0.1-SNAPSHOT: Could not transfer artifact org.springframework.boot:spring-boot-starter-parent:pom:2.0.1.RELEASE from/to central (https://repo.maven.apache.org/maven2): Connect to repo.maven.apache.org:443 [repo.maven.apache.org/151.101.40.215] failed: Connection timed out (Connection timed out) and ‘parent.relativePath' points at wrong local POM @ line 14, column 10

修改版本
1.5.9.RELEASE

2、添加环境变量(登录应用服务器密码)

注: 其中 ssh_password 这个添加到环境变量中,取消勾选 Protect Branch (仅保护分支);修改和添加都是默认勾选,需要取消,否则,其他分支不能读取到该变量;

 

先在应用服务器上创建一个目录,用于上传存放项目 jar 包:

1

mkdir gitlab-project

添加 .gitlab-ci.yml 文件时,可以先再 CI/CD Pipeline 中 的 CI Lint 中检验 .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

# 定义一些变量, 下面各阶段会使用

variables:

  server_ip: 192.168.56.12

  jar_name: demo-0.0.1-SNAPSHOT.jar

  java_path: /usr/local/java1.8/bin

  upload_path: /usr/local/gitlab-project

# 定义执行的各个阶段及顺序

stages:

  - build

  - upload

  - deploy

# 使用 maven 镜像打包项目

maven-build:

  stage: build

  image: maven:3.5.0-jdk-8

  script:

    - mvn package -B -Dmaven.test.skip=true

  cache:

    key: m2-repo

    paths:

      - .m2/repository

  artifacts:

    paths:

      - target/$jar_name

# 上传生成的 jar 包到你的应用服务器,这里使用 ictu/sshpass 这个镜像,是为了使用 sshpass 命令

upload-jar:

  stage: upload

  image: ictu/sshpass

  script:

    - ls -l target/

    - sshpass -p $ssh_password scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no target/$jar_name root@$server_ip:$upload_path/$jar_name

# 启动 SpringBoot jar包

deploy-test:

  stage: deploy

  image: ictu/sshpass

  script:

    - sshpass -p $ssh_password ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no root@$server_ip "nohup $java_path/java -jar $upload_path/$jar_name >/dev/null 2>&1 &"

这里使用了DockerHub上面的一个公共镜像(ictu/sshpass),主要是想使用启动自带的sshpass命令执行scp和ssh命令。
如果一切顺利的话,就会自动触发 CI/CD ;失败的话查看报错信息,可使用 Debug 模式执行调试命令 。

1

2

3

4

5

[root@localhost gitlab-project]# jps

22119 Jps

22073 demo-0.0.1-SNAPSHOT.jar

[root@localhost gitlab-project]# curl localhost:8080

Spring is here!

 

可能遇到的问题总结:

  1. 权限问题:可以先使用 root 用户看看是不是权限问题导致,如果是的话,提升执行用户的权限;并发问题:这里没有修改 Runner 的并发数,可以修改同时可以进行的任务并发数;其他问题:读取不到配置的环境变量,取消勾选仅保护分支的选项;
  2. 未执行job:没有勾选未配置 tags 也执行选项;

六、总结

使用GitLab自带的CICD功能部署SpringBoot项目非常方便,前期环境搭建可能需要花一点时间学习,但是后期部署项目可以省去很多人为操作失误,对于小型团队来说,Gitlab自带的CICD功能比Jenkins更加简单,总体思想步骤是:

搭建GitLab服务;搭建GitLab Runner服务;搭建应用服务;编写gitlab-ci.yml;
对于SpringBoot项目来说,一般分为:
(1)maven 打包;
(2)上传jar包;
(3)启动jar包;

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

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

相关文章

docker的入门使用—太详细了

docker的使用 一、Docker概念跟普通虚拟机的对比概念Docker部署的优势使用docker的简要介绍dockerfile和docker-compose区别 二、docker命令介绍&#xff1a;1、构建镜像和运行2、 常用命令 三、镜像加速源四、安装五、Docker快速安装软件演示 Docker 安装 Redis安装 Wordpress…

kubernetes中PV和PVC

目录 一、PV、PVC简介 二、PV、PVC关系 三、创建静态PV 1.配置nfs存储 2.定义PV 3.定义PVC 4.测试访问 四、 搭建 StorageClass nfs-client-provisioner &#xff0c;实现 NFS 的动态 PV 创建 1. 配置nfs服务 2.创建 Service Account 3.使用 Deployment 来创建 NFS P…

Unity Bolt使用协程等待

使用Unity bolt插件可以进行一些简单逻辑开发。本质上相当于把C#接口以图形化的方式进行调用。但是怎么使用协程进行等待呢。经过一些研究&#xff0c;可以使用继承WaitUnit的组件方式进行扩展。下面是具体的操作步骤。 1&#xff1a;等待组件扩展。 经过查找&#xff0c;Bol…

成人自考-英语二-名词详细介绍

感谢内容提供者&#xff1a;金牛区吴迪软件开发工作室 文章目录 一、名词简介1.常见名词后缀 二、什么时候空格里填入名词三、名词分类1.可数名词(1)规则变化(2)规则变化中的特例(3)不规则变化 2.不可数名词(1)物质名词(2)抽象名词 四、描述数量1.修饰可数名词2.修饰不可数名词…

WS2812B————动/静态显示

一&#xff0c;系统架构 二&#xff0c;芯片介绍 1.管脚说明 2.数据传输时间 3.时序波形 4.数据传输方法 5.常用电路连接 三&#xff0c;代码展示及说明 驱动模块 在驱动模块首先选择使用状态机&#xff0c;其中包括&#xff0c;空闲状态&#xff0c;复位清空状态&#xff0c…

性能场景和性能需求指标

目录 一 性能场景 1、基准性能场景 2、容量性能场景 3、稳定性性能场景 4、异常性能场景 二 性能需求指标 1、业务指标 2、技术指标 2.1 时间指标 RT 2.2 容量指标 TPS 2.3 资源利用率 3、指标之间的关系 “TPS”与“响应时间” “用户数”与“TPS”与“压力工具中…

【量化课程】08_2.深度学习量化策略基础实战

文章目录 1. 深度学习简介2. 常用深度学习模型架构2.1 LSTM 介绍2.2 LSTM在股票预测中的应用 3. 模块分类3.1 卷积层3.2 池化层3.3 全连接层3.4 Dropout层 4. 深度学习模型构建5. 策略实现 1. 深度学习简介 深度学习是模拟人脑进行分析学习的神经网络。 2. 常用深度学习模型架…

DevOps系列文章 之 SpringBoot整合GitLab-CI实现持续集成

在企业开发过程中&#xff0c;我们开发的功能或者是修复的BUG都需要部署到服务器上去&#xff0c;而这部分部署操作又是重复且繁琐的工作&#xff0c;GitLab-CI 持续集成为我们解决了这一痛点&#xff0c;将重复部署的工作自动化&#xff0c;大大的节省了程序员们的宝贵时间。本…

群晖 NAS 十分精准的安装 Mysql 远程访问连接

文章目录 1. 安装Mysql2. 安装phpMyAdmin3. 修改User 表4. 本地测试连接5. 安装cpolar6. 配置公网访问地址7. 固定连接公网地址 转载自cpolar极点云文章&#xff1a;群晖NAS 安装 MySQL远程访问连接 群晖安装MySQL具有高效、安全、可靠、灵活等优势&#xff0c;可以为用户提供一…

C++初阶之一篇文章教会你queue和priority_queue(理解使用和模拟实现)

queue和priority_queue&#xff08;理解使用和模拟实现&#xff09; 什么是queuequeue的使用1.queue构造函数2.empty()3.size()4.front()5.back();6.push7.emplace8.pop()9.swap queue模拟实现什么是priority_queuepriority_queue的使用1.priority_queue构造函数1.1 模板参数 C…

如何切换goland之中的版本号(升级go 到1.20)

go 安装/版本切换_go 切换版本_云满笔记的博客-CSDN博客 用brew就行&#xff1a; echo export PATH"/opt/homebrew/opt/go1.20/bin:$PATH" >> ~/.zshrc

无涯教程-Perl - scalar函数

描述 此函数强制EXPR的判断在标量context中进行,即使它通常在列表context中也可以使用。 语法 以下是此函数的简单语法- scalar EXPR返回值 此函数返回标量。 例 以下是显示其基本用法的示例代码- #!/usr/bin/perl -wa (1,2,3,4); b (10,20,30,40);c ( a, b ); prin…

如何与 Anheuser-Busch 建立 EDI 连接?

Anheuser-Busch 于 1852 年创立&#xff0c;总部位于美国密苏里州圣路易斯市&#xff0c;出产的百威啤酒(Budweiser)名扬世界&#xff0c;深受各国消费者喜爱。推进数字化转型&#xff0c;科技赋能降费增效。在诸多举措之中&#xff0c;可以看到 EDI 的身影&#xff0c;借助 ED…

Java智慧工地APP源码带AI识别

智慧工地为建筑全生命周期赋能&#xff0c;用创新的可视化与智能化方法&#xff0c;降低成本&#xff0c;创造价值。 一、智慧工地APP概述 智慧工地”立足于互联网&#xff0c;采用云计算&#xff0c;大数据和物联网等技术手段&#xff0c;针对当前建筑行业的特点&#xff0c;…

Apipost接口自动化控制器使用详解

测试人员在编写测试用例以及实际测试过程中&#xff0c;经常会遇到两个棘手的问题&#xff1a; •稍微复杂一些的自动化测试逻辑&#xff0c;往往需要手动写代码才能实现&#xff0c;难以实现和维护 •测试用例编写完成后&#xff0c;需要手动执行&#xff0c;难以接入自动化体…

对比学习论文综述总结

第一阶段:百花齐放(18-19中) 有InstDisc(Instance Discrimination)、CPC、CMC代表工作。在这个阶段方法模型都还没有统一,目标函数也没有统一,代理任务也没有统一,所以说是一个百花齐放的时代 1 判别式代理任务---个体判别任务 1.1 Inst Dict---一个编码器+一个memory…

springboot结合element-ui实现增删改查,附前端完整代码

实现功能 前端完整代码 后端接口 登录&#xff0c;注册&#xff0c;查询所有用户&#xff0c;根据用户名模糊查询&#xff0c;添加用户&#xff0c;更新用户&#xff0c;删除用户 前端 注册&#xff0c;登录&#xff0c;退出&#xff0c;用户增删改查&#xff0c;导航栏&#…

关于单行文本input和多行文本textarea唤起自动完成功能

若不要自动完成功能&#xff0c;则增加 autocomplete"off" 属性到控件或窗体中&#xff0c;默认 autocomplete"on" 处于开启状态。 实测过程中&#xff0c;单行文本可以有自动完成功能&#xff0c;多行文本无论如何实验都不行。查了查资料&#xff0c;MDN…

算法提高-线段树

线段树 线段树和树状数组线段树的五个操作单点修改&#xff08;不需要懒标记&#xff09;要求的答案就是我们要维护的属性&#xff0c;不需要维护其他的属性帮助我们获得答案要求的答案还需要其他属性去维护 区间修改&#xff08;需要懒标记&#xff0c;pushdown&#xff09;有…

小爱同学今日起开启邀请测试, 小米Al 大模型团队整装待发

在小米雷军年度演讲中&#xff0c;小米宣布未来将在技术研发上投入超过200亿元人民币&#xff0c;并预计在2023年达到这一目标。除此之外&#xff0c;雷军还强调了5G技术在小米发展中的重要性&#xff0c;称其为必要标准&#xff0c;并预测小米将进入世界前十的位置。 雷军还透…