mcpField
G
gpc-troubleshooting

gpc-troubleshooting

github.com/yasserstudio开发140 次安装1 周前更新
代码仓库

关于 gpc-troubleshooting

面向 GPC 用户的故障排查技能,帮助诊断命令失败、退出码、配置、认证、API 和网络问题。它结合快速检查与针对错误的说明和修复建议,也涵盖 CI 场景。

主要功能

  1. 01快速检查健康状态和版本
  2. 02解释退出码含义
  3. 03诊断认证与配置问题
  4. 04提供 API 和网络错误指引
  5. 05排查上传与发布问题
  6. 06说明 CI 阈值失败原因

适用场景

  1. 01调查 GPC 命令失败
  2. 02诊断 CI 中失败的 GPC 步骤
  3. 03解决认证或配置错误
  4. 04解读 API、上传或阈值退出码

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/yasserstudio/gpc-skills --skill gpc-troubleshooting

安装后在 Claude Code 中输入/gpc-troubleshooting确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

evals/
evals.json
references/
error-catalog.md
exit-codes.md
scripts/
detect_gpc.mjs

详细介绍

gpc-troubleshooting

GPC 错误、退出代码和常见问题的统一调试指南。

适用场景

  • GPC 命令失败并返回错误代码
  • gpc doctor 报告问题
  • CI 管道中的 GPC 步骤失败
  • 行为或输出与预期不符
  • 需要解读退出代码
  • 需要启用详细/调试输出

所需输入

  • 错误消息或退出代码 — GPC 报告的内容
  • 失败的命令 — 实际运行的完整命令
  • 环境 — 本地还是 CI、操作系统、Node.js 版本

处理步骤

0. 快速诊断
# Check GPC health
gpc doctor

# Get version info
gpc --version

# Run failing command with verbose output
GPC_DEBUG=1 gpc <failing-command>

# Get error as JSON for parsing (also: --output csv, --output tsv since v0.9.68)
gpc <failing-command> --json

Read: references/exit-codes.md,查看完整的退出代码参考。

1. 退出代码
代码类别含义
0成功命令成功完成
1配置配置错误(缺少 .gpcrc.json、字段无效)
2用法参数或标志无效
3身份验证身份验证失败(令牌过期、密钥无效、没有凭据)
4APIGoogle Play API 错误(403、404、408、409、速率限制)
5网络连接失败、DNS 错误、超时
6阈值超出 Vitals 阈值,或没有返回可供比较的值(用于 CI 门控)
10插件插件权限验证错误

v1.0.0-rc.1 中的变更。 用法错误(未知选项、缺少参数)现在会以代码 2 退出,与本表一直以来的说明一致;此前它们以代码 1 退出。Vitals 或异常相关的 403 现在会以代码 4 退出,而不会再显示“无数据”并以代码 0 退出。退款或撤销操作在没有终端且未指定 --yes 时,会以代码 2 退出并返回 CONFIRMATION_REQUIRED。请检查所有根据特定代码执行分支的 CI 作业。

代码退出发生条件修复方法
CONFIRMATION_REQUIRED2purchases orders refund / orders review-refund / purchases subscription revoke / external-transactions refund 在非交互模式下(CI、stdin 管道输入、--no-interactive)运行,但未指定 --yes确认无误后添加 --yes,或使用无需该参数的 --dry-run 预览
IMAGE_SYNC_DIR_UNREADABLE1listings images sync 无法读取本地图片目录修复目录权限(以及 CI 中的卷所有权)。Google Play 上的内容未发生任何更改
THRESHOLD_NO_DATA6vitals ... --threshold 未返回任何指标值(--app 错误、数据延迟、没有流量)检查 --app,扩大 --days 范围,或在本次运行中移除 --threshold
THRESHOLD_INVALID2速率阈值为 1 或更高(v1.0.0-rc.2+):速率是分数--threshold 0.02 表示 2%;同时修正 vitals.thresholds.*
TRAIN_GATE_NO_DATA6gpc train advance 没有门控数据,因此停留在当前阶段(v1.0.0-rc.2+)Vitals 数据会延迟 2-4 天;稍后重试
API_METRIC_GAMES_ONLY4对非游戏应用运行 vitals rendering(v1.0.0-rc.2+)这是预期行为;渲染缓慢指标仅适用于游戏。这不是凭据问题
INVALID_PACKAGE_NAME2--app / GPC_APP 格式错误(v1.0.0-rc.2+)使用 --app com.example.app 或 -a com.example.app
2. 身份验证错误(退出代码 3)

