跳过正文

个人开发者如何优雅地更新线上项目 | 云效流水线介绍及入门教程

·2652 字·6 分钟
运维 自动化 前端 后端
目录

前言

作为社团公众号的第一篇技术分享,笔者还是希望能给大家带来一点实用的工具或是技能,能在开发过程中实际地提高大家的效率。本文的操作步骤,在不同环境下可能产生比较大的出入,在这里提的也不是唯一解,大家可以自由发挥。

在开发中,我们经常遇到需要部署上线项目的情况,尤其是在开发流程中,前端需要与后端实现联调,就需要将后端的项目部署上线。但有时,我们的项目是需要不断更新并重新部署的,此时,不断进行代码修改->打包->上传新项目->重新运行部署这样的流程,显然显得冗余而麻烦了,如何优雅地更新代码,降低工作量呢?

我们知道实现自动化部署有诸如Jenkins的工具,但本文将介绍更方便快捷的模式——阿里云效流水线。

工作准备

  1. git环境及代码仓库
  2. 阿里云账号
  3. 公网服务器

工作原理

我们做项目重新上线部署,无非是诸如代码修改->打包->上传新项目->重新运行部署的重复性工作,其中打包->上传新项目->重新运行部署工作是重复性的,我们可以通过脚本来替代。

在git仓库中,我们可以使用webhook来实现代码源的触发,当我们提交或合并代码时,git仓库可以触发webhook,通知流水线服务器启动打包编译及部署流程,实现自动重新部署。

步骤

登录云效,新建流水线

  1. 云效官网中登录或注册,即可进入到云效主页面中,点击右上角展开侧边栏,选择“流水线”,即可来到流水线的主页。

    首页

  2. 在流水线的主页中,点击右上角“新建流水线”,并选择好项目类型,到达流水线的配置页面

    流水线主页

流水线设置

项目有千万种,这里我们以比较普遍的前端Vue项目和后端springboot项目为例,做一个步骤介绍

通用步骤

1. 删除测试项

进入流水线设置页面后,可以点击“测试”步骤下的两个项,在右侧的栏目中选择“删除”(如果想通过流水线的代码检测规范你的代码,并看到一堆烦人的报错的话,可以不这么做)

删除测试项

2. 代码源配置

点击左侧“添加流水线源”绑定你的代码仓库,若你的代码仓库为codeup代码管理,只需要勾选“开启代码源触发”即可实现自动配置webhook,若不是(如github/gitee),则需要在代码仓库中添加webhook(具体操作可以自行了解)

代码源
这里做个提醒,在配置时要注意content type项,一定要选择json

3. 主机部署设置

选择“新的任务”,新建一个部署任务,这里选择“主机部署”

主机部署
按照指引“新建主机组”
主机部署配置
若你的阿里云账号中有阿里云主机,可以直接在添加主机时找到,无需额外配置。若你使用的不是该账号中的主机,或你的主机不是阿里云,则可通过“手动安装Runner”的形式,绑定你的主机(具体操作是复制下面显示的代码并在你的ssh中执行)
image

前端项目

1. 新建流水线

前端项目在前面提到的新建流水线时,可以选择Node.js-测试、构建

新建流水线nodejs

2. Node.js构建

点击“Nodejs构建”,若你的项目位于国外的代码托管平台,可以选择“云效中国香港构建集群”,若位于国内,即选择“云效北京构建集群”。在设置中选择合适的Nodejs版本:

image

设置构建命令,一般情况下如下即可:

npm install
npm run build

设置打包路径,一般情况下设置为dist即可

image

3. 部署脚本设置

这里默认你已经掌握了使用nginx(包括宝塔/1Panel等管理面板)部署上线前端项目的能力

“下载路径”项可以配置为你已经部署的前端项目目录中,这里即是打包产物在主机中下载的位置,我的项目部署在/opt/web-projects/infoguard目录中,设置如下:

image

在静态前端项目中,“部署脚本”的作用比较简单,只需要将已经部署的前端项目目录进行替换即可,并不需要做项目重启等操作。

