华为云作品展览馆发布踩坑记:GitHub 仓库不可达、900 秒 STS 与幂等键

举报
yd_268799136 发表于 2026/11/04 14:25:19 2026/11/04
【摘要】 展览馆发布不是网页表单,而是一条 STS 临时凭证加 API 的链路。记录六个实际踩到的坑:仓库地址校验访问不到 GitHub、凭证 900 秒过期、幂等键复用、schema 严格、详情包图片缺失、macOS 门禁路径不一致。

展览馆没有网页上传入口

华为云开发者作品展览馆的发布不是网页表单,而是一条 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 文件原样放进仓库是义务,不是客套。省这一步,作品做得再漂亮也是侵权。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。