GitHub Actions中GCP服务账号Secret解析失败推GCR报错排查
问题诱因
报错Unable to parse json key的核心原因是传入镜像推送动作的GCP服务账号密钥不是合法JSON格式,结合你的操作场景,基本可以排除服务账号权限、密钥本身有效性的问题——毕竟本地已经验证过密钥可以正常推送镜像,故障基本来自以下几个配置失误:
- 配置GitHub仓库Secret
GCR_SECRET时,复制的密钥内容被污染:比如从终端输出复制密钥时混入了shell提示符、折行乱码、首尾多余的空格/引号/转义符,或是漏选了JSON首尾的大括号,导致动作写入gcloud认证文件的内容结构损坏,无法被解析。 - 误对密钥做了额外编码:不少用户会习惯把敏感内容做base64编码后存入Secret,但你使用的v4版本推送动作默认会把
gcloud_service_key传入的内容直接作为原始JSON写入认证文件,传入编码后的内容必然会触发JSON解析失败。 - 工作流语法错误引发连带异常:你当前配置里
project_id: $STAGING_GCR_PROJECT的写法不符合GitHub Actions的变量引用规范,变量不会被正常替换,可能触发动作内部的逻辑异常。
修复方案
按以下顺序操作即可解决问题:
- 重新配置仓库Secret:本地用文本编辑器打开验证可用的
myfile.json,全选复制从开头{到结尾}的全部原始内容,不要做任何修改、不要额外加引号/转义/编码,直接粘贴覆盖GitHub中现有的GCR_SECRET即可。 - 修正变量引用语法:根据
STAGING_GCR_PROJECT的存储位置修改配置写法:- 如果值定义在工作流的
env块中,改为project_id: ${{ env.STAGING_GCR_PROJECT }} - 如果值存在仓库/组织级的Variables配置中,改为
project_id: ${{ vars.STAGING_GCR_PROJECT }}
- 如果值定义在工作流的
- 可选调试步骤:如果修改后仍报错,可以在调用推送动作前加临时校验步骤(调试完成后记得删除),直接验证传入的密钥格式是否合法:
- name: Check service key validity run: | cat <<EOF > temp_key.json ${{ secrets.GCR_SECRET }} EOF python3 -c "import json; json.load(open('temp_key.json')); print('Key format check passed')" rm -f temp_key.json
如果这一步执行失败,说明你存入Secret的密钥内容本身就不是合法JSON,重新复制完整正确的原始密钥内容即可。
内容的提问来源于stack exchange,提问作者pkaramol
相关产品推荐
相关产品推荐

