使用 deploy 工具部署

deploy 工具简介

为了简化部署流程,提高部署效率,我开发了一款名为 deploy 的工具,用于将 tio-boot 工程快速部署到自有服务器上。该工具分为客户端和服务端,用户需要先在服务器上安装服务端,才能通过客户端进行部署操作。工具已开源,源码地址如下:

服务端安装

关于如何安装服务端的详细步骤请参阅项目文档,此处略过。

deploy 工具使用

打包配置文件 .build.txt

该文件用于配置项目在不同操作系统上的打包命令,示例如下:

[win.env]
set JAVA_HOME=D:\java\jdk1.8.0_121

[win.build]
mvn clean package -DskipTests -Pproduction

[linux.env]
export JAVA_HOME=/usr/java/jdk1.8.0_121

[linux.build]
mvn clean package -DskipTests -Pproduction

[mac.env]
set JAVA_HOME=~/java/jdk1.8.0_121

[mac.build]
mvn clean package -DskipTests -Pproduction

此文件定义了在 Windows、Linux 和 macOS 系统上的 Java 环境变量配置及 Maven 打包命令,确保在各平台下能正确构建项目。

部署配置文件 .deploy.toml

部署配置文件用于定义不同环境的部署操作,示例如下:

[dev.upload-run]
url = "http://192.168.1.2:10405/deploy/file/upload-run/"
p = "123456"
b = ".build.txt"
z ="app.zip target/dynamic-css-1.0.0.jar"
file = "app.zip"
d = "unzip/dynamic-css"
c1 = "mkdir -p /data/apps/dynamic-css"
c2 = "[ -d /data/apps/dynamic-css ] && cp -r /data/apps/dynamic-css backup/dynamic-css-backup-$(date +'%Y%m%d_%H%M%S')"
c3 = "cp unzip/dynamic-css/target/dynamic-css-1.0.0.jar /data/apps/dynamic-css/"
c4 = "if [ $(docker ps -q -f name=dynamic-css) ]; then docker stop dynamic-css && docker rm -f dynamic-css; fi"
c5 = "cd /data/apps/dynamic-css && docker run -dit --name dynamic-css --restart=always --net=host -v $(pwd):/app -w /app -e TZ=Asia/Shanghai -e LANG=C.UTF-8 litongjava/jdk:8u391-stable-slim java -jar dynamic-css-1.0.0.jar"
c = "docker ps |grep dynamic-css"

该配置文件定义了 dev(开发)、test(测试)和 prod(生产)三个环境下的部署流程。以 dev.upload-run 为例,解释如下:

  • url: 上传文件的服务端地址。
  • p: 密码,用于身份验证。
  • b: 指定打包配置文件。
  • z: 指定需要压缩的文件列表。
  • file: 指定上传的压缩包文件名。
  • d: 解压路径。
  • c1-c5: 一系列的 Shell 命令,用于创建目录、备份旧版本、复制新文件、停止并删除旧容器、启动新容器等操作。
  • c: 最终检查容器是否成功启动的命令。

执行部署命令

通过命令行工具 deploy,可以轻松地在不同环境中执行部署操作:

  • 开发环境:

    deploy
    
  • 测试环境:

    deploy -e test
    
  • 生产环境:

    deploy -e prod
    

运行流程

deploy 工具的运行流程如下:

  1. 编译: 根据 .build.txt 配置进行项目编译。
  2. 压缩打包: 将编译生成的文件压缩为 .zip 包。
  3. 上传解压: 将压缩包上传至服务器并解压。
  4. 备份旧目录: 将旧版本备份,以便回滚操作。
  5. 复制到指定目录: 将新文件复制到指定的部署目录中。
  6. 删除旧容器: 停止并删除旧的 Docker 容器。
  7. 启动新容器: 使用新的镜像和配置启动新的 Docker 容器。
  8. 检查容器: 最终检查新容器是否成功启动。

