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