游乐游手机版
首页/AI教程/文章详情

GitHub Actions利用OIDC免密同步构建产物到阿里云OSS

时间:2026-06-22 15:08
采用GitHubActions与阿里云OSS结合,通过OIDC免密认证自动上传构建产物。预发布版本仅上传至OSS但不更新latest json,避免测试版覆盖正式版。为解决第三方工具失效问题,改用curl获取OIDCToken、PythonSDK调用STS、ossutil上传,确保流水线稳定可靠。

背景

最近在开发一款面向知识工作者的创作系统 Molio,这是一款桌面应用,需要进行打包分发。安装包原本通过 GitHub Releases 发布,但国内用户下载速度极慢,自动更新也经常失败。后来决定添加阿里云 OSS 镜像,在官网上直接提供国内下载链接。于是,在 CI 流水线中增加了一个 upload-oss 任务,构建完成后自动将安装包推送至阿里云 OSS。整个过程采用 OIDC 免密认证,无需长期保存 AccessKey。这一路遇到了不少问题,与 Claude 一起折腾了好几个小时才最终搞定,下面把完整的踩坑与解决过程记录下来。

GitHub Actions + 阿里云 OSS:OIDC 免密同步构建产物

过程中还顺手修复了一个附带问题:electron-builder 的 --publish always 会将 beta/rc 这类预发布 tag 也一并发布到 GitHub Releases,而 OSS 这边没有区分预发布和正式版,结果 latest.json 被 beta 版本覆盖,官网下载链接指向了测试版,这对用户来说显然不太友好。

解决方案

工作流程

GitHub Actions (tag 推送)→ smoke-test → build (发布到 GitHub Releases)→ upload-oss├── 始终上传安装包到 OSS(包含预发布版本)└── 仅正式版更新 latest

认证链路

GitHub OIDC Token → 阿里云 STS AssumeRoleWithOIDC → 临时 AK/SK/Token → ossutil 上传

前置配置

阿里云这边一次性配置完成:

  1. 创建一个 OSS Bucket molio-releases(公共读、标准存储)
  2. 创建 OIDC Provider,信任 GitHub Actions,Audience 设置为 sts.aliyuncs.com
  3. 创建 RAM Role GitHubActions-OSSUpload,信任策略限定为 repo:zhuzhaoyun/Molio:*
  4. 附加最小权限策略:仅允许操作 molio-releases 这个 bucket

GitHub 这边配置 4 个 Repository Variables(不是 Secrets,开源项目可审计):ALIYUN_ROLE_ARNALIYUN_OIDC_PROVIDER_ARNOSS_BUCKETOSS_ENDPOINT

预发布版本处理

版本号中包含 - 即视为预发布(例如 1.0.0-beta.1),不包含则为正式版(如 1.0.0)。预发布版本正常上传到 OSS,但不会更新 latest.json,这样内部测试时随意使用,不会将测试版推送给普通用户。

Tag 格式 类型 OSS 上传 更新 latest.json
v1.0.0 正式版
v1.0.0-beta.1 预发布
v1.0.0-rc.2 预发布

踩坑记录

凭空捏造的 GitHub Action

凭印象写了 aliyun/configure-credentials@v3aliyun/ossutil-action@v1,结果 CI 直接报 repository not found。去 Marketplace 一查,发现这两个 action 根本不存在,白费了一番功夫。

aliyun CLI 下载链接失效

又想改用 aliyun CLI 来执行任务,结果 https://aliyuncli.alicdn.com/aliyun_cli_latest_linux_amd64.tar.gz 返回 404,链接已经失效无法使用。

curl 调用 STS API 缺少签名

放弃 CLI 后改用 curl 直接调用 STS API。OIDC Token 倒是顺利获取,但 STS 返回 MissingTimestamp。阿里云 STS API 需要 HMAC-SHA1 请求签名,其中包含 Timestamp、Nonce 等参数,仅靠 curl 手动拼接 URL 根本无法完成签名。

测试 tag 不匹配 workflow trigger

推送 v0.3.11-test 后 release workflow 没有触发。检查发现 release.yml 的 trigger 配置的是 tags: ["v*.*.*"]-test 后缀不匹配三段式版本号的 glob 模式。临时改为 tags: ["v*"] 验证通过后立即恢复回来。

预发布版本覆盖了 latest.json

推送 v0.3.8-beta.1 后,latest.json 被更新成了 beta 版本号。虽然正式版用户通过 auto-update 不会收到 beta 版本,但新用户从官网下载到的却是测试版,这就比较尴尬了。

最终方案

前三个问题的解决思路其实是一致的:放弃第三方 action 和 aliyun CLI,改用原生工具链。使用 curl 获取 OIDC Token,Python SDK 调用 STS,最后用 ossutil 上传。零外部依赖,不受 action 下架或链接失效影响。

STS 签名问题通过阿里云官方 Python SDK alibabacloud_sts20150401 解决。SDK 自动处理签名、Timestamp、Nonce,并且原生支持 OIDC bearer token:

from alibabacloud_sts20150401.client import Client
from alibabacloud_tea_openapi import models as api_models

config = api_models.Config(
    credential=api_models.CredentialConfig(
        bearer_token=oidc_token
    ),
    region_id='cn-guangzhou',
)
client = Client(config=config)
resp = client.assume_role_with_oidc(request)

CredentialConfig(bearer_token=...) 是 OIDC 免密认证的标准用法,完全不需要任何 AK/SK。

预发布版本的判断在 upload-oss job 中通过版本号进行区分:

- name: Upload to OSS and update latest.json
  shell: bash
  run: |
    VERSION="${{ steps.version.outputs.version }}"
    TAG="v${VERSION}"
    for file in ./release-assets/*; do
      filename=$(basename "$file")
      ossutil cp "$file" oss://${{ vars.OSS_BUCKET }}/releases/${TAG}/${filename} --endpoint=${{ vars.OSS_ENDPOINT }} --update
    done
    if [[ "$VERSION" != *-* ]]; then
      echo "Stable release, updating latest.json"
      cat > /tmp/latest.json <

备忘与经验总结

要点 说明
先确认 action 存在再使用 不要凭记忆写 action 名称,先去 Marketplace 核实
阿里云 API 优先使用官方 SDK curl 手动签名不可行,SDK 自动处理鉴权逻辑
OIDC 认证走 bearer_token CredentialConfig(bearer_token=...) 无需 AK/SK,更安全
ARN 放 Variables 而非 Secrets 开源项目可审计,ARN 本身不属于敏感信息
信任策略严格限定 repo oidc:sub: repo:owner/repo:*,防止其他 repo 冒用你的角色
workflow 顶层声明 id-token: write 否则无法获取 OIDC Token
预发布版本区分对待 文件全量上传,latest.json 仅指向正式版

项目地址:github.com/zhuzhaoyun/Molio
官网地址:molio.cn/

来源:https://juejin.cn/post/7651959891603996687
上一篇提示词不用背,4个万能提问模板贴电脑旁 下一篇AI提示词工程师暗语手册 看懂黑话效率翻倍
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
Windows Docker Desktop RabbitMQ生产级部署完整指南
AI教程 · 2026-06-29

Windows Docker Desktop RabbitMQ生产级部署完整指南

前言 在 Windows 本地开发环境中,直接安装 RabbitMQ 确实颇为周折:需要单独配置 Erlang 运行环境、手动管理环境变量、服务启停全凭手工操作。更令人困扰的是,版本兼容冲突、端口占用、环境不一致等问题层出不穷。笔者见过不少开发者为搭建环境就得耗费整整半天时间。 相比之下,借助 Do

AI搜索重构制造业采购逻辑的阿里云企业级GEOCMS优化实践
AI教程 · 2026-06-29

AI搜索重构制造业采购逻辑的阿里云企业级GEOCMS优化实践

先分享一个切实感受。过去两年,我们与福建制造企业合作较为频繁,发现一个非常突出的现象:超过80%的企业官网,产品参数仍然存放在PDF或图片中。AI爬虫?根本无法抓取。这些企业技术实力不弱、资质证照齐全、应用案例也丰富,但在AI搜索这一全新战场上,它们几乎处于隐身状态。 一、一个正在发生的行业变化 A

阿里云Token Plan团队版功能价格与省钱购买指南
AI教程 · 2026-06-29

阿里云Token Plan团队版功能价格与省钱购买指南

阿里云百炼近期推出了名为“Token Plan 团队版”的全新服务,这一服务专为企业与开发者量身打造,定位为AI大模型订阅平台。通过引入Credits作为统一计量单位,将文本生成、图像生成等多模态AI能力纳入单一计费体系,同时无缝兼容主流AI编程工具及智能体(Agent)生态系统。其核心亮点包括:全

阿里云物联网.NET Core客户端位置信息上报
AI教程 · 2026-06-29

阿里云物联网.NET Core客户端位置信息上报

阿里云物联网平台的位置服务并非一个完全独立的功能模块。位置信息可包含二维坐标与三维坐标,而位置数据的来源本质上是借助设备属性进行上传。换言之,若要让设备上报位置,您需先将其视为一个普通属性进行处理。 1)添加二维位置数据 操作过程十分简洁。进入数据分析 → 空间数据可视化 → 二维数据,点击添加,将

年阿里云服务器选型配置与网站部署全攻略
AI教程 · 2026-06-29

年阿里云服务器选型配置与网站部署全攻略

2026年,阿里云服务器生态已高度成熟,形成了清晰的轻量应用服务器与ECS云服务器两大产品阵营。无论你是计划搭建个人博客、企业官网,还是运营电商平台、进行应用开发,基本都能找到理想的解决方案。本指南将从服务器选型、配置选择、部署流程到安全运维,系统梳理2026年最实用的操作要点,帮助你少走弯路,让网