自动化部署 #

一、基本部署流程 #

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