如何在Bitbucket Pipeline中执行Heroku container:release完成部署
解决Bitbucket Pipeline中Heroku容器发布的问题
问题背景
我已经完成了Docker镜像构建、推送至Heroku Registry的全部步骤,但卡在最后一步——无法执行heroku container:release web -a $HEROKU_APP_NAME来更新运行中的应用。Bitbucket Pipeline默认环境没有Heroku CLI,尝试通过npm安装相关包发现已废弃,用Heroku Platform API写的curl脚本返回HTTP 200 OK,但应用并未实际更新。
可行解决方案
方案1:在Pipeline中安装官方Heroku CLI
Bitbucket的atlassian/default-image:3基于Ubuntu系统,可以直接通过官方脚本安装Heroku CLI,这是最直接可靠的方式。修改Pipeline脚本如下:
image: atlassian/default-image:3 options: docker: true pipelines: branches: 'develop': - step: name: Docker Build Push & Release deployment: Develop services: - docker caches: - docker script: - echo "Docker Build" - docker build -t $HEROKU_APP_NAME . - echo "Heroku Registry Login" - docker login --username=_ --password=$HEROKU_API_KEY registry.heroku.com - echo "Heroku Image Tagging" - docker tag $HEROKU_APP_NAME registry.heroku.com/$HEROKU_APP_NAME/web - echo "Heroku Docker Push" - docker push registry.heroku.com/$HEROKU_APP_NAME/web # 安装Heroku CLI - curl https://cli-assets.heroku.com/install.sh | sh # 用API Key完成Heroku认证 - echo "$HEROKU_API_KEY" > ~/.netrc - chmod 600 ~/.netrc # 执行发布命令 - heroku container:release web -a $HEROKU_APP_NAME
方案2:修复Heroku Platform API的curl请求
之前的curl请求返回200但未生效,核心原因是docker_image的格式不符合Heroku要求。Heroku接受的镜像标识可以是完整的RepoDigest(如registry.heroku.com/app/web@sha256:xxx)或带sha256前缀的完整镜像ID,修改脚本如下:
image: atlassian/default-image:3 options: docker: true pipelines: branches: 'develop': - step: name: Docker Build Push & Release via API deployment: Develop services: - docker caches: - docker script: - echo "Docker Build" - docker build -t $HEROKU_APP_NAME . - echo "Heroku Registry Login" - docker login --username=_ --password=$HEROKU_API_KEY registry.heroku.com - echo "Heroku Image Tagging" - docker tag $HEROKU_APP_NAME registry.heroku.com/$HEROKU_APP_NAME/web - echo "Heroku Docker Push" - docker push registry.heroku.com/$HEROKU_APP_NAME/web # 获取符合要求的镜像RepoDigest - docker inspect registry.heroku.com/$HEROKU_APP_NAME/web --format='{{index .RepoDigests 0}}' > HEROKU_DOCKER_IMAGE_ID # 执行API请求发布 - HEROKU_IMAGE=$(cat HEROKU_DOCKER_IMAGE_ID) - curl -X PATCH https://api.heroku.com/apps/$HEROKU_APP_NAME/formation \ -d "{\"updates\": [{\"type\": \"web\", \"docker_image\": \"$HEROKU_IMAGE\"}]}" \ -H "Content-Type: application/json" \ -H "Accept: application/vnd.heroku+json; version=3.docker_releases" \ -H "Authorization: Bearer $HEROKU_API_KEY"
验证建议
- 发布完成后,可添加
heroku logs --tail -a $HEROKU_APP_NAME命令查看应用日志,确认是否有新的部署启动记录 - 登录Heroku控制台,检查应用的部署历史,确认新版本是否已上线
内容的提问来源于stack exchange,提问作者Ariston Darmayuda
相关产品推荐
相关产品推荐

