feat(cli): post/convert 改用位置参数按后缀自动判断;强化 -h 帮助;升级 goreleaser-action #4
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 ) |