这里直接在部署目录中解压指定的产物压缩包,tar指令会直接覆盖已有的项目文件,在解压后,你也可以自行使用rm -rf指令,对压缩包进行删除,这里的操作比较自由,可举一反三。

cd /opt/web-projects/infoguard
tar -zxvf package.tgz

后端项目

1. 新建流水线

前端项目在前面提到的新建流水线时,可以选择Java·构建、部署到阿里云ECS/自有主机

新建流水线java

2. Java构建上传

点击“Java构建上传”,若你的项目位于国外的代码托管平台,可以选择“云效中国香港构建集群”,若位于国内,即选择“云效北京构建集群”。在设置中选择合适的java版本:

image

设置构建命令,若是以maven构建的springboot项目,一般情况下如下即可:

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

设置打包路径,设置为target/打包之后的文件名.jar

3. 部署脚本设置

此处默认你已经实现了后端项目的部署,并能够通过接口测试工具测通接口

“下载路径”项可以配置为你已经部署的后端项目所在的目录,这里即是打包产物在主机中下载的位置,我的项目部署在/home/admin/app目录中,设置如下:

image

部署后端项目和静态页面不同点在于,后端项目不仅需要覆盖原有的项目文件,还需要运行。在这里我们提供一个运行脚本供大家参考,他的主要功能是检测该项目是否在运行 -> 若在运行,关闭项目 -> 替换项目包 -> 重启项目

在部署目录下新建deploy.sh文件,在该文件中写入以下内容:

#!/bin/bash
# 这里可替换为你自己的执行程序,其他代码无需更改,绝对路径相对路径均可。
# 若使用jenkins等工具远程构建,则使用绝对路径,下面的日志输出路径同!
APP_NAME=/opt/codeup/application/account01-0.0.1-SNAPSHOT.jar
SERVER_PORT=2204
LOGS_DIR=/opt/codeup/log.txt

# 使用说明,用来提示输入参数 仅在输入错误时提示使用。
usage() {
 echo "Usage: sh 脚本名.sh [start|stop|restart|status]"
 exit 1
}
  
#检查程序是否在运行
is_exist(){
 pid=`ps -ef|grep $APP_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 "${APP_NAME} is already running. pid=${pid} ."
 else
 nohup java -jar -Xmx1024M -Xms256M  ${APP_NAME} --server.port=${SERVER_PORT} > ${LOGS_DIR} 2>&1 &
 echo "${APP_NAME} start success"
 fi
}
  
#停止方法
stop(){
 is_exist
 if [ $? -eq "0" ]; then
 kill -9 $pid
 else
 echo "${APP_NAME} is not running"
 fi
}
  
#输出运行状态
status(){
 is_exist
 if [ $? -eq "0" ]; then
 echo "${APP_NAME} is running. Pid is ${pid}"
 else
 echo "${APP_NAME} is NOT running."
 fi
}
  
#重启
restart(){
 stop
 start
}
  
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
 "start")
 start
 ;;
 "stop")
 stop
 ;;
 "status")
 status
 ;;
 "restart")
 restart
 ;;
 *)
 usage
 ;;
esac

在脚本中可以看到我们使用到log.txt,这是项目运行日志存放的位置,所以在运行脚本前,也需要在运行目录下新建一个log.txt(内容为空即可)备用

这里直接在部署目录中解压指定的产物压缩包,tar指令会直接覆盖已有的项目文件,在解压后,你也可以自行使用rm -rf指令,对压缩包进行删除。接下来使用sh对后端项目进行重启:

mkdir -p /home/admin/application
tar zxvf /home/admin/app/package.tgz -C /home/admin/application/

sh /home/admin/application/deploy.sh restart

总结

至此,你已经大致完成了云效流水线的配置,只需要向git仓库推送代码,坐等几分钟,你的新项目就可以被部署完成啦。云效流水线还有许多值得研究的配置,大家可以自己探索探索,本文的主要意图,还是向大家介绍这样一个实用的工具,具体如何使用,还是需要各位自由发挥!