-
Notifications
You must be signed in to change notification settings - Fork 1
114 lines (104 loc) · 4.51 KB
/
Copy pathrelease.yml
File metadata and controls
114 lines (104 loc) · 4.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
name: release
on:
push:
tags:
- "v*"
# 手动触发:用于首次发布 npm(tag 已存在、push 不会再触发时),
# 在 GitHub Actions 页面选 release workflow → Run workflow,填版本号。
# 手动触发只发 npm(GitHub Release 此时已存在),跳过 GoReleaser。
workflow_dispatch:
inputs:
version:
description: "要发布到 npm 的版本号(不含 v 前缀,如 0.1.0)"
required: true
permissions:
contents: write
jobs:
# 第一步:GoReleaser 构建 5 平台二进制并创建 GitHub Release。
# 仅在 tag push 时运行;手动触发(dispatch)时跳过。
goreleaser:
if: github.event_name == 'push'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Set up Go
uses: actions/setup-go@v6
with:
# 从 go.mod 读取版本,避免与 go 指令漂移。
go-version-file: go.mod
cache: true
- name: Run GoReleaser
# v7 起 action 运行时升级到 Node 24(v6 跑在 Node 20,已被 GitHub 标记弃用)。
# 输入 distribution/version/args 与 v6 兼容。
uses: goreleaser/goreleaser-action@v7
with:
distribution: goreleaser
version: "~> v2"
args: release --clean
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# 第二步:构建并发布 npm 包,用 OIDC Trusted Publishing(无需任何 token)。
# 结构:主包(壳)+ 5 个平台子包(含二进制)。npm 装主包时按 optionalDependencies
# 自动只装匹配当前系统的子包,装完即用、无 postinstall、无运行时下载。
# - tag push:等 goreleaser 成功后再发(子包要从 Release 下载二进制)。
# - 手动触发:直接发(Release 已存在)。
npm-publish:
needs: goreleaser
# 手动触发时 goreleaser 被跳过,用 always() + 条件让本 job 仍能运行;
# tag push 时要求 goreleaser 成功。
if: |
always() &&
(github.event_name == 'workflow_dispatch' || needs.goreleaser.result == 'success')
runs-on: ubuntu-latest
permissions:
contents: read
# OIDC 关键权限:允许本 job 生成 OIDC token 向 npm 认证。
id-token: write
steps:
- uses: actions/checkout@v6
- name: Set up Node
uses: actions/setup-node@v6
with:
# Node 24 自带 npm v11(≥ 11.5.1),满足 OIDC Trusted Publishing 要求。
node-version: "24"
registry-url: "https://registry.npmjs.org"
- name: Resolve version
# tag push 用 GITHUB_REF_NAME(去 v 前缀);手动触发用输入参数。
id: ver
run: |
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
VERSION="${{ github.event.inputs.version }}"
else
VERSION="${GITHUB_REF_NAME#v}"
fi
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
echo "publishing @thinkthinking/cli@$VERSION"
- name: Build platform subpackages + sync main package
# 从 Release 下载 5 平台二进制,生成 npm/packages/cli-* 子包,并把主包
# version 与 optionalDependencies 同步成本次版本号。
run: node npm/scripts/build-packages.mjs
env:
VERSION: ${{ steps.ver.outputs.version }}
REPO: thinkthinking/cli
# 仅用于下载 Release 资产防限流。
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Publish subpackages then main (OIDC)
# 关键:本步骤刻意不设置任何 npm auth token 环境变量。
# 哪怕设成空字符串,npm 也会误用空 token 而非走 OIDC;
# 只有完全不设置时,npm 才会自动检测并使用 OIDC 认证。
# provenance 在 OIDC 下自动生成,无需 --provenance。
#
# 顺序是硬要求:必须先发完 5 个子包,再发主包。
# 主包 optionalDependencies 是精确版本,若子包未发,用户安装主包时
# optional 解析失败会静默跳过 → wrapper 找不到二进制。set -e 保证任一
# 子包失败立即中止,绝不会执行到发主包那行。
run: |
set -e
for d in npm/packages/cli-*; do
echo "==> publishing $d"
( cd "$d" && npm publish --access public )
done
echo "==> publishing main package npm/package"
( cd npm/package && npm publish --access public )