Git 部署 #

Git 部署概述 #

Git 是 Heroku 最常用的部署方式,通过 git push 命令即可将代码部署到 Heroku。

部署流程 #

text
┌─────────────────────────────────────────────────────┐
│              Git 部署流程                            │
├─────────────────────────────────────────────────────┤
│                                                     │
│  1. 本地代码                                        │
│     └── git add . && git commit                     │
│                                                     │
│  2. 推送到 Heroku                                   │
│     └── git push heroku main                        │
│                                                     │
│  3. Heroku 接收代码                                 │
│     └── 检测语言,运行 Buildpack                    │
│                                                     │
│  4. 构建应用                                        │
│     └── 安装依赖,编译代码                          │
│                                                     │
│  5. 创建 Slug                                       │
│     └── 打包应用和运行时                            │
│                                                     │
│  6. 创建 Release                                    │
│     └── Slug + Config Vars                          │
│                                                     │
│  7. 部署 Dyno                                       │
│     └── 启动应用进程                                │
│                                                     │
└─────────────────────────────────────────────────────┘

远程仓库配置 #

创建应用时自动配置 #

bash
# 创建应用时自动添加 Git 远程仓库
heroku create

# 输出示例
# Creating sharp-rain-871... done, stack is heroku-22
# https://sharp-rain-871.herokuapp.com/ | https://git.heroku.com/sharp-rain-871.git

手动添加远程仓库 #

bash
# 为现有应用添加远程仓库
heroku git:remote -a your-app-name

# 指定远程名称
heroku git:remote -a your-app-name -r heroku-staging

# 查看远程仓库
git remote -v

# 输出示例
# heroku  https://git.heroku.com/your-app-name.git (fetch)
# heroku  https://git.heroku.com/your-app-name.git (push)

多环境配置 #

bash
# 添加多个远程仓库
heroku git:remote -a myapp-staging -r staging
heroku git:remote -a myapp-production -r production

# 查看远程仓库
git remote -v

# 输出示例
# staging     https://git.heroku.com/myapp-staging.git (fetch)
# staging     https://git.heroku.com/myapp-staging.git (push)
# production  https://git.heroku.com/myapp-production.git (fetch)
# production  https://git.heroku.com/myapp-production.git (push)

部署命令 #

基本部署 #

bash
# 部署 main 分支
git push heroku main

# 部署 master 分支
git push heroku master

# 部署到指定远程
git push staging main
git push production main

分支部署 #

bash
# 将本地分支推送到 Heroku main 分支
git push heroku feature-branch:main

# 将 develop 分支部署到 staging
git push staging develop:main

# 将 release 分支部署到 production
git push production release-1.0:main

强制部署 #

bash
# 强制推送(谨慎使用)
git push heroku main --force

# 强制推送非历史提交
git push heroku main --force-with-lease

部署配置 #

app.json #

在项目根目录创建 app.json 文件配置应用:

json
{
  "name": "my-awesome-app",
  "description": "A sample Heroku app",
  "repository": "https://github.com/username/my-awesome-app",
  "logo": "https://example.com/logo.png",
  "keywords": ["nodejs", "express", "heroku"],
  "image": "heroku/nodejs",
  "buildpacks": [
    {
      "name": "heroku/nodejs"
    }
  ],
  "env": {
    "NODE_ENV": {
      "description": "Node environment",
      "value": "production"
    },
    "SECRET_KEY": {
      "description": "A secret key for signing cookies",
      "generator": "secret"
    }
  },
  "formation": {
    "web": {
      "quantity": 1,
      "size": "eco"
    }
  },
  "addons": [
    {
      "plan": "heroku-postgresql:mini"
    },
    {
      "plan": "heroku-redis:mini"
    }
  ],
  "scripts": {
    "postdeploy": "npm run db:migrate"
  }
}

部署脚本 #

json
// package.json
{
  "scripts": {
    "heroku-prebuild": "echo 'Pre-build script'",
    "heroku-postbuild": "npm run build",
    "build": "webpack --mode production"
  }
}

Heroku 特定脚本 #

脚本 执行时机
heroku-prebuild 构建前执行
heroku-postbuild 构建后执行
postdeploy 首次部署后执行

部署策略 #

生产环境部署流程 #

bash
# 1. 确保代码已提交
git status

# 2. 运行测试
npm test

# 3. 部署到 staging
git push staging main

# 4. 验证 staging 环境
heroku open --app myapp-staging

# 5. 部署到 production
git push production main

# 6. 监控部署状态
heroku logs --tail --app myapp-production

蓝绿部署 #

bash
# 使用 Pipeline 实现蓝绿部署
# 1. 创建 Pipeline
heroku pipelines:create myapp-pipeline -a myapp-staging -s staging

# 2. 添加生产应用
heroku pipelines:add myapp-pipeline -a myapp-production -s production

# 3. 推广到生产
heroku pipelines:promote -a myapp-staging

部署回滚 #

查看发布历史 #

bash
# 查看发布历史
heroku releases

# 输出示例
# === myapp Releases
# v10  Deploy 9a8b7c6d  me@example.com  2024/01/15 15:30:00
# v9   Config set FOO   me@example.com  2024/01/15 14:00:00
# v8   Deploy 8a7b6c5d  me@example.com  2024/01/15 10:00:00

