从手动到自动化:我的Shell脚本部署优化之路
记得刚入行时,每次项目上线都要重复执行十几条命令,稍不留神就会漏掉某个步骤。直到有次凌晨三点部署出错,我才痛定思痛开始研究自动化部署方案。今天就来分享我这几年积累的Shell脚本部署实战经验。
为什么选择Shell脚本?
刚开始考虑过各种CI/CD工具,但发现对于中小项目来说,一个精心编写的Shell脚本往往是最轻量高效的解决方案。它不需要额外依赖,直接在Linux环境运行,而且调试起来特别直观——这在我后来无数次的深夜debug中得到了验证。
基础框架搭建
这是我常用的脚本骨架,包含了错误处理和日志记录:
#!/bin/bash
set -euo pipefail
LOG_FILE="deploy_$(date +%Y%m%d).log"
exec > >(tee -a "$LOG_FILE") 2>&1
function cleanup() {
# 异常时的清理操作
echo "[$(date)] 部署中断,正在回滚..."
}
trap cleanup ERR
echo "====== 开始部署 $(date) ======"
# 实际部署逻辑...
那些年我踩过的坑
1. 权限问题:有次脚本在sudo环境下运行,结果创建的文件全是root权限,导致后续步骤失败。现在我会在脚本开头显式检查:
if [ "$(id -u)" -eq 0 ]; then
echo "请勿使用root权限执行!"
exit 1
fi
2. 环境变量:曾经因为没source ~/.bashrc导致命令找不到,现在我会在脚本中显式加载:
source ~/.bashrc || true
export PATH=$PATH:/usr/local/bin
实用技巧分享
1. 进度显示:长时间操作时添加进度提示:
function show_spinner() {
local pid=$1
local delay=0.25
while kill -0 $pid 2>/dev/null; do
for s in / - \ |; do
printf "r$s 处理中..."
sleep $delay
done
done
}
2. 参数处理:使用getopts实现灵活的传参:
while getopts "e:p:" opt; do
case $opt in
e) env=$OPTARG ;;
p) port=$OPTARG ;;
*) echo "用法: $0 [-e 环境] [-p 端口]" ;;
esac
done
我的部署脚本进化史
从最初20行的简单命令集合,到现在300多行的智能部署系统,我的脚本经历了:
- 第一代:直白的命令堆砌
- 第二代:添加错误处理和日志
- 第三代:支持多环境配置
- 第四代:集成健康检查和自动回滚
最近还在尝试加入Telegram通知功能,部署结果实时推送到手机。不得不说,看着自己的脚本越来越”聪明”,这种成就感比涨薪还让人开心(当然涨薪也很重要)。
给新手的建议
1. 先写伪代码梳理流程
2. 每个函数不要超过20行
3. 一定要写注释!三个月后的你会感谢现在的自己
4. 用ShellCheck检查语法问题
5. 重要操作前加confirm确认
最后分享一个真理:最好的脚本永远是下一个。每次回头看半年前写的代码都会觉得惨不忍睹,这说明你在进步。现在就开始写你的第一个部署脚本吧,遇到问题欢迎在评论区交流!
Shell脚本确实是小项目的神器,我之前手动部署经常漏步骤,现在用脚本省心多了!