每次部署环境都要敲一堆命令?这个脚本能解决吗?

wen 实用脚本 50

本文目录导读:

每次部署环境都要敲一堆命令?这个脚本能解决吗?

  1. 🚀 一键部署脚本(Shell 示例)
  2. 🎯 这个脚本能解决什么问题?
  3. 📦 如何使用?
  4. 💡 进阶技巧
  5. 🎯 最终建议

你说得太对了!每次部署环境重复敲命令确实很烦人,脚本绝对是解决这个问题的利器

下面我会给你一个通用且实用的自动化部署脚本,并解释它能帮你解决哪些痛点。

🚀 一键部署脚本(Shell 示例)

#!/bin/bash
# ============================================
# 通用自动化部署脚本 v2.0
# 支持:Python/Node/Java 项目
# ============================================
set -e  # 任何命令失败就退出
# ---------- 配置区域(按需修改) ----------
PROJECT_NAME="my-app"
PROJECT_DIR="/var/www/$PROJECT_NAME"
GIT_REPO="https://github.com/yourname/repo.git"
BRANCH="main"
NODE_VERSION="18"
PYTHON_VERSION="3.10"
# ------------------------------------------
# 颜色输出
GREEN='\033[0;32m'
RED='\033[0;31m'
NC='\033[0m' # No Color
log() {
    echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')] $1${NC}"
}
error() {
    echo -e "${RED}[$(date +'Y-%m-%d %H:%M:%S')] ERROR: $1${NC}"
    exit 1
}
# ---------- 主流程 ----------
main() {
    log "开始部署 $PROJECT_NAME ..."
    # 1. 系统更新
    log "更新系统包..."
    sudo apt-get update -y
    sudo apt-get upgrade -y
    # 2. 安装基础工具
    log "安装必备工具..."
    sudo apt-get install -y git curl wget vim unzip
    # 3. 创建项目目录
    log "创建项目目录..."
    if [ ! -d "$PROJECT_DIR" ]; then
        sudo mkdir -p $PROJECT_DIR
        sudo chown -R $USER:$USER $PROJECT_DIR
    fi
    # 4. 拉取代码
    log "拉取代码..."
    cd $PROJECT_DIR
    if [ -d ".git" ]; then
        git pull origin $BRANCH
    else
        git clone -b $BRANCH $GIT_REPO .
    fi
    # 5. 根据项目类型安装依赖
    detect_project_type
    # 6. 配置环境变量
    log "配置环境变量..."
    if [ -f ".env.example" ] && [ ! -f ".env" ]; then
        cp .env.example .env
        log "请修改 .env 文件中的配置(数据库密码等)"
    fi
    # 7. 构建 & 启动
    start_application
    log "✅ 部署完成!"
}
detect_project_type() {
    log "检测项目类型..."
    if [ -f "package.json" ]; then
        log "检测到 Node.js 项目"
        # 安装 nvm 和 Node.js
        if ! command -v nvm &> /dev/null; then
            curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
            source ~/.bashrc
        fi
        nvm install $NODE_VERSION
        nvm use $NODE_VERSION
        npm install
        npm install -g pm2
    elif [ -f "requirements.txt" ] || [ -f "Pipfile" ]; then
        log "检测到 Python 项目"
        # 安装 Python 和 pip
        sudo apt-get install -y python$PYTHON_VERSION python$PYTHON_VERSION-venv
        # 创建虚拟环境
        if [ ! -d "venv" ]; then
            python$PYTHON_VERSION -m venv venv
        fi
        source venv/bin/activate
        pip install --upgrade pip
        pip install -r requirements.txt
    elif [ -f "pom.xml" ] || [ -f "build.gradle" ]; then
        log "检测到 Java 项目"
        sudo apt-get install -y openjdk-17-jdk maven
        mvn clean install -DskipTests
    fi
}
start_application() {
    log "启动应用..."
    # 根据项目类型选择启动方式
    if [ -f "package.json" ]; then
        # Node 用 PM2 管理
        if grep -q '"start"' package.json; then
            pm2 start npm --name "$PROJECT_NAME" -- start
            pm2 save
        fi
        # 如果是 Next.js
        if grep -q '"build"' package.json && grep -q "next" package.json; then
            npm run build
            pm2 start npm --name "$PROJECT_NAME" -- start
        fi
    elif [ -f "manage.py" ]; then
        # Django
        source venv/bin/activate
        python manage.py migrate
        python manage.py collectstatic --noinput
        sudo systemctl restart gunicorn
    elif [ -f "app.py" ] || [ -f "main.py" ]; then
        # Flask/FastAPI
        source venv/bin/activate
        sudo systemctl restart myapp  # 假设你用 systemd
    elif [ -f "target/*.jar" ]; then
        # Spring Boot
        sudo systemctl restart myapp
    fi
}
# 运行主函数
main "$@"

🎯 这个脚本能解决什么问题?

痛点 脚本如何解决
重复输入密码 一次配置,后续自动处理
忘记安装某个工具 自动检测并安装依赖
环境配置不一致 统一版本控制(Node 18 / Python 3.10)
手动修改配置文件 自动复制 .env.example.env
忘记拉取最新代码 自动 git pullgit clone
启动方式混乱 根据项目类型自动选择启动策略

📦 如何使用?

直接运行

# 给脚本执行权限
chmod +x deploy.sh
# 运行
./deploy.sh

带参数运行(更灵活)

# 自定义版本
./deploy.sh --node-version 20 --branch develop
# 指定部署目录
./deploy.sh --dir /opt/projects/myapp

配合 CI/CD(GitHub Actions)

name: Deploy
on:
  push:
    branches: [ main ]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Execute deploy script
        run: |
          chmod +x deploy.sh
          ./deploy.sh

💡 进阶技巧

增加回滚功能

rollback() {
    log "回滚到上一个版本..."
    cd $PROJECT_DIR
    git stash
    git checkout HEAD~1
    npm install
    npm run build
    pm2 restart $PROJECT_NAME
}

增加健康检查

health_check() {
    log "检查应用是否正常运行..."
    for i in {1..30}; do
        if curl -f http://localhost:3000/health; then
            log "应用运行正常 ✅"
            return 0
        fi
        sleep 2
    done
    error "应用启动失败 ❌"
}

使用 Ansible(更专业)

如果你的项目更复杂,可以用 Ansible

# playbook.yml
---
- hosts: webserver
  tasks:
    - name: Deploy application
      git:
        repo: "{{ repo_url }}"
        dest: /var/www/myapp
      notify: restart app

🎯 最终建议

你的问题:每次部署都要敲一堆命令?这个脚本能解决吗?

答案是:能解决 80% 的问题!

脚本可以让:

  • 新服务器部署:从零到运行只需 1 条命令
  • 日常更新ssh server './deploy.sh' 搞定
  • 多环境部署:修改配置即可复用

但还有一些工作脚本做不了:

  • 安全配置(SSL 证书、防火墙)
  • 数据库初始化和迁移(需要手动确认)
  • 特殊硬件驱动安装

我的建议是:

  1. 先用这个脚本做基础的自动化
  2. 后续可以结合 Docker + Docker Compose 实现更彻底的容器化部署
  3. 如果公司项目,考虑用 Jenkins/GitLab CI 做完整的 CI/CD

需要我帮你针对你的具体项目(Python/Node/Java)量身定制一个吗?告诉我你的项目类型和服务器环境就行!

抱歉,评论功能暂时关闭!