架构篇 -- 搭建gitlab ci远程自动化部署

news2024/11/24 18:43:26

001.后端服务自动化部署


本文将以pass-runtime服务为例子,进行介绍,有相关自动部署需求,可参考此文档。

最近换了份工作公司要求使用gitlab ci去部署,原来比较习惯使用jenkins,但是还是要适应新挑战,看了网上比较多的文章一般都不是合适,然后自己写一份,希望能帮助到有缘人。各位道友,多多指教!

确认环境

gitlab 使用ci自动部署需要确认基础环境,是否已经配置好jdk和maven,如果没有环境先,自行安装基础环境。

注意:操作过程需要使用到两台云服务器,需要账号密码账号密码地址
服务器A:部署gitlab进行管理代码
服务器B:部署要运行项目

核心步骤

1. 服务器B安装gitlab runner,并进行注册

如果已经存在,则不需要安装

部署服务器安装gitlab runner,指令如下
(1)、添加yum源

curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash

(2)、安装runner

  yum install gitlab-ci-multi-runner

(3)、向GitLab-CI注册runner

gitlab-ci-multi-runner registe

填写相关信息

# 填写gitlab ci地址
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
http://XX.xx.x.x/ci
# 输入您获得的注册Runner的令牌:
Please enter the gitlab-ci token for this runner
8-zB8AX_*********_gF

# 输入Runner的描述,你可以稍后在GitLab的UI中进行更改:
Please enter the gitlab-ci description for this runner
[hostame] my-runner

# 输入与Runner关联的标签,稍后可以在GitLab的UI中进行更改:
Please enter the gitlab-ci tags for this runner (comma separated):
my-tag,another-tag
deploy

# 选择Runner是否应该选择没有标签的作业,可以稍后在GitLab的UI中进行更改(默认为false):
Whether to run untagged jobs [true/false]:
[false]: true


选择是否将Runner锁定到当前项目,稍后可以在GitLab的UI中进行更改。Runner特定时有用(默认为true):

Whether to lock Runner to current project [true/false]:
[true]: true

# 输入Runner执行者:
Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell:
shell

相关信息位置,核心就是链接地址url和token信息。如果注册成功会有显示。

在这里插入图片描述
在这里插入图片描述

注意:如果项目有共享runner请记得关闭。

2.编写脚本

脚本一共有两个:
1. 核心启动脚本负责项目启动,关闭,重启,目前状态。
2. 启动前的业务处理,每次打包前进行服务jar的替换等等。
核心启动脚本(pass-runtime.sh)

#!/bin/sh

API_NAME=pass-runtime
JAR_NAME=$API_NAME\.jar
#PID  代表是PID文件
PID=$API_NAME\.pid
LOG=$API_NAME.log

#使用说明,用来提示输入参数
usage() {
    echo "Usage: sh 执行脚本.sh [start|stop|restart|status]"
    exit 1
}

#检查程序是否在运行
is_exist(){
  pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}' `
  #如果不存在返回1,存在返回0
  if [ -z "${pid}" ]; then
   return 1
  else
    return 0
  fi
}

#启动方法
start(){
  is_exist
  if [ $? -eq "0" ]; then
    echo ">>> ${JAR_NAME} is already running PID=${pid} <<<"
  else
    nohup java -Xms256m -Xmx512m -jar $JAR_NAME  > $LOG 2>&1 &
    echo $! > $PID
    echo ">>> start $JAR_NAME successed PID=$! <<<"
   fi
  }

#停止方法
stop(){
  #is_exist
  pidf=$(cat $PID)
  #echo "$pidf"
  echo ">>> api PID = $pidf begin kill $pidf <<<"
  kill $pidf
  rm -rf $PID
  sleep 2
  is_exist
  if [ $? -eq "0" ]; then
    echo ">>> api 2 PID = $pid begin kill -9 $pid  <<<"
    kill -9  $pid
    sleep 2
    echo ">>> $JAR_NAME process stopped <<<"
  else
    echo ">>> ${JAR_NAME} is not running <<<"
  fi
}

#输出运行状态
status(){
  is_exist
  if [ $? -eq "0" ]; then
    echo ">>> ${JAR_NAME} is running PID is ${pid} <<<"
  else
    echo ">>> ${JAR_NAME} is not running <<<"
  fi
}

#重启
restart(){
  stop
  start
}

export JAVA_HOME=/data/java/jdk1.8.0_301
echo "use java at $JAVA_HOME"
source /etc/profile

chmod 777 *
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
  "start")
    start
    ;;
  "stop")
    stop
    ;;
  "status")
    status
    ;;
  "restart")
    restart
    ;;
  *)
    usage
    ;;
esac
exit 0

业务前处理脚本(run.sh)

#!/bin/sh

