基于在Jenkins中根据配置从不同的仓库中Checkout代码一文,说明如何利用shell脚本在Linux系统中实现自动化的部署与升级。

流程图

整体流程如下图所示:

  1. 首先让用户选择要升级的类别和模块,并对用户选择进行校验,若不合法则升级过程终止
  2. 根据用户选择去相关目录下查看对应的文件是否存在,若不存在则升级过程终止
  3. 若文件存在则对其进行解压,并读取其中的配置文件信息1
  4. 检查对应的容器,将其停止并删除
  5. 导入相关镜像
  6. 拼接docker语句并执行,展示执行结果
flowchart TD START((开始部署)):::start FAIL((部署失败)):::failed SUCCESS((部署成功)):::success subgraph deploy_select [输入选择] A1[选择类别]:::input --> A2{类别是否有效} A2 -->|类别有效| A3[选择模块]:::input A3 --> A4{模块是否有效} A4 -->|模块有效| A5[(记录用户选择)] end subgraph parse_file [解析文件] B1[查找文件] --> B2{文件是否存在} B2 -->|文件存在| B3[解压文件] B3 --> B4[读取ini配置文件] B4 --> B5[/输出用户选择与配置文件信息/] end subgraph deploy_process [开始部署] C1{容器是否运行} -->|容器运行|C2[停止容器] C1 -->|容器未运行| C3[删除容器] C2 --> C3 C3 --> C4[导入镜像]:::input C4 --> C5[拼接docker字符串] C5 --> C6[打印要执行的docker语句] C6 --> C7[执行docker语句] C7 --> C8{docker容器是否执行成功} C8 -->|docker执行成功|C9 end START --> A1 A2 -->|类别无效| FAIL A4 -->|模块无效| FAIL A5 --> B1 B2 -->|文件不存在|FAIL B5 --> C5 C8 -->|docker执行失败|FAIL C9 --> SUCCESS classDef start fill:#374bad,color:#ffffff,font-weight:bold,stroke-width:0 classDef failed fill:#f5425d,color:#ffffff,font-weight:bold,stroke-width:0 classDef input fill:#ad5537,color:#ffffff,stroke-width:0 classDef success fill:#37ad61,color:#ffffff,font-weight:bold,stroke-width:0

使用说明

此部分操作主要基于前述的流程以shell脚本的形式实现,相关源码参见deploy.sh,具体操作流程如下:

  • deploy.sh拷贝到Linux服务器的某个目录下,然后在该目录下建立一个名为**target**的目录,将导出的镜像文件放到target目录下

    服务中要升级的镜像与脚本目录结构

  • 执行./deploy命令并按下Enter键,终端会出现如下输出,让我们选择要升级的系统为前端还是后端

    选择要升级的类型

  • 根据提示选择对应的类别,若升级类型为前端则输入1,若升级类型为后端则输入2,之后按下Enter键则系统会进一步提示选择对应的模块

    选择要升级的模块

    若输入的类型不合法,则升级脚本会给出对应的提示,同时整个升级过程立即终止

    错误的输入参数导致升级中断

  • 若要部署的模块在target目录下不存在或选择的模块不是选择列表的模块,升级脚本同样会给出提示,同时整个升级过程立即终止

    找不到要升级的文件

    若部署的模块在target目录下存在多份,则会根据文件名中附带的时间戳进行排序,寻找最近的一份文件进行升级

    1
    2
    3
    4
    5
    6
    7
    
    # 校验升级文件是否存在
    file=$(ls target|sort -r|grep ${module}_20|head -1) # 此条指令根据文件名按时间倒排,取第一个文件来升级
    if [[ -z "$file" ]]
    then
    printf "\033[31mtarget目录下没有对应的文件,升级操作终止,请重新执行./deploy.sh\033[0m\n"
    exit 0
    fi
    
  • 若选择的模块合法,且升级过程一切顺利,Linux终端会输出类似如下信息,提示整个升级过程完成!

    升级过程顺利执行完毕

  • 若升级过程中遇到错误,系统同样会给出提示,可根据错误信息进行初步排查

    升级过程执行失败

待优化点

  • 升级过程缺少记录,无法查看在特定时间范围通过该脚本执行升级的次数,可通过写入文件实现简单的数据库记录
  • 缺少回退功能,在最后启动docker容器失败是,应能将之前关闭的服务启动,确保能持续对外提供服务
  • 对于集群方式部署的docker容器缺少兼容性

  1. 此信息在部署过程中会输出,用于确认版本和配是否正确 ↩︎