Read: references/error-catalog.md,查看完整的错误目录。

错误原因修复方法
AUTH_FAILED凭据无效或已损坏重新运行 gpc auth login --service-account <key.json>
AUTH_EXPIRED令牌已过期且刷新失败重新进行身份验证;检查网络/代理
AUTH_NO_CREDENTIALS未配置身份验证运行 gpc auth login 或设置 GPC_SERVICE_ACCOUNT
AUTH_INVALID_KEY服务账号 JSON 格式错误从 Google Cloud Console 重新下载密钥
AUTH_KEYCHAIN_ERROR操作系统密钥链访问被拒绝授予密钥链访问权限,或使用环境变量身份验证
# Check current auth status
gpc auth status

# Re-authenticate
gpc auth login --service-account ~/path/to/key.json

# Bypass keychain with env var
export GPC_SERVICE_ACCOUNT=$(cat ~/path/to/key.json)
3. API 错误(退出代码 4)
错误HTTP原因解决方法
API_FORBIDDEN403权限不足在 Play Console 中授予所需角色
API_NOT_FOUND404应用、轨道或资源不存在验证软件包名称、轨道名称或资源 ID
API_CONFLICT409已有编辑正在进行等待后重试;可能已有其他编辑会话处于打开状态
API_RATE_LIMITED429请求过多GPC 会自动重试;增加 GPC_BASE_DELAY
API_REQUEST_TIMEOUT408请求超时GPC 会采用指数退避策略自动重试
API_SERVER_ERROR5xxGoogle 服务器问题稍后重试;查看 Google 状态信息中心
EDIT_CONFLICT409其他工具或用户正在进行并发编辑一次只能进行一个编辑;检查 Fastlane 或 Play Console 是否有打开的编辑会话
API_DUPLICATE_VERSION_CODE409版本代码已上传在 build.gradle 中递增 versionCode,然后重新构建
API_VERSION_CODE_TOO_LOW400版本代码低于当前值每个轨道的版本代码都必须递增
API_PACKAGE_NAME_MISMATCH400applicationId 与目标应用不匹配验证 applicationId 是否与目标应用匹配
API_APP_NOT_FOUND404开发者账号中没有该应用验证软件包名称和开发者账号
API_INSUFFICIENT_PERMISSIONS403服务账号缺少权限在 Play Console → Settings → API access 中授予所需角色
API_DECLARATION_REQUIRED403Play Console 中的“App content”声明尚未完成在 Policy > App content 中完成声明。这不是权限问题;更改角色无济于事
API_ALREADY_EXISTS409尝试创建的资源已存在使用匹配的 update 命令,而不是 create(例如 gpc otp offers update)
API_ENDPOINT_RETIRED404Google 已从其发布的 API 中移除该端点无法通过 CLI 修复——请在 Play Console 中完成此任务。目前影响 gpc games ... set-icon
API_CHANGES_NOT_SENT_FOR_REVIEW400/403应用有被拒绝的更新,且需要设置审核标志在命令中添加 --changes-not-sent-for-review 标志
API_CHANGES_ALREADY_IN_REVIEW400更改已在审核中,新提交会被静默取消使用 --error-if-in-review,以防止静默取消
API_EDIT_EXPIRED410打开的编辑会话已过期(编辑会话在闲置约 30 分钟后过期)GPC 现在会显示清晰的 API_EDIT_EXPIRED 消息,并建议重试命令。重试时,命令会自动创建新的编辑会话。
API_ROLLOUT_DECREASE_FORBIDDEN400分阶段发布的百分比只能提高,不能降低要停止发布,请使用 gpc releases rollout halt --track production。要继续发布,请使用 gpc releases rollout increase 并指定更高的百分比。
# Check if an edit is stuck
gpc apps list --json

