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

使用atlassian/heroku-deploy从Bitbucket Pipelines部署到Heroku时401授权失败

解决Bitbucket Pipelines部署Heroku时401未授权问题

问题场景

使用Atlassian官方的heroku-deploy管道从Bitbucket Pipelines部署NestJS后端应用到Heroku时,管道抛出401未授权错误:

✖ Failed to create sources. Expected HTTP Status 201, got 401.
Error message: {"id":"unauthorized","message":"Invalid credentials provided."}

已通过Postman验证Heroku API密钥有效,但管道内部署始终失败。

现有环境配置

仓库目录结构

project
├── backend
├── frontend
└── .bitbucket-pipelines.yml

Bitbucket Pipelines配置

image: node:18

pipelines:
  branches:
    dev:
      - step:
          name: Build App - (Dev)
          script:
            - cd backend
            - npm install
            - npm run build

      - step:
            name: Create Artifact (Dev)
            script:
              - cd backend
              - git archive --format=tar.gz dev -o application.tar.gz
            artifacts:
              - backend/application.tar.gz
      - step:
          name: Deploy to Heroku (Dev)
          deployment: Staging
          script:
            - pipe: atlassian/heroku-deploy:2.4.1
              variables:
                HEROKU_API_KEY: $HEROKU_API_KEY
                HEROKU_APP_NAME: $HEROKU_APP_NAME
                ZIP_FILE: backend/application.tar.gz
                WAIT: "true"
          caches:
            - node

后端package.json启动脚本

"scripts": {
    "prebuild": "rimraf dist",
    "build": "nest build",
    "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
    "start": "node dist/main"
}

已验证的前置条件

  • Bitbucket仓库变量HEROKU_APP_NAME设置为正确的应用名devcrm
  • HEROKU_API_KEY从Heroku控制台账户页复制,无多余空格/引号,且通过Postman请求GET https://api.heroku.com/apps能正常获取应用列表
  • 已尝试重新生成API密钥、更换管道版本、确认Heroku账户对应用的所有权

针对性解决方案

1. 确认Bitbucket变量的作用域与类型

  • 确保HEROKU_API_KEY是仓库级安全变量:进入Bitbucket仓库Settings > Repository variables,检查变量类型为Secured,且未被设置为"Restricted to specific pipelines"(若设置限制需确保当前部署分支/环境在允许范围内)
  • 若使用项目级变量,需确认仓库已开启Inherit variables from project选项

2. 验证管道中变量的注入状态

在部署步骤的script中添加变量检查(安全变量无法直接打印,可通过长度验证):

- step:
    name: Deploy to Heroku (Dev)
    deployment: Staging
    script:
      - echo "HEROKU_API_KEY 长度: ${#HEROKU_API_KEY}" # 确认变量非空
      - echo "HEROKU_APP_NAME: $HEROKU_APP_NAME" # 验证应用名正确
      - pipe: atlassian/heroku-deploy:2.4.1
        variables:
          HEROKU_API_KEY: $HEROKU_API_KEY
          HEROKU_APP_NAME: $HEROKU_APP_NAME
          ZIP_FILE: backend/application.tar.gz
          WAIT: "true"
    caches:
      - node

若HEROKU_API_KEY长度为0,说明变量未被正确注入,需检查变量设置的作用域。

3. 检查Heroku账户的应用权限

即使API密钥能获取应用列表,仍需确认:

  • 该Heroku账户是目标应用devcrm的所有者或已被添加为协作者(进入Heroku应用Settings > Members查看)
  • 协作者账户需拥有Deploy权限(默认协作者具备该权限,若被修改需重新开启)

4. 绕过管道直接用Heroku CLI验证部署

替换管道部署步骤,用Heroku CLI直接部署,排除管道自身问题:

- step:
    name: Deploy to Heroku (Dev)
    deployment: Staging
    script:
      - cd backend
      - npm install -g heroku
      - echo "$HEROKU_API_KEY" | heroku auth:login -i
      - heroku git:remote -a $HEROKU_APP_NAME
      # 注意:若dist目录未被git追踪,需先添加到临时提交
      - git add dist/
      - git commit -m "Deploy dist files" --allow-empty
      - git push heroku dev:main --force

若此方式部署成功,说明是atlassian/heroku-deploy管道的适配问题,可尝试提交issue或继续使用CLI部署方式。

5. 修正Artifact生成逻辑(附带优化)

当前git archive命令仅打包仓库已追踪文件,而Build步骤生成的dist目录若未被git追踪(通常会加入.gitignore),会导致部署包缺少运行文件。可修改Artifact生成步骤:

- step:
    name: Create Artifact (Dev)
    script:
      - cd backend
      # 打包当前目录所有文件(包括dist),而非git追踪文件
      - tar -czf application.tar.gz .
    artifacts:
      - backend/application.tar.gz

内容的提问来源于stack exchange,提问作者Code Guru

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 22:00:12