面试题答案
一键面试以下是一个满足要求的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
此脚本架构通过以下方式满足要求:
- 任务依赖处理:按照顺序执行编译和测试任务,确保测试依赖于编译成功。
- 并发执行任务:使用
&
符号将部署任务放到后台并发执行,并使用wait
等待所有部署任务完成。 - 错误处理:每个任务中使用
||
捕获命令执行失败,并调用handle_error
函数进行错误处理,包括记录日志、通知相关人员和回滚任务。 - 日志记录:使用
tee -a $LOG_FILE
将日志同时输出到控制台和日志文件。