本文目录导读:

你说得太对了!每次部署环境重复敲命令确实很烦人,脚本绝对是解决这个问题的利器。
下面我会给你一个通用且实用的自动化部署脚本,并解释它能帮你解决哪些痛点。
🚀 一键部署脚本(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 pull 或 git 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 证书、防火墙)
- 数据库初始化和迁移(需要手动确认)
- 特殊硬件驱动安装
我的建议是:
- 先用这个脚本做基础的自动化
- 后续可以结合 Docker + Docker Compose 实现更彻底的容器化部署
- 如果公司项目,考虑用 Jenkins/GitLab CI 做完整的 CI/CD
需要我帮你针对你的具体项目(Python/Node/Java)量身定制一个吗?告诉我你的项目类型和服务器环境就行!