# 去除旧的jar
rm -f paas-runtime.jar
# 获取新打包好的服务jar,注意路径是否一直
cp ***/paas-runtime/paas-runtime-app/target/paas-runtime-app.jar **/pass-runtime/pass-runtime.jar
# 切换路径,执行启动脚本
cd ****/pass-runtime
sh pass-runtime.sh restart

exit 0

注意:window下编辑需要转格式

sed -i 's/\r//' run.sh pass-runtime.sh

3.服务脚本集成到ci-gitlab.yml上

在这里插入图片描述

注意:变更自己要执行的文件路径。

stages:
  - package
  - deploy

mvn-package:
  image: docker:latest
  stage: package
  script:
    - ./mvnw clean package -s ci-settings.xml -DskipTests
  except:
    - master

mvn-deploy:
  stage: deploy
  script:
    - ./mvnw clean deploy -s ci-settings.xml
    - sh /opt/corilead/pass-runtime/run.sh  #集成服务脚本
  only:
    - master

各位道友上面就是gitlab自动部署的全过程了,其实并不复杂,我当时处理的时候走了一些弯路,开始思路是想使用ssh去处理,后来有验证了这条新思路,这个更方便一点。

使用ssh也是可行,我也尝试了,这里就不详细描述,主要就是需要生成公钥秘钥,然后免密ssh处理,思路都差不多。打包后将jar放到指定目录下,执行业务和 启动脚本。

本文就到这了,如有问题我们随时沟通,祝好诸君,望各位一切顺路。

诸天炁荡荡,我道日兴隆~

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

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

相关文章

大语言模型集成工具 LangChain

大语言模型集成工具 LangChain LangChain 介绍 介绍&#xff1a; 通过可组合性使用大型语言模型构建应用程序【背景】大型语言模型 (LLM) 正在成为一种变革性技术&#xff0c;使开发人员能够构建他们以前无法构建的应用程序&#xff0c;但是单独使用这些 LLM 往往不足以创建一…

内存映射(Linux)

文章目录概念 内存映射&#xff08;Memory-mapped I/O&#xff09;是将磁盘文件的数据映射到内存&#xff0c;用户通过修改内存就能修改磁盘文件。 API 内存映射相关系统调用&#xff0c;使用man 2 mmap查看帮助 void *mmap(void *addr, size_t length, int prot, int flags, …

服务端大量处于TIME_WAIT和CLOSE_WAIT状态连接的原因

服务端大量处于TIME_WAIT和CLOSE_WAIT状态连接的原因1.服务端大量处于TIME_WAIT状态的连接原因&#xff1f;1.HTTP没有使用长连接2.HTTP长连接超时3.HTTP长连接的请求数量达到上限TIME_WAIT状态连接过多的危害&#xff1f;2.服务器大量处于CLOSE_WAIT状态的连接原因&#xff1f…

网络流量监控系统为企业SAP接口性能分析

前言 某汽车总部已部署NetInside网络流量监控系统&#xff0c;使用流量分析系统提供实时和历史原始流量&#xff0c;重点针对SAP系统性能进行分析&#xff0c;以供安全取证、应用事务分析、网络质量监测以及深层网络分析。 本次分析报告包含&#xff1a;SAP接口性能分析案例。…

TSD simple(0)时序数据库简介

时间序列数据库&#xff1a;Time Series Database 时序数据库全称为时间序列数据库。 时间序列数据&#xff1a;带时间标签的数据 时间序列数据库是用于存储和管理时间序列数据的专业化数据库&#xff0c;具备写多读少、冷热分明、高并发写入、无事务要求、海量数据持续写入等…

LeetCode155-最小栈

题目 解题 这道题本来是打算用栈然后加一个标记位&#xff0c;这个标记位存最小的数&#xff0c;但是之后发现解决不这种情况&#xff1a; 1、弹出以后&#xff0c;这个标记怎么办&#xff0c;没法回溯 那么就得换一个数据结构&#xff0c;比如额外放一个线性表&#xff0c;里…

【电子学会】2022年12月图形化四级 -- 求最大公约数

求最大公约数 如果6除以2的余数是0,那么我们就说2是6的约数。4除以4的余数是0,4也是4的约数。同理可以求出,4的约数有1、2和4,6的约数有1、2、3和6。两个数的最大公约数是指两个数相同的约数中最大的那一个,如4和6两个数的最大公约数是2。 辗转相除法求最大公约数的步骤…

Windows部署定时任务,每天定期执行手机机型爬取

项目背景 有一个手机机型自动更新获取的需求&#xff0c;在我写好相关的爬虫后&#xff0c;需要将爬虫部署&#xff0c;并且需要配置定时任务每天定期执行。之前在Mac上开发&#xff0c;现在部门给配了一台windows定期执行。 环境准备 A、安装ChromeDriver 1、我是通过Chro…

JAVA中创建线程池的五种方法及比较

