MST
星途 面试题库

面试题:优化复杂Bash脚本代码发布流程中的并发控制与错误处理

在一个复杂的代码发布流程中,你需要使用Bash脚本完成多个任务,例如编译代码、运行测试、部署到多个服务器等。这些任务之间存在依赖关系,同时有些任务可以并发执行以提高效率。请设计一个Bash脚本架构,能够有效处理任务间的依赖关系、实现并发执行任务,并且在任务执行出错时能够进行优雅的错误处理,包括回滚已完成的任务、记录详细错误日志以及通知相关人员。
12.3万 热度难度
编程语言Bash

知识考点

AI 面试

面试题答案

一键面试

以下是一个满足要求的Bash脚本架构示例:

#!/bin/bash

# 定义日志文件路径
LOG_FILE="release.log"

# 定义通知函数
notify() {
    local message="$1"
    # 这里可以根据实际情况选择通知方式,例如邮件、即时通讯工具等
    echo "通知相关人员: $message"
}

# 定义错误处理函数
handle_error() {
    local error_message="$1"
    local task_name="$2"
    echo "$(date): 任务 $task_name 出错: $error_message" | tee -a $LOG_FILE
    notify "任务 $task_name 出错: $error_message"
    # 回滚已完成的任务,这里根据具体任务实现回滚逻辑
    # 例如,如果部署了服务器,可能需要删除部署的文件等
    echo "$(date): 开始回滚任务 $task_name" | tee -a $LOG_FILE
    # 实现具体回滚代码
    exit 1
}

# 定义编译任务
compile_code() {
    echo "$(date): 开始编译代码" | tee -a $LOG_FILE
    # 实际编译命令,例如make
    make || handle_error "编译失败" "compile_code"
    echo "$(date): 代码编译完成" | tee -a $LOG_FILE
}

# 定义运行测试任务
run_tests() {
    echo "$(date): 开始运行测试" | tee -a $LOG_FILE
    # 实际测试命令,例如python -m unittest
    python -m unittest || handle_error "测试失败" "run_tests"
    echo "$(date): 测试运行完成" | tee -a $LOG_FILE
}

# 定义部署到单个服务器的任务
deploy_to_server() {
    local server="$1"
    echo "$(date): 开始部署到服务器 $server" | tee -a $LOG_FILE
    # 实际部署命令,例如scp、ssh等
    scp -r./dist $server:/deploy/path || handle_error "部署到 $server 失败" "deploy_to_$server"
    ssh $server "systemctl restart my_service" || handle_error "重启 $server 服务失败" "deploy_to_$server"
    echo "$(date): 部署到服务器 $server 完成" | tee -a $LOG_FILE
}

# 主函数
main() {
    # 编译代码
    compile_code

    # 运行测试
    run_tests

    # 定义服务器列表
    servers=("server1" "server2" "server3")

    # 并发部署到服务器
    for server in "${servers[@]}"; do
        deploy_to_server $server &
    done

    # 等待所有部署任务完成
    wait

    echo "$(date): 所有任务完成" | tee -a $LOG_FILE
}

# 执行主函数
main

此脚本架构通过以下方式满足要求:

  1. 任务依赖处理:按照顺序执行编译和测试任务,确保测试依赖于编译成功。
  2. 并发执行任务:使用 & 符号将部署任务放到后台并发执行,并使用 wait 等待所有部署任务完成。
  3. 错误处理:每个任务中使用 || 捕获命令执行失败,并调用 handle_error 函数进行错误处理,包括记录日志、通知相关人员和回滚任务。
  4. 日志记录:使用 tee -a $LOG_FILE 将日志同时输出到控制台和日志文件。