news 2026/6/30 5:41:54

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
GitHub Actions + 阿里云 OSS:OIDC 免密同步构建产物

装包同步到阿里云 OSS,后续官网可以提供国内镜像链接。全程使用 OIDC 免密认证,不存长期 AccessKey。
过程中遇到不少问题,带着 claude code 折腾了几个小时,才整好。下边是详细的过程记录。

顺带说一句 Molio 在 github 上开源了,有兴趣的同学可以去看看。

实施过程中还修了一个附带问题:electron-builder 的--publish always会把 beta/rc 预发布 tag 也发到 GitHub Releases,而我们的 OSS 同步没有区分预发布和正式版,导致latest.json被 beta 版本覆盖,官网下载链接指向了测试版。

方案

流程

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

认证链路

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

前置配置

阿里云侧(一次性):

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

GitHub 侧配置 4 个 Repository Variables(非 Secrets,开源项目可审计):ALIYUN_ROLE_ARNALIYUN_OIDC_PROVIDER_ARNOSS_BUCKETOSS_ENDPOINT

Pre-release 处理

版本号含-即为预发布(如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。这两个 action 在 Marketplace 上不存在。

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*"]验证通过后恢复。

Pre-release 覆盖了 latest.json

推送v0.3.8-beta.1latest.json被更新为 beta 版本号。正式版用户通过 auto-update 不会收到 beta,但新用户从官网下载到的是测试版。

最终方案

前三个问题的解法相同:放弃第三方 action 和 aliyun CLI,改用原生工具链。curl获取 OIDC Token,Python SDK 调用 STS,ossutil 上传。零外部依赖,不受 action 下架或链接失效影响。

STS 签名问题靠阿里云官方 Python SDKalibabacloud_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。

Pre-release 区分在 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 <<EOF {"version":"${VERSION}","updatedAt":"$(date -u +%Y-%m-%dT%H:%M:%SZ)"} EOF ossutil cp /tmp/latest.json oss://${{ vars.OSS_BUCKET }}/releases/latest.json \ --endpoint=${{ vars.OSS_ENDPOINT }} --meta Cache-Control:no-cache else echo "Pre-release (${VERSION}), skipping latest.json" fi

备忘

要点说明
先确认 action 存在再写不要凭记忆写 action 名称,去 Marketplace 查
阿里云 API 用官方 SDKcurl 手动签名不可行,SDK 自动处理鉴权
OIDC 认证走 bearer_tokenCredentialConfig(bearer_token=...)无需 AK/SK
ARN 放 Variables 不放 Secrets开源项目可审计,ARN 本身不是敏感信息
信任策略限定 repooidc:sub: repo:owner/repo:*,防止其他 repo 扮演你的角色
workflow 顶层声明id-token: write否则拿不到 OIDC Token
Pre-release 区分对待文件全量上传,latest.json只指向正式版
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/30 5:41:42

运维转大模型:实践笔记 06

聊《运维转大模型&#xff1a;实践笔记 06》之前&#xff0c;先说一句实在的&#xff1a;别急着背概念&#xff0c;先看它在真实项目里到底解决什么问题。摘要本文概述文章目标、核心观点和实践价值。摘要&#xff1a;很多运维同学转型 AI 时&#xff0c;容易陷入“为了用 LLM …

作者头像 李华
网站建设 2026/6/30 5:38:46

终极黑客工具排名表

这并非游戏工具强度排名。即使是“C级”工具&#xff0c;在这里也可能成为救命稻草。这是一份针对你的大脑和工作流程的优先级列表&#xff1a;哪些工具需要优先掌握&#xff0c;哪些工具需要每天依赖&#xff0c;以及哪些工具需要留着以备不时之需。 S级&#xff1a;不可或缺…

作者头像 李华
网站建设 2026/6/30 5:38:13

Rocky 9 bond0 异常状态

报错信息&#xff1a;NetworkManager 叠加了多个连接配置&#xff0c;导致 bond0 上出现“多来源 IP” bond0: <NO-CARRIER,BROADCAST,MULTICAST,MASTER,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000link/ether 32:f8:3f:87:c3:b9 brd ff:ff:ff:ff:ff…

作者头像 李华
网站建设 2026/6/30 5:36:38

MCP协议与Playwright结合:实现零代码浏览器自动化

1. 项目概述&#xff1a;当MCP遇上Playwright&#xff0c;自动化进入“零代码”时代最近在开发者圈子里&#xff0c;MCP&#xff08;Model Context Protocol&#xff09;和Playwright这两个词的热度居高不下。如果你还在手动点点点做UI测试&#xff0c;或者为搭建复杂的自动化脚…

作者头像 李华
网站建设 2026/6/30 5:36:32

计算机Java毕设实战-基于 SpringBoot 的应急救援物资出入库管控系统设计 灾害场景下救援物资调度平台的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/6/30 5:36:31

2026年外卖优惠战:同城谁家更受宠?

随着本地生活服务数字化的不断推进&#xff0c;外卖市场正经历着前所未有的变革。在经历了2025年的“补贴大战”后&#xff0c;各大平台纷纷调整策略&#xff0c;从单一的价格竞争转向了更加注重用户体验和服务质量的竞争模式。对于消费者而言&#xff0c;选择一个既实惠又可靠…

作者头像 李华