之前写过JAVA中创建线程的三种方法及比较。这次来说说线程池。 JAVA中创建线程池主要有两类方法&#xff0c;一类是通过Executors工厂类提供的方法&#xff0c;该类提供了4种不同的线程池可供使用。另一类是通过ThreadPoolExecutor类进行自定义创建。 目录 一、通过Executors…

c++ - 第25节 - STL之空间配置器

1.什么是空间配置器 空间配置器&#xff0c;顾名思义就是为各个容器高效的管理空间(空间的申请与回收)&#xff0c;在默默地工作。虽然在常规使用STL时&#xff0c;可能用不到它&#xff0c;但站在学习研究的角度&#xff0c;学习它的实现原理对我们有很大的帮助。2.为什么需要…

Javascript 模板模式

模板方法模式的定义和组成 模板方法模式是一种只需使用继承就可以实现的非常简单的模式。 模板方法模式由两部分结构组成&#xff0c;第一部分是抽象父类&#xff0c;第二部分是具体的实现子类。 通常在抽象父类中封装了子类的算法框架&#xff0c;包括实现一些公共方法以及封…

汉(海)明码 | “十六宫格法” 破解汉(海)明码相关题目(附软考经典例题)

文章目录一、前言二、奇偶校验码三、海明码概念四、十六宫格法1.概述2.原理3.填写校验位4.填写数据位5.填写十六宫格首位五、结语一、前言 很多小伙伴在遇到“汉明码”相关的题目时&#xff0c;看了很多的视频&#xff0c;很多文章可能还是云里雾里&#xff0c;作者在备考软考…

Linux:GDB 调试一些函数栈被毁坏的问题

一、背景 GDB调试代码时&#xff0c;偶尔会遇到一些奇怪的现象&#xff1a;函数的参数地址在函数内部被传递给另外的函数&#xff0c;然后发现地址发生了改变&#xff0c;这样的情况称之为函数的栈被毁坏&#xff0c;导致无法重入。 然后被调用的函数里面&#xff0c;访问了非…

5.一个高性能、无侵入的Java性能监控和统计工具,有点东西!

随着所在公司的发展&#xff0c;应用服务的规模不断扩大&#xff0c;原有的垂直应用架构已无法满足产品的发展&#xff0c;几十个工程师在一个项目里并行开发不同的功能&#xff0c;开发效率不断降低。 于是公司开始全面推进服务化进程&#xff0c;把团队内的大部分工程师主要…

应用性能监控系统为企业SAP做定制分析

前言 某汽车总部已部署NetInside应用性能监控系统&#xff0c;使用流量分析系统提供实时和历史原始流量&#xff0c;重点针对SAP系统性能进行分析&#xff0c;以供安全取证、应用事务分析、网络质量监测以及深层网络分析。 本次分析报告包含&#xff1a;定制SAP性能和SAP接口…

微课录屏软件哪个好?小白也能快速上手

相比线下课程&#xff0c;微课有着时间短、知识碎片化、可以循环播放等优点&#xff0c;我们可以在任意场所任意时间打开微课进行学习。那你知道微课是如何制作的吗&#xff1f;大部分微课是通过录屏软件录制电脑上教学内容制作而成的。微课录屏软件哪个好&#xff1f;今天小编…

Python实现哈里斯鹰优化算法(HHO)优化支持向量机分类模型(SVC算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 2019年Heidari等人提出哈里斯鹰优化算法(Harris Hawk Optimization, HHO)&#xff0c;该算法有较强的全…

[疑难杂症2023-001]代码没有任何改变,仅用CI打了一个新镜像,运行出错的可能原因分析

本文由Markdown语法编辑器编辑完成。 1. 前言 近日在项目中&#xff0c;遇到一个比较奇怪的问题。就是代码基本没有做任何修改&#xff0c;只是在配置文件中增加了几行配置&#xff0c;结果用CI的服务器&#xff0c;打了一个新的tag, 然后再运行时&#xff0c;就会出现报错。…

一文带你看懂验证码攻防技术那些事儿

本文目录 验证码为什么越变越复杂&#xff1f; 验证码有哪些破解方式&#xff1f; 验证码如何进行顶层产品能力设计&#xff1f; “天生反骨”的验证码总是让人类头疼不已。 比如最基础的英文数字组合验证码&#xff0c;就已经会让人陷入自我怀疑&#xff1a; “I还是1&am…

【机器学习 - 3】:数据归一化(最值归一化、均值方差归一化)

文章目录数据归一化的使用最值归一化均值方差归一化&#xff08;常用&#xff09;在sklearn中调用归一化&#xff08;鸢尾花数据归一化&#xff09;数据归一化的使用 为什么要使用数据归一化&#xff1f; 举个例子&#xff0c;例如我们要使用KNN算法来预测肿瘤为良性肿瘤或恶性…