华为云作品展览馆发布踩坑记:GitHub 仓库不可达、900 秒 STS 与幂等键
展览馆没有网页上传入口
华为云开发者作品展览馆的发布不是网页表单,而是一条 API 链路:先用账号的 AK/SK 自委托换取 900 秒有效的 STS 临时凭证,再带凭证调用发布接口。接口要求一次性交齐仓库地址、分支名、封面图、详情包、活动 ID 这几样东西。中间任何一步重来,凭证都可能已经过期。
我把一个开源网页画图项目发布上去,前后踩了六个坑,记录下来给后来者省点时间。
坑一:仓库地址校验访问不到 GitHub
第一次提交返回:
#status=400
GALLERY.PARAM.INVALID:代码仓库地址无法访问
仓库明明存在,在本机 git ls-remote 秒回。问题在于校验发生在平台侧,那个网络出口访问 GitHub 不通,所以判定「无法访问」。
解决办法是换成国内可达的镜像地址,但不能随便换,得先确认内容一致:
git ls-remote https://github.com/owner/repo.git refs/heads/master
git ls-remote https://gitcode.com/gh_mirrors/xx/repo.git refs/heads/master
两边的 commit SHA 相同才说明是同一份代码,否则发布出去的作品和仓库对不上。GitCode 的 GitHub 镜像路径规律是 gh_mirrors/<仓库名前两位>/<仓库名>。换成镜像后立刻通过。
坑二:STS 只有 900 秒
临时凭证的有效期写死在生成逻辑里,900 秒。封面生成、详情包打包、门禁复核、发布提交这几步串起来,第一次做很容易超时。顺序上应当把所有产物先准备好,最后一步才生成凭证直接提交,而不是先生成凭证再慢慢做图。
坑三:幂等键必须每次换
请求体里有 idempotencyKey,服务端用它做去重。重试时如果沿用上一个键,可能命中上一次的失败结果,看起来像是同一个错误反复出现。把键和时间戳绑起来最稳:
"idempotencyKey": "gallery-publish-<账号ID>-" + Date.now()
坑四:参数 schema 是严格的
发布脚本不接受任何未知字段。我第一次把脚本内部的 workDir 一起塞进请求体,直接被参数校验拦下,报的还是笼统的 INVALID。合法字段其实只有这些:
- idempotencyKey、accessKeyId、secretAccessKey、securityToken
- trainingCampId、workName、introduction
- coverImage、detailZip(本地绝对路径,脚本负责上传)
- gitUrl、gitBranch、envUrl
多一个字段就失败,少一个必填也失败,先对着文档把结构对齐再调。
坑五:详情包里引用的图片必须真实存在
详情包是一份 README 加若干资源文件。如果 README 里引用了 images/screenshot.png,但资源目录里没有这个文件,打包校验会直接失败。要么把图补齐,要么把说明改成纯文字。作为演示用途,纯文字说明反而更稳,也更小。
坑六:macOS 上门禁标记写在与读取的位置不同
发布前有一道门禁复核,检查前置任务(字体可用性等)是否都过了。上游脚本把标记写在 /tmp,而复核脚本读的是 $TMPDIR。在 Linux 上两者往往是同一个目录,在 macOS 上是两个完全不同的路径(/var/folders/...),于是门禁一直报未通过。把标记文件同时放到两处即可,这不是数据问题,是路径问题。
结果与核对
全部对齐后返回:
#status=201
workId=0078xxxxxxxxxxx
reward=success value=200
作品页立刻可以访问,但成长中心的积分不会同步刷新。要确认到账,去看积分明细而不是任务卡片的显示状态——明细里会多一行「在开发者作品展览馆中发布作品 / 获得 / +200 / 时间」,那才是真的入账。任务卡片的「已完成」标记也有延迟。
顺带一句版权
拿开源项目做演示时,README 开头就该写清楚:这不是原创代码,是某个项目的镜像部署,原作者是谁,用的什么许可证,原仓库在哪。MIT、Apache 这类许可证都要求保留版权声明和许可文本,把 LICENSE 文件原样放进仓库是义务,不是客套。省这一步,作品做得再漂亮也是侵权。
- 点赞
- 收藏
- 关注作者
评论(0)