GitHub Action中base64编码JSON服务账号密钥传入失败问题
问题描述
我的服务账号(SA)密钥以JSON格式存储,在使用要求传入base64编码格式SA密钥的GitHub Action时,执行如下配置出现失败:
- name: base64 encode the staging gcr sa id: base64-staging-gcr shell: bash run: echo "::set-output name=STAGING_GCR_SA_BASE64::$(echo '${{ secrets.STAGING_GCR_SA }}' | python -m base64 -e)" - name: build and push to staging gcr id: stg_img_build uses: RafikFarhad/push-to-gcr-github-action@v4 with: gcloud_service_key: ${{ steps.base64-staging-gcr.outputs.STAGING_GCR_SA_BASE64 }} registry: gcr.io project_id: $STAGING_GCR_PROJECT image_name: ${{ github.event.inputs.image_name }} image_tag: ${{ github.event.inputs.image_tag }}
运行抛出的错误信息如下:
Error response from daemon: Get "https://gcr.io/v2/": unknown: Unable to parse json key.
错误原因
base64编码环节确实存在问题,共两处核心错误:
- 使用
echo输出密钥内容时,默认会在字符串末尾追加换行符,导致编码后的内容尾部带冗余字符,后续Action解码得到的JSON格式非法,无法被解析。 - 调用Python的
base64模块编码时,默认会在输出长度超过76个字符时插入换行符,进一步破坏了编码结果的连续性,解码后得到的内容不是合法JSON。
除此之外配置还有两个额外问题:
::set-output是GitHub Action已经废弃的输出设置语法,后续版本会完全移除支持。project_id字段的变量写法错误,with块不是shell执行环境,直接写$STAGING_GCR_PROJECT无法读取到变量值。
修复方案
将base64编码步骤替换为如下内容:
- name: base64 encode the staging gcr sa id: base64-staging-gcr shell: bash run: echo "STAGING_GCR_SA_BASE64=$(echo -n '${{ secrets.STAGING_GCR_SA }}' | base64 -w 0)" >> $GITHUB_OUTPUT
修正点说明:
- 给
echo加-n参数,禁止在输出内容末尾自动追加换行符 - 直接使用系统自带的
base64命令,加-w 0参数关闭自动折行,输出连续无多余换行的合法base64字符串 - 使用官方推荐的
$GITHUB_OUTPUT文件写入方式设置步骤输出,兼容当前和后续版本的GitHub Action运行器
同时修正project_id的变量引用:如果GCP项目ID存在仓库变量中,写为${{ vars.STAGING_GCR_PROJECT }};如果存在密钥中,写为${{ secrets.STAGING_GCR_PROJECT }}即可。
内容的提问来源于stack exchange,提问作者pkaramol
相关产品推荐
相关产品推荐

