Heroku buildpack仅在staging流水线触发,prod不触发:特性还是配置错误?
问题
我在两个Heroku Django项目的buildpack配置中都明确添加了heroku/python,但这个buildpack仅在将main分支代码推送到staging流水线部署时触发,通过promote方式部署到production时却不会触发。我的构建是无状态的,符合Heroku流水线设计考量的要求,所有配置变量均在Heroku控制台设置,staging和production各有独立配置,无硬编码,均为动态配置。
现在的核心问题是:当我更新requirements.txt中的Python依赖版本后,如何让Heroku在production环境中触发buildpack重建slug?是我的配置有问题,还是production环境本来就不需要重建、仅需staging构建好再promote?
Stack Overflow推荐的相关未解决问题:
- 从单一仓库维护staging+prod环境,Heroku使用revel buildpack的两个远程仓库
- Heroku buildpack SSH配置与CI流水线
- Heroku“多Buildpack”功能无法正常工作
原因分析
Heroku的promote操作本质是直接复用staging环境已构建完成的slug,不会在production环境重新执行buildpack构建流程。这是Heroku流水线的设计逻辑——既然你的构建无状态,且配置变量完全独立于代码,那么staging构建出的slug可直接在prod环境运行,无需重复构建,以此提升部署效率。
当你更新requirements.txt这类影响构建结果的文件时,staging构建的新slug已包含新依赖,此时将该slug promote到prod,prod运行的就是更新后的依赖版本,无需单独在prod触发buildpack。若prod当前运行的是旧slug,问题出在你没有先在staging构建新slug再执行promote操作。
如果确实需要在prod单独触发buildpack重建(如特殊场景下无法通过staging中转),这并非配置错误,而是需要手动触发prod的构建流程。
解决方法
常规正确流程(推荐)
- 将更新了
requirements.txt的代码推送到main分支,触发staging环境的buildpack构建,生成包含新依赖的slug - 在Heroku流水线中把staging的新slug promote到production,prod会直接使用该已构建好的新slug,无需重新构建
手动触发prod环境重建(特殊场景用)
若需跳过staging直接在prod触发buildpack构建,可通过以下方式:
- 使用Heroku CLI执行命令:
heroku build:create --app <你的prod应用名> - 在Heroku控制台的prod应用页面,进入"Deploy"选项卡,点击"Manual deploy"下的"Deploy Branch"按钮(选择对应分支)
内容的提问来源于stack exchange,提问作者enoren5