部署成功后的反馈信息

部署成功后,deploy 工具会返回相关的执行信息,例如:

response status code: 200
{"success":true,"output":"7636aec41b4b   litongjava/jdk:8u391-stable-slim        \"java -jar dynamic-c…\"   Less than a second ago   Up Less than a second dynamic-css\n","time":0}

这段信息表明新容器已成功启动,运行状态正常。

完整的部署文件

[dev.upload-run]
url = "http://192.168.1.2:10405/deploy/file/upload-run/"
p = "123456"
b = ".build.txt"
z ="app.zip target/dynamic-css-1.0.0.jar"
file = "app.zip"
d = "unzip/dynamic-css"
c1 = "mkdir -p /data/apps/dynamic-css"
c2 = "[ -d /data/apps/dynamic-css ] && cp -r /data/apps/dynamic-css backup/dynamic-css-backup-$(date +'%Y%m%d_%H%M%S')"
c3 = "cp unzip/dynamic-css/target/dynamic-css-1.0.0.jar /data/apps/dynamic-css/"
c4 = "if [ $(docker ps -q -f name=dynamic-css) ]; then docker stop dynamic-css && docker rm -f dynamic-css; fi"
c5 = "cd /data/apps/dynamic-css && docker run -dit --name dynamic-css --restart=always --net=host -v $(pwd):/app -w /app -e TZ=Asia/Shanghai -e LANG=C.UTF-8 litongjava/jdk:8u391-stable-slim java -jar dynamic-css-1.0.0.jar"
c = "docker ps |grep dynamic-css"

[test.upload-run]
url = "http://xxxx:10405/deploy/file/upload-run/"
p = "xxxx"
b = ".build.txt"
z ="app.zip target/dynamic-css-1.0.0.jar"
file = "app.zip"
d = "unzip/dynamic-css"
c1 = "mkdir -p /data/apps/dynamic-css"
c2 = "[ -d /data/apps/dynamic-css ] && cp -r /data/apps/dynamic-css backup/dynamic-css-backup-$(date +'%Y%m%d_%H%M%S')"
c3 = "cp unzip/dynamic-css/target/dynamic-css-1.0.0.jar /data/apps/dynamic-css/"
c4 = "if [ $(docker ps -q -f name=dynamic-css) ]; then docker stop dynamic-css && docker rm -f dynamic-css; fi"
c5 = "cd /data/apps/dynamic-css && docker run -dit --name dynamic-css --restart=always --net=host -v $(pwd):/app -w /app -e TZ=Asia/Shanghai -e LANG=C.UTF-8 litongjava/jdk:8u391-stable-slim java -jar dynamic-css-1.0.0.jar --app.env=test"
c = "docker ps |grep dynamic-css"

[prod.upload-run]
url = "http://xxxx:10405/deploy/file/upload-run/"
p = "xxxx"
b = ".build.txt"
z ="app.zip target/dynamic-css-1.0.0.jar"
file = "app.zip"
d = "unzip/dynamic-css"
c1 = "mkdir -p /data/apps/dynamic-css"
c2 = "[ -d /data/apps/dynamic-css ] && cp -r /data/apps/dynamic-css backup/dynamic-css-backup-$(date +'%Y%m%d_%H%M%S')"
c3 = "cp unzip/dynamic-css/target/dynamic-css-1.0.0.jar /data/apps/dynamic-css/"
c4 = "if [ $(docker ps -q -f name=dynamic-css) ]; then docker stop dynamic-css && docker rm -f dynamic-css; fi"
c5 = "cd /data/apps/dynamic-css && docker run -dit --name dynamic-css --restart=always --net=host -v $(pwd):/app -w /app -e TZ=Asia/Shanghai -e LANG=C.UTF-8 litongjava/jdk:8u391-stable-slim java -jar dynamic-css-1.0.0.jar --app.env=prod"
c = "docker ps |grep dynamic-css"