自动化部署 #
一、基本部署流程 #
bash
#!/bin/bash
deploy() {
local app_name="$1"
local deploy_dir="/var/www/$app_name"
local backup_dir="/backup/$app_name"
# 1. 拉取代码
log "拉取最新代码..."
git pull origin main
# 2. 安装依赖
log "安装依赖..."
npm install --production
# 3. 备份旧版本
log "备份旧版本..."
backup_current "$deploy_dir" "$backup_dir"
# 4. 部署新版本
log "部署新版本..."
rsync -av --delete ./ "$deploy_dir/"
# 5. 重启服务
log "重启服务..."
systemctl restart "$app_name"
log "部署完成!"
}
二、零停机部署 #
bash
#!/bin/bash
zero_downtime_deploy() {
local app_name="$1"
local port="${2:-8080}"
local new_port=$((port + 1))
# 启动新实例
log "启动新实例..."
PORT=$new_port npm start &
local new_pid=$!
# 等待新实例就绪
wait_for_port "localhost" "$new_port"
# 切换流量
log "切换流量..."
update_nginx_upstream "$app_name" "$new_port"
# 停止旧实例
log "停止旧实例..."
pkill -f "PORT=$port"
log "零停机部署完成!"
}
三、完整部署脚本 #
bash
#!/bin/bash
set -euo pipefail
APP_NAME="${1:-myapp}"
DEPLOY_DIR="/var/www/$APP_NAME"
GIT_REPO="git@github.com:user/repo.git"
BRANCH="main"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$APP_NAME] $*"
}
error() {
log "[ERROR] $*"
exit 1
}
pre_deploy() {
log "预部署检查..."
# 检查git
command -v git >/dev/null || error "git未安装"
# 检查目录
mkdir -p "$DEPLOY_DIR"
}
pull_code() {
log "拉取代码..."
cd "$DEPLOY_DIR"
if [ -d ".git" ]; then
git fetch origin
git reset --hard "origin/$BRANCH"
else
git clone -b "$BRANCH" "$GIT_REPO" .
fi
}
install_deps() {
log "安装依赖..."
if [ -f "package.json" ]; then
npm install --production
elif [ -f "requirements.txt" ]; then
pip install -r requirements.txt
fi
}
restart_service() {
log "重启服务..."
systemctl restart "$APP_NAME"
# 健康检查
sleep 5
systemctl is-active --quiet "$APP_NAME" || error "服务启动失败"
}
main() {
log "开始部署 $APP_NAME"
pre_deploy
pull_code
install_deps
restart_service
log "部署完成!"
}
main "$@"
四、总结 #
恭喜你完成了Shell脚本完全指南的学习!现在你已经掌握了从基础到高级的Shell脚本编程技能,可以开始编写自己的Shell脚本了!
继续学习和实践,不断提升你的Shell脚本编程能力!
最后更新:2026-03-27