Github Action完成Heroku构建后无法访问/tmp/build_{sha}构建文件
问题解答:Heroku构建文件去向与GitHub Actions无法访问的原因及解决方法
一、构建步骤完成后,文件去向何处?
Heroku的构建流程在独立的临时容器中执行:
- 当你通过
git push heroku触发构建时,Heroku会在自身基础设施上启动临时构建容器,将代码拉取到容器内的/tmp/build_{sha}/目录完成构建。 - 构建结束后,Heroku会将最终可部署产物(称为Slug)打包,其中包含经过
collectstatic处理后的静态文件(也就是你在部署后Dyno中找到的/static/dist、/staticfiles/dist下的sourcemaps)。 - 构建过程中使用的
/tmp/build_{sha}/临时目录会被立即销毁,既不会持久化存储,也不会被包含到最终的Slug中。
二、为何GitHub Actions无法访问这些文件?
GitHub Actions的运行环境与Heroku的构建环境完全隔离:
- GitHub Actions的每个步骤都运行在独立的runner(机器/容器)上,和Heroku的构建容器没有任何共享文件系统。
git push heroku只是将代码发送到Heroku服务器,后续构建全程在Heroku侧执行,GitHub Actions的runner从未接触过Heroku构建容器内的文件,自然找不到/tmp/build_{sha}/目录。
三、适合你的解决方案(在GitHub Actions中完成Sentry Sourcemap上传)
由于你需要上传collectstatic处理后的最终sourcemaps,且希望在GitHub Actions中完成操作,推荐以下两种方案:
方案1:在GitHub Actions runner中完成全流程构建
将原本在Heroku侧的构建步骤移到GitHub Actions中执行,让sourcemaps保留在runner本地,直接用于Sentry上传:
- 在Actions步骤中配置Node.js、Python环境,安装项目依赖。
- 执行JS构建生成sourcemaps。
- 运行
python manage.py collectstatic得到最终重命名后的sourcemaps。 - 禁用Heroku的自动构建(设置环境变量
HEROKU_SKIP_BUILD=1),将构建好的文件推送到Heroku。 - 在同一runner环境中执行Sentry发布步骤,直接指定本地的
staticfiles/dist路径。
示例Action片段:
- name: Set up Node.js uses: actions/setup-node@v4 with: node-version: '20' - name: Set up Python uses: actions/setup-python@v5 with: python-version: '3.11' - name: Install dependencies run: | npm install pip install -r requirements.txt - name: Build JS and collect static files run: | npm run build python manage.py collectstatic --noinput - name: Push built files to Heroku (skip Heroku build) env: HEROKU_API_KEY: ${{ secrets.HEROKU_API_KEY }} run: | heroku config:set HEROKU_SKIP_BUILD=1 --app your-app-name git add . git commit -m "Add built static files" git push --force heroku ${{ github.ref_name }}:master - name: Create Sentry release uses: getsentry/action-release@v1 env: SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} SENTRY_ORG: ${{ secrets.SENTRY_ORG }} with: environment: staging projects: ${{ secrets.projects }} sourcemaps: ./staticfiles/dist
方案2:从已部署的Heroku Dyno中下载sourcemaps
在GitHub Actions中,部署完成后通过heroku run命令从Dyno拉取sourcemaps到runner本地:
- 完成
git push heroku部署步骤后,添加步骤将Dyno中的staticfiles/dist目录打包下载到runner。 - 解压后在Sentry步骤中使用本地路径。
示例Action片段:
- name: Push To Heroku Remote run: | git fetch --unshallow git push --force heroku ${{ github.ref_name }}:master - name: Download sourcemaps from Heroku Dyno env: HEROKU_API_KEY: ${{ secrets.HEROKU_API_KEY }} run: | # 从Dyno打包并下载sourcemaps heroku run "tar -czf - staticfiles/dist" --app your-app-name > sourcemaps.tar.gz # 解压到本地目录 tar -xzf sourcemaps.tar.gz - name: Create Sentry release uses: getsentry/action-release@v1 env: SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} SENTRY_ORG: ${{ secrets.SENTRY_ORG }} with: environment: staging projects: ${{ secrets.projects }} sourcemaps: ./staticfiles/dist
注意:方案2中heroku run会启动新的Dyno,需确保应用已部署完成且Dyno正常运行。
内容的提问来源于stack exchange,提问作者mikey555
相关产品推荐
相关产品推荐