# API errors include suggestion field
gpc releases upload app.aab --track beta --json 2>&1 | jq '.error'
4. 网络错误(退出代码 5)
错误原因解决方法
NETWORK_ERROR连接失败检查互联网连接;检查代理设置
NETWORK_TIMEOUT请求超时增加 GPC_TIMEOUT(默认值为 30000ms)
NETWORK_DNSDNS 解析失败检查 DNS 设置;尝试使用 Google DNS(8.8.8.8)
NETWORK_SSLSSL/TLS 握手失败为自定义 CA 设置 GPC_CA_CERT;检查代理
# Increase timeout for large uploads
export GPC_TIMEOUT=120000

# Configure retry behavior
export GPC_MAX_RETRIES=5
export GPC_BASE_DELAY=2000
export GPC_MAX_DELAY=30000

# Corporate proxy
export HTTPS_PROXY=http://proxy.corp:8080

# Custom CA certificate
export GPC_CA_CERT=/path/to/ca-cert.pem
5. 配置错误(退出代码 1)
错误原因修复方法
CONFIG_MISSING缺少 .gpcrc.json 或环境变量运行 gpc setup(v0.9.68+)或 gpc config init
CONFIG_INVALID.gpcrc.json 格式错误验证 JSON 语法
CONFIG_INVALID_JSON配置文件包含语法错误(v0.9.80+)运行 cat <file> | python3 -m json.tool 查找错误
CONFIG_INVALID_KEY键为空、格式错误或为保留名称(v0.9.80+)使用有效的字母数字组合配置文件名/键名
CONFIG_APP_MISSING未指定应用使用 gpc config set app 或 --app 标志设置

配置优先级修复(v0.9.81+): 在 v0.9.81 之前,活动配置文件会悄无声息地优先于 GPC_SERVICE_ACCOUNT/GPC_APP 环境变量以及 --service-account/--app 标志。这是一个错误。自 v0.9.81 起,已按文档规定执行优先级:标志优先于环境变量,环境变量优先于活动配置文件,活动配置文件优先于默认值。如果环境变量似乎未生效,请运行 gpc config list 检查是否设置了活动配置文件,并更新或停用它。

# Initialize config
gpc config init

# Set required values
gpc config set app com.example.app

# Check current config
gpc config list
6. 上传和发布错误
错误原因修复方法
INVALID_BUNDLEAAB 已损坏或格式错误重新构建 AAB;先运行 gpc validate
VERSION_CODE_CONFLICT版本代码已被使用在 build.gradle 中递增 versionCode
RELEASE_NOT_FOUND指定的轨道上没有发布版本检查轨道名称;使用 gpc releases list --track <track>
RELEASES_USAGE_ERROR / PUBLISH_USAGE_ERROR(退出代码 2)发布比例不在 1-100 范围内--rollout 和 --to 的值应为百分比:使用 --rollout 10,而不是 --rollout 0.1
PROMOTE_NO_SOURCE源轨道没有可提升的发布版本先上传到源轨道
UPLOAD_CHUNK_FAILED重试后仍无法发送分块检查网络;增大 GPC_MAX_RETRIES 或 GPC_UPLOAD_TIMEOUT
UPLOAD_NO_COMPLETION已发送所有字节,但未收到完成响应重试上传;检查 GPC_UPLOAD_TIMEOUT
UPLOAD_INITIATE_FAILED会话初始化失败检查身份验证和权限;重试
UPLOAD_NO_SESSION_URI初始化响应中没有 Location 标头API 错误;重试或检查服务账号权限
UPLOAD_SESSION_NOT_FOUND会话已过期(404)启动新的上传会话
UPLOAD_SESSION_EXPIRED会话已失效(410)启动新的上传会话
UPLOAD_INVALID_CHUNK_SIZE分块大小不是 256 KB 的整数倍将 GPC_UPLOAD_CHUNK_SIZE 设置为 262144(256 KB)的整数倍
EDIT_VALIDATE_FAILED上传后出现暂时性的验证/提交失败自 v0.9.77 起,会使用多次重试保护机制自动重试(15s、30s、45s);如果问题持续存在,请检查 bundle 状态
REVIEW_SKIPPED内部轨道提交已完成,但未进入 Google 审核队列符合预期。internal 轨道无需审核。GPC 会在结构化 JSON 输出中设置 reviewSkipped: true(v0.9.79+),以确认提交已立即完成。
# Validate before uploading
gpc validate app.aab

