两种场景:

  1. 服务器不能上外网。
  2. 服务器可以上外网。

场景一,服务器不能上外网

需求

  • 需要在一台不能上外网的 CentOS7 服务器 A 上部署前后端分离的项目,采用 spring boot + react,需要在有代码更新之后,可以一键部署最新版本。
  • 服务器 A 限制上外网,是基于业务和安全方面的考虑。
  • 那么问题来了,这台服务器不能上外网,意味着不能下载依赖,无论是 spring boot 项目还是 react 项目,都需要下载依赖才能编译的。

前置知识

方案,用 shell 脚本搞定一切

  • 需要一台可以上外网的 CentOS7 服务器(可以是虚拟机)B,这台服务器可以访问服务器 A。
  • 当需要部署新版时,执行服务器 B 上的部署脚本,执行一次即可,相当于一键部署,可极大的节约部署时间成本。

以下是具体步骤:

  • 项目代码托管可以采用 gitee.com、github.com、coding.net 等,也可以自己搭建,可参考:CentOS 7.5 借助 Gitolite 管理 Git 项目
  • 在服务器 B 上配置无密码获取代码,如果是自己搭建 git server,这可以通过前置知识介绍的,用 SSH 公钥建立信任关系达到,如果用第三方比如 gitee.com,也是可以利用公钥或私钥来达到目的。
  • 服务器 B 上的 shell 部署脚本,功能是:
    • 获取最新代码。
    • 编译。
    • 通过前置知识介绍的 scp 无密传输文件的方式,将编译好的文件上传到服务器 A 的固定目录,如:~/upload。
      • 针对 spring boot 项目,需要上传 boot 项目的 jar/war 包。
      • 针对前端项目,则把编译好的文件(我用的是 Ant Design Pro,编译文件存放在 dist 目录)打包再上传,假如打包后的文件名是:UI.tar.gz
    • 通过前置知识介绍的 ssh 执行远程服务器上脚本的方式,执行服务器 A 上的部署脚本。
  • 服务器 A 上的部署脚本功能如下:
    • 针对 spring boot 项目,这里以 tomcat 运行的方式为例:
      • 停止 tomcat。如果该 tomcat 部署的是后台任务,停止 tomcat 之前先停止后台任务,延时 10 来秒(可自己定义)之后再停止 tomcat。
      • 删除 app 目录下的所有文件,解压新的 war 包到 app 目录,恢复配置文件至 app 目录/WEB-INF/classes/。配置文件是单独存放的。
      • 启动 tomcat。
    • 针对前端 react 项目,因为是静态网页文件,所以可以简单粗暴的作如下两步操作:
      • 删除 app 目录下的所有文件。
      • 解压新版本 tar 包 UI.tar.gz(从服务器 B 上传)至 app 目录下。
      • 由于前端是静态网页,使用 nginx 部署,不需要重启,客户端重新访问的时候会自动更新。

场景二,服务器可以上外网

当然,可以上外网也可以采用方案一的方式,只不过,可以把方案一中的服务器 A 和服务器 B 合二为一。

这里介绍另外一种方式,借助强大的 jenkins 来实现,参考:CentOS 7.5 jenkins + Maven + Git + Tomcat 一键发布