什么是自动化部署?

2022-11-28 10:11 栏目:实用知识 查看()
自动化部署
一.自动化部署是什么?
自动化部署概述
 
1.1 什么是自动化部署
 
一句简单的话概括:部署的过程中所有的操作全部自动化,无需人工手工干预。
 
1.2 自动部署的好处
 
传统的部署方式如下:
 
运维人员手工使用Scp、Xftp等方式来传输数据
手工登录服务器执行git pull 、svn update等命令进行更新代码的操作
开发人员手工编译打包,然后通过内网传输给运维人员
运维人员通过rz上传的方式上传到目标服务器,然后,执行重命名原包、拷贝新包到目标目录,再执行服务应用重启命令完成整个部署过程
看似非常简单,也不是很麻烦,但是一旦项目多,部署频繁,这种情况下就会大大降低工作效率。
 
传统的部署方式有以下的缺点:
 
整个过程都需要人员参与,占用大量的时间,效率低下
上线、更新、回滚速度慢
存在一定的管理混乱,人为误操作的机率增大
所以,自动化部署的优势就通过这种对比显现出来了!!
 
二.怎么实现?
我们都知道部署就是将项目放到服务器上,然后运行起来
 
流程一般是本地打包,备份服务器上正在运行的包,然后上传到项目所使用的目录,再杀掉之前跑的进程,再重新启动项目。
 
1.原生自动化部署
前端
#前置需要 npm git
git clone http://gitlab.forwe.store/great/protal_msn.git #克隆代码
cd protal_msn/
# 这里因为是http的 所以要输入账号密码
git config --local credential.helper store #保存账号密码
 
git pull
npm install
npm run build:dev
 
后端
#前置需要 jdk
git clone http://gitlab.forwe.store/great/community.git
cd community/
clean package -Dmaven.test.skip=true -P test
mv ./target/community.jar /usr/local/project/community
sh /usr/local/project/community/restart.sh
 
注意:使用http 克隆项目的时候 需要设置一下保存git账号和密码
 
git config --local credential.helper store #记住账号密码 下次就不用再输了
 
2.jenkins
jenkins的背景
Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,起源于Hudson(Hudson是商用的),主要用于持续、自动的构建/测试软件项目、监控外部任务的运行(这个比较抽象,暂且写上,不做解释)。Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。通常与版本管理工具(SCM)、构建工具结合使用。常用的版本控制工具有SVN、GIT,构建工具有Maven、Ant、Gradle。
 
前端
后端
 
 
restart.sh 脚本内容
 
#!/bin/bash
 
# error code
# 1: missing parameter
# 2: not a jar file
# 3: start jar file failed
 
TIMEOUT=180  # 3 minutes timeout
 
function echo_error() {
    printf "[ ERROR $1 ] $2 "
}
 
function main() {
        
        echo "检查jar包开始"
        # check file type
        local jarfile=community.jar
        local extension=${jarfile##*.}
        if [[ $extension != jar ]];then
                echo_error 2 "not a jar file"
                exit 2
        fi
        echo "检查jar包成功"
        echo "***********************************"
        echo "停止进程 $jarfile 开始"
        # check process is running
        local pid=$(ps -ef|grep -E "-jar $jarfile" | grep -v grep |awk '{print $2}')
        if [ -n "$pid" ]
        then
    echo "kill -9 的pid:" $pid
    kill -9 $pid
        fi
        echo "停止进程结束"
 
        echo "start jar -------------->"
        # start jar file
    source /etc/profile
    cd /pine/www/project/community
    nohup java -Dloader.path=lib/ -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5007 -Xms512m -Xmx512m -jar community.jar >/dev/null 2>&1  &
 
}
 
 
main $*
 
jenkins中所遇到的两个坑
着重强调一下这两个坑
 
一、构建完成后脚本运行能kill项目但是无法运行
配置完成之后,运行脚本时需注意 会在home目录下去执行 sh后需要加入绝对路径 注意 shell命令里面 也要设置绝对路径
 
加入 这两个参数即可
 
  source /etc/profile
 
  BUILD_ID=dontKillMe
 
查了一下原因说是 jenkins在脚本执行结束后,就认为任务结束了,但是脚本启动的相关子程序仍然在运行。由于jenkins认为任务已经结束了,就结束了该构建相关的子进程。
 
source /etc/profile 是说因为是伪连接过来的 所以呢没有当前服务器的环境变量 导致无法运行 java
 
不然就是需要吧java全路径带进来 (这一点没有复现出来,可能是由于Jenkins构建完成后ssh连接过来的账号权限不足导致无法获取到环境变量)
 
还有就是启动jar包的时候 一定一定要 绝对路径或者cd 到对应的项目目录下 不然也一样是运行不了的
 
二、无限构建问题
 
 
jenkins任务构建进入死循环 - 使用微服务架构,工程间有依赖,所以创建jenkins任务时,配置了触发器,当依赖的项目构建时,触发任务构建。
 
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流

郑重申明:联众嘉创以外的任何单位或个人,不得使用该案例作为工作成功展示!