# Check existing releases
gpc releases list --track internal
gpc releases list --track beta

# Preview upload
gpc releases upload app.aab --track beta --dry-run
提交被拒:结构化输出中的 reviewPending(v0.9.79+)

当 Google 要求审核并因此拒绝 edits.commit 时,--json 输出会包含结构化结果,而不是普通错误:

{
  "reviewPending": true,
  "nextStep": "Your changes are under Google review. Check Play Console for status or use --changes-not-sent-for-review to bypass review for non-reviewed tracks."
}

CI 流水线可以依据 reviewPending === true,决定是等待、通知还是退出。nextStep 字段始终包含关于下一步操作的易读说明。

7. Vitals 阈值超限(退出代码 6)

退出代码 6 不是错误——它表示 Vitals 指标有意超出阈值。用于 CI 门禁。

# This exits 6 if crash rate > 2.0%
gpc vitals crashes --threshold 0.02

# Check the actual value
gpc vitals crashes --json | jq '.crashRate'

# In CI, use exit code to gate promotion
gpc vitals crashes --threshold 0.015 && gpc releases promote --from beta --to production
7a. 订单退款审核错误(退出代码 2,v0.9.96+)
代码含义修复方法
ORDER_REVIEW_REFUND_INVALIDgpc purchases orders review-refund 输入无效:--sample-content-provided 未作答、--consumption-percent 超出 0-100,或 --usage-events-file 不是对象数组形式的 JSON在 --sample-content-provided / --no-sample-content-provided 中恰好传入一个选项,使用 --consumption-percent 45.2 这样的普通小数,并确保文件是类似 [{ "consumptionTime": "2026-08-30T10:15:00Z" }] 的数组

请求发送前会在本地拒绝,因此命令出错不会占用 Google 24 小时响应窗口的一部分。空的或仅包含空白字符的 --consumption-percent 会视为未提供,而不是 0%。

8. 插件错误(退出代码 10)
错误原因修复方法
PLUGIN_INVALID_PERMISSION第三方插件声明了未知权限查看 plugin-sdk 文档中有效的权限
PLUGIN_PERMISSIONS_REQUIRED第三方插件未声明 gpc.permissions(v0.9.94+)请作者声明其使用的钩子,然后重新批准该插件
PLUGIN_IDENTITY_MISMATCH说明符声称是第一方软件包,但解析结果指向其他位置(v0.9.94+)移除 @gpc-cli/plugin-ci 的 npm 别名或本地替代项
插件未加载未加入配置或未获批准在 .gpcrc.json 的 plugins 和 approvedPlugins 中添加
钩子中的插件错误插件处理程序存在 Bug查看插件日志;onError/API 钩子会吞掉错误
变更日志生成错误(v0.9.61+)
代码含义修复方法
CHANGELOG_NO_TAG未找到 v* git 标签,且未传入 --from创建标签(git tag v0.0.1)或传入 --from <ref>
CHANGELOG_BAD_REF--from 或 --to 的 ref 不存在运行 git rev-parse --verify <ref> 进行检查
CHANGELOG_LOCALES_REQUIRED传入了 --target play-store,但未传入 --locales(v0.9.62+)传入 --locales en-US,fr-FR 或 --locales auto
CHANGELOG_LOCALES_INVALID一个或多个 --locales 不符合有效的 BCP 47 格式(v0.9.62+)使用 Play Store 支持的代码,例如 en-US、fr-FR、de-DE
CHANGELOG_LOCALES_AUTO_NO_APP使用 --locales auto,但没有已通过身份验证的客户端和应用(v0.9.62+)传入 --app <package> 或设置 config.app,并检查凭据
CHANGELOG_FETCH_FAILED无法访问 GitHub API 或 API 返回了错误(v0.9.80+)检查网络;在文档站点查看变更日志
CHANGELOG_VERSION_NOT_FOUND在 GitHub 发行版中找不到请求的版本(v0.9.80+)运行 gpc changelog --limit 10 查看可用版本
WATCH_WEBHOOK_FAILEDWebhook 端点返回了非 2xx 状态码(v0.9.80+)检查 Webhook URL 和服务器状态
CHANGELOG_LOCALES_EMPTY--locales auto 未返回任何区域设置(v0.9.62+)至少创建一个 Play Store 商品详情,或传入明确的 --locales
RELEASE_NO_DRAFT--apply 在目标轨道上未找到草稿发行版(v0.9.64+)先创建草稿发行版(gpc releases upload --status draft)
BUNDLE_PROCESSING_TIMEOUTAAB 上传已完成,但软件包在约 86 秒内仍未处理完成(v0.9.64+,v0.9.77 起已延长)重试上传,或使用 --status draft 并稍后提交;如果问题持续,请检查软件包大小和 Google 服务器状态
批量报告错误(v0.9.93+)