# 查看特定版本详情
heroku releases:info v10

回滚操作 #

bash
# 回滚到上一个版本
heroku rollback

# 回滚到指定版本
heroku rollback v8

# 输出示例
# Rolling back myapp... done, v8

回滚注意事项 #

text
┌─────────────────────────────────────────────────────┐
│              回滚注意事项                            │
├─────────────────────────────────────────────────────┤
│                                                     │
│  ✓ 回滚代码和配置                                   │
│  ✗ 不回滚数据库变更                                 │
│  ✗ 不回滚 Add-ons 数据                              │
│                                                     │
│  建议:                                             │
│  1. 数据库迁移使用可逆迁移                          │
│  2. 回滚前备份数据                                  │
│  3. 先在 staging 环境测试                           │
│                                                     │
└─────────────────────────────────────────────────────┘

部署钩子 #

Webhooks #

bash
# 添加部署 webhook
heroku webhooks:add --url https://example.com/webhook --secret your-secret

# 查看所有 webhook
heroku webhooks

# webhook 载荷示例
{
  "action": "create",
  "actor": {
    "email": "user@example.com",
    "id": "user-uuid"
  },
  "data": {
    "app": {
      "id": "app-uuid",
      "name": "myapp"
    },
    "release": {
      "id": "release-uuid",
      "version": 10
    },
    "status": "succeeded"
  },
  "created_at": "2024-01-15T10:30:00Z"
}

部署通知 #

bash
# 使用 Slack 通知
heroku addons:create papertrail:choklad
# 在 Papertrail 中配置 Slack 通知

# 使用 Heroku CLI 发送通知
heroku addons:create deployhooks:email --recipient=user@example.com

部署优化 #

减少构建时间 #

bash
# 1. 使用 .slugignore 排除不需要的文件
# .slugignore
node_modules/.cache/
test/
*.md
.git/

# 2. 缓存依赖
# Buildpack 会自动缓存 node_modules 等

# 3. 清理构建缓存
heroku builds:cache:purge

减少 Slug 大小 #

bash
# 查看 Slug 大小
heroku run "du -sh /app"

# 优化建议
# 1. 移除开发依赖
npm prune --production

# 2. 压缩资源
# 3. 使用 .slugignore
# 4. 避免大文件

并行构建 #

bash
# 使用 Buildpack 并行构建
# 在 app.json 中配置
{
  "buildpacks": [
    {"name": "heroku/nodejs"},
    {"name": "heroku/ruby"}
  ]
}

部署故障排查 #

常见错误 #

bash
# 1. 推送被拒绝
# ! [rejected] main -> main (non-fast-forward)
# 解决:先拉取或强制推送
git pull heroku main --rebase
git push heroku main

# 2. Buildpack 未检测到
# 解决:手动指定 buildpack
heroku buildpacks:set heroku/nodejs

# 3. 构建超时
# 解决:检查构建脚本,优化依赖安装

查看构建日志 #

bash
# 查看最近构建日志
heroku builds:output

# 查看特定构建
heroku builds:output --build-id build-uuid

# 列出所有构建
heroku builds

调试构建 #

bash
# 使用 heroku run 调试
heroku run bash

# 检查文件
heroku run "ls -la /app"

# 检查环境
heroku run "env | grep NODE"

CI/CD 集成 #

GitHub Actions #

yaml
# .github/workflows/deploy.yml
name: Deploy to Heroku

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: Deploy to Heroku
        uses: akhileshns/heroku-deploy@v3.13.15
        with:
          heroku_api_key: ${{ secrets.HEROKU_API_KEY }}
          heroku_app_name: "your-app-name"
          heroku_email: "your-email@example.com"

GitLab CI #

yaml
# .gitlab-ci.yml
stages:
  - deploy

deploy_to_heroku:
  stage: deploy
  script:
    - apt-get update -qy
    - apt-get install -y ruby-dev
    - gem install dpl
    - dpl --provider=heroku --app=your-app-name --api-key=$HEROKU_API_KEY
  only:
    - main

部署最佳实践 #

1. 分支策略 #

text
main ─────────────────────────────────────►
  │                                        │
  │   ┌─────────┐                         │
  └──►│ staging │ ──► 测试 ──► production │
      └─────────┘                         │
                                          │
feature/* ──► PR ──► main ────────────────┘

2. 部署检查清单 #

markdown
## 部署前检查
- [ ] 所有测试通过
- [ ] 代码已审查
- [ ] 环境变量已配置
- [ ] 数据库迁移已准备
- [ ] 回滚计划已制定

## 部署后验证
- [ ] 应用正常启动
- [ ] 关键功能正常
- [ ] 日志无错误
- [ ] 性能指标正常

3. 零停机部署 #

bash
# 使用 Preboot 功能(Performance Dyno)
heroku features:enable preboot

# 部署时新 Dyno 先启动
# 然后切换流量
# 最后关闭旧 Dyno

下一步 #

Git 部署掌握后,接下来学习 GitHub 集成 了解自动化部署流程!

最后更新:2026-03-28