You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Github Action完成Heroku构建后无法访问/tmp/build_{sha}构建文件

问题解答:Heroku构建文件去向与GitHub Actions无法访问的原因及解决方法

一、构建步骤完成后,文件去向何处?

Heroku的构建流程在独立的临时容器中执行:

  1. 当你通过git push heroku触发构建时,Heroku会在自身基础设施上启动临时构建容器,将代码拉取到容器内的/tmp/build_{sha}/目录完成构建。
  2. 构建结束后,Heroku会将最终可部署产物(称为Slug)打包,其中包含经过collectstatic处理后的静态文件(也就是你在部署后Dyno中找到的/static/dist、/staticfiles/dist下的sourcemaps)。
  3. 构建过程中使用的/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上传:

  1. 在Actions步骤中配置Node.js、Python环境,安装项目依赖。
  2. 执行JS构建生成sourcemaps。
  3. 运行python manage.py collectstatic得到最终重命名后的sourcemaps。
  4. 禁用Heroku的自动构建(设置环境变量HEROKU_SKIP_BUILD=1),将构建好的文件推送到Heroku。
  5. 在同一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本地:

  1. 完成git push heroku部署步骤后,添加步骤将Dyno中的staticfiles/dist目录打包下载到runner。
  2. 解压后在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 16:16:12