Files
medical-mall/server/消息推送文档/DEPLOY_WORKFLOW.md
2026-03-11 16:42:33 +08:00

5.3 KiB
Raw Permalink Blame History

部署工作流(打包 → 上传/发布 → smoketest

  • 目的: 描述如何把本地 uniCloud 云函数项目自动化打包、上传并发布为可供后端调用的云函数;说明两种上传方式(直接调用上传 API / 使用 unicloud CLI与 smoketest 验证流程;给出 CI 集成与常见故障排查建议。

  • 目录结构(示例):

    • uniCloud-alipay/cloudfunctions/<funcName>/ - 云函数源码目录(含 index.jspackage.json 等)
    • server/tools/deploy-cloudfunc.js - 打包并上传/发布的脚本
    • server/dist/ - 输出的 zip 文件目录
  1. 打包
  • 使用脚本 server/tools/deploy-cloudfunc.js 的默认行为:把指定云函数目录压缩为 zip例如 dist/testUnipush2.zip)。
  • 本地快速命令:
    # 只打包(不上传)
    node server/tools/deploy-cloudfunc.js --dir path/to/your/cloudfunctions/func
    
  1. 上传 / 发布(两种方式,任选其一)
  • A. 使用提供商“上传/发布”HTTP API推荐用于无 CLI 的环境)

    • 要求:提供上传 URLCLOUD_UPLOAD_URL 或 --upload)、必要的 tokenCLOUD_UPLOAD_TOKEN和可能的额外表单字段例如 appId
    • 流程:脚本把 zip 作为 multipart/form-data POST 到上传端点;若上传端点返回仅是“已接收”而非“已发布”,还需调用发布/部署 APICLOUD_DEPLOY_API 或 --deployApi)。
    • 注意:不要把 zip 发到函数的 invoke调用URL例如 /test)。如果你把文件 POST 到 invoke URL平台会把请求当作函数执行并返回业务错误例如 {"errCode":400,"errMsg":"push_clientid required"})。脚本内已添加检测,当响应看起来像 invoke 返回会立即报错并提示。
  • B. 使用 unicloud CLI简单且与 HBuilder 官方流程一致)

    • 前提:机器/CI 能安装并执行 unicloud,并已登录或有可用凭证。常用命令示例:
      unicloud upload -p <SPACE_ID> -f <FUNCTION_NAME> ./uniCloud-alipay/cloudfunctions/<FUNCTION_NAME>
      
    • 优点:不需要逆向抓包,等同于控制台发布,适合 CI。缺点需在 CI 中安装 CLI 并处理登录。
    • 建议:在脚本中添加 CLI fallback当未提供 --upload 时尝试调用 unicloud upload(脚本可接收 --spaceId 或环境变量 CLOUD_UNICLOUD_SPACEID)。
  1. smoketest发布后验证
  • 在上传/发布成功后,应通过函数的 invoke URL 做一次简单调用,验证函数行为(例如发送测试推送或返回 expected response。脚本支持传入 --invokeUrl / --funcInvokeUrl--testCid 做自动验证。
  • 若 smoketest 失败:检查是否为 invoke URL 被误用为 upload URL、是否发布尚未完成、或权限/鉴权token问题。
  1. CI 集成GitHub Actions 示例思路)
  • 步骤:
    1. Checkout 代码
    2. 安装依赖(若使用脚本中的 archiver/form-data/node-fetch
    3. 若使用 CLI安装 unicloud 并通过 secrets 登录(或在 runner 上提前配置 service account
    4. 运行 node server/tools/deploy-cloudfunc.js --upload ${{ secrets.CLOUD_UPLOAD_URL }} --invokeUrl ${{ secrets.CLOUD_FUNC_URL }} --testCid ${{ secrets.TEST_DEVICE_CID }} 或运行 CLI fallback
    5. 检查返回码并在失败时标记 Job 失败
  1. 必要环境变量与参数
  • CLOUD_UPLOAD_URL / --upload : 上传 API URL非函数 invoke URL
  • CLOUD_UPLOAD_TOKEN : 上传时使用的 Bearer token或其它鉴权
  • CLOUD_DEPLOY_API / --deployApi : 若上传后需单独调用发布 API可传入
  • CLOUD_FUNC_URL / --invokeUrl : 发布后的函数调用 URL用来做 smoketest
  • TEST_DEVICE_CID / --testCid : 用于 push smoketest 的测试设备 CID
  • CLOUD_UNICLOUD_SPACEID / --spaceId : 若使用 unicloud CLI 上传则为服务空间 ID
  1. 常见问题与排查步骤
  • 问:脚本返回 Only absolute URLs are supported 或 fetch 报错

    • 答:通常因为 --upload 使用但没有提供值;请改为 --upload <URL> 或设置 CLOUD_UPLOAD_URL
  • 问:上传后看到 {"errCode":400,"errMsg":"push_clientid required"}

    • 答:说明你把 zip POST 到了函数的 invoke URL它把请求当作函数调用处理。请提供正确的上传/发布 API 或使用 unicloud upload CLI 来发布。
  • 排查建议:

    • 在 HBuilderX 的发布流程中打开 Network 面板,执行一次发布并抓取对应请求(记录 URL、method、form 字段、headers把它贴到脚本配置中或发给维护者。
    • 在 PowerShell 或 Linux 上用 curl -v 验证上传端点返回内容,注意响应结构是否像“发布成功”而非函数执行结果。
  1. 安全建议
  • 把上传/发布的 token、spaceId、testCid 等放在 CI secrets 或受保护的环境变量中,避免写入代码库。
  • 脚本中的自动部署入口应加鉴权(例如 DEPLOY_BEARER),不要在公网上暴露未经保护的上传接口。
  1. 下一步(可选)
  • 我可以把 deploy-cloudfunc.js 增加 unicloud CLI fallback检测 --spaceIdCLOUD_UNICLOUD_SPACEID 并在没有 --upload 时调用 CLI也可直接把你抓到的 HBuilder 上传请求模式接入脚本以实现完全自动化。请告知你偏好哪个方案。

文件位置server/DEPLOY_WORKFLOW.md