gpc reports list 和 gpc reports download stats|financial 会从与开发者账号关联的 Cloud Storage 存储桶(pubsite_prod_<developerId>)读取 Play 的月度批量报告 CSV 文件。在 v0.9.93 之前,这些命令只会显示操作指引;现在它们会实际执行网络操作,并使用各自的错误代码。

代码退出码含义解决方法
REPORT_ACCESS_DENIED4凭据有效,但无权读取报告存储桶Play Console -> 用户和权限 -> 服务账号 -> 账号权限 -> 启用“查看应用信息并下载批量报告(只读)”,等待几分钟后重试
REPORT_AUTH_REJECTED3Google 拒绝了令牌本身(HTTP 401)使用 gpc auth status 检查密钥,确认系统时钟正确,然后运行 gpc auth clear-cache 并重试
REPORT_BUCKET_UNKNOWN2未配置存储桶,也没有可用于推导存储桶名称的开发者 ID设置 developerId / GPC_DEVELOPER_ID,或传入 --bucket / GPC_REPORTS_BUCKET / reports.bucket
REPORT_BUCKET_INVALID2配置的存储桶名称不是有效的 GCS 存储桶名称从 Play Console -> 下载报告中复制准确的 Cloud Storage URI(接受 gs:// URI,并会提取其中的存储桶名称)
REPORT_BUCKET_NOT_FOUND4存储桶不存在,或此账号无法查看该存储桶确认名称;默认值为 pubsite_prod_<developerId>
REPORT_OBJECT_NOT_FOUND4没有匹配类型 / 月份 / 维度的对象错误信息会列出可用维度或月份;月份结束后才会发布报告
REPORT_LIST_FAILED4存储桶列表调用失败重试;检查网络并运行 gpc doctor
REPORT_DOWNLOAD_FAILED4获取对象失败重试;检查网络
REPORT_DECODE_FAILED4无法对对象进行 gunzip 解压或从 UTF-16 解码重试下载;如果问题仍然存在,使用 --output-file 保存原始对象并进行报告
REPORT_ARCHIVE_UNREADABLE4无法读取财务 ZIP 归档使用 --output-file report.zip 保存原始文件并在本地打开
REPORT_MULTIPLE_ENTRIES2财务归档中包含多个 CSV,因此无法只打印一个文件使用 --output-file report.zip 保存归档,或使用 --json 内联输出所有条目
INVALID_REPORT_DIMENSION2--dimension 不是受支持的值之一使用 overview、country、language、os_version、device、app_version、carrier 或 traffic_source(评价报告没有维度)
MISSING_REQUIRED_OPTION2缺少 --month 或 --type 等必需标志查看命令概要:下载统计数据需要 --month 和 --type
INVALID_LIMIT2--limit 不是正整数传入一个正整数

gpc doctor 包含 reports-bucket 探测项:当授权缺失(403/401)或存储桶名称错误(404)时,它会发出警告,因此这是在调试命令之前确认配置是否正确的最快方式。

9. 调试模式

为任何命令启用详细输出:

# Debug environment variable
GPC_DEBUG=1 gpc releases upload app.aab --track beta

# JSON output for machine parsing
gpc releases upload app.aab --track beta --json

# Combine for maximum detail
GPC_DEBUG=1 gpc releases upload app.aab --track beta --json 2>debug.log
10. 可重试的 HTTP 状态码

GPC 会通过指数退避自动重试以下 HTTP 状态码:

  • 408 — 请求超时
  • 429 — 请求过多(受到速率限制)
  • 5xx — 服务器错误(500、502、503 等)

配置重试行为:

export GPC_MAX_RETRIES=5        # Default: 5
export GPC_BASE_DELAY=1000      # Initial delay in ms
export GPC_MAX_DELAY=15000      # Max delay in ms
export GPC_UPLOAD_TIMEOUT=300000  # Upload timeout in ms (5 min)

验证

  • gpc doctor 通过所有检查
  • 失败的命令现在可以成功执行,或显示清晰且可操作的错误
  • 退出码与预期类别相符
  • --json 输出包含 error.code、error.message 和 error.suggestion

故障模式 / 调试

症状可能原因修复方法
gpc doctor 在身份验证时失败未配置凭据运行 gpc setup(v0.9.68+)或 gpc auth login
gpc doctor 在 API 检查时失败服务账号没有 API 访问权限在 GCP 中启用 Google Play Developer API
gpc doctor 发出配额警告每日或每分钟 API 配额使用量超过 80%降低请求频率,或向 Google 申请提高配额(v0.9.71+)
gpc doctor 出现插件错误已配置的插件加载失败检查插件包版本,重新安装,或从配置中移除(v0.9.71+)
gpc doctor --verify 检测到不匹配本地密钥库与 Play 签名证书不一致在 Play Console 中注册本地密钥,或使用 Play App Signing(v0.9.75+)
所有命令都超时网络 / 代理问题检查 HTTPS_PROXY、GPC_CA_CERT、GPC_TIMEOUT
NETWORK_ERROR:“已配置代理……但无法通过代理路由请求”HTTPS_PROXY / HTTP_PROXY 格式错误(v0.9.98+ 会直接失败,而非直连)修正 URL(例如 http://proxy.example.com:8080)或取消设置该变量;对于应绕过代理的主机,请使用 NO_PROXY
users list / users get:“当前不支持分页”Google 现在会拒绝分页的 users 请求(v0.9.98 之前的 GPC)升级到 v0.9.98+
gpc doctor 警告“未知配置键:legacyApprovedPlugins、pluginApprovalPolicyVersion”(或 vitals / games / reports)已知键列表过时(v0.9.98 之前);这些键有效升级到 v0.9.98+;无需更改配置
命令在本地运行正常,在 CI 中失败CI 中缺少环境变量在 CI 密钥中设置 GPC_SERVICE_ACCOUNT 和 GPC_APP;运行 gpc setup --auto(v0.9.68+)
环境变量 GPC_SERVICE_ACCOUNT / GPC_APP 似乎被忽略活动配置文件覆盖了环境变量(v0.9.81 之前的 bug)升级到 v0.9.81+。使用 gpc config list 检查活动配置文件;现在环境变量和标志会正确覆盖配置文件。
npm install -g @gpc-cli/cli 因 EUNSUPPORTEDPROTOCOL 失败workspace:* 说明符泄漏到了已发布的清单中(v0.9.77-v0.9.83)重新安装 v0.9.84+ 或 v0.9.85+:npm install -g @gpc-cli/cli@latest。v0.9.84 中已修复(cli+core),并在 v0.9.85 中彻底解决(api 包已重新发布)。
gpc doctor 针对 reports-bucket 发出警告服务账号缺少批量报告授权,或存储桶名称有误在 Play Console 中启用“查看应用信息并下载批量报告(只读)”,或使用 --bucket / GPC_REPORTS_BUCKET 设置准确的存储桶(v0.9.93+)
授予权限后,报告仍立即被拒绝授权尚未生效,或缓存的令牌是在授权前获取的等待几分钟,运行 gpc auth clear-cache,然后重试(v0.9.93+)
JSON 输出中没有 suggestion意外错误类型提交 bug 报告——所有错误都应提供建议

相关技能

  • gpc-setup — 初始身份验证和配置设置
  • gpc-ci-integration — CI 专项故障排查
  • gpc-vitals-monitoring — 了解阈值超限
  • gpc-plugin-development — 调试插件问题

评论

支持 Markdown