diff --git a/.changeset/align-release-token-dry.md b/.changeset/align-release-token-dry.md new file mode 100644 index 0000000..53d00a2 --- /dev/null +++ b/.changeset/align-release-token-dry.md @@ -0,0 +1,5 @@ +--- +"@sfmc-bds/tools": patch +--- + +发版编排:GitHub Release 缺失态回退复用 listPackagesWithExistingVersionTags;文档/workflow 对齐 SFMC_GITHUB_TOKEN(兼容旧名) diff --git a/.github/workflows/changeset-release.yml b/.github/workflows/changeset-release.yml index f166396..fe03188 100644 --- a/.github/workflows/changeset-release.yml +++ b/.github/workflows/changeset-release.yml @@ -50,7 +50,7 @@ jobs: # Version PR 需要「创建 PR」权限。仅用 GITHUB_TOKEN 且仓库关闭 # Settings→Actions→General→「Allow GitHub Actions to create and approve pull requests」时, # changesets/action 会 HttpError(分支已推送但 PR 未创建)。 - # 优先 PAT Secret CHANGESETS_GITHUB_TOKEN;未配置则回退 GITHUB_TOKEN(需上述勾选)。 + # 优先 PAT:SFMC_GITHUB_TOKEN(权威名);兼容旧名 CHANGESETS_GITHUB_TOKEN;再回退 GITHUB_TOKEN。 - name: Create Release Pull Request or Publish id: changesets uses: changesets/action@v1 @@ -63,6 +63,6 @@ jobs: commit: "chore(release): version packages" createGithubReleases: false env: - GITHUB_TOKEN: ${{ secrets.SFMC_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.SFMC_GITHUB_TOKEN || secrets.CHANGESETS_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/docs/dev/npm-publish.md b/docs/dev/npm-publish.md index 7b71956..23f18f4 100644 --- a/docs/dev/npm-publish.md +++ b/docs/dev/npm-publish.md @@ -50,7 +50,7 @@ 任选其一: 1. **推荐(零 Secret)**:Repo Settings → Actions → General → Workflow permissions → 勾选 *Allow GitHub Actions to create and approve pull requests*。 -2. **PAT**:写入 Secret **`CHANGESETS_GITHUB_TOKEN`**(能开本仓 PR);workflow 优先用该 token,未配置时回退 `GITHUB_TOKEN`。 +2. **PAT**:写入 Secret **`SFMC_GITHUB_TOKEN`**(能开本仓 PR);workflow 优先用该 token,其次兼容旧名 `CHANGESETS_GITHUB_TOKEN`,再回退 `GITHUB_TOKEN`。 ### 本地一键发版(`npm-run-all2`) @@ -108,7 +108,7 @@ npm run pack:verify 1. npm 账号登录并确认 org [sfmc-bds](https://www.npmjs.com/org/sfmc-bds) 2. Granular Access Token(Automation)写入 GitHub Secret `NPM_TOKEN` -3. (可选)若无法开启 Actions「create and approve pull requests」:写入 `CHANGESETS_GITHUB_TOKEN`(见上文 Version PR 权限) +3. (可选)若无法开启 Actions「create and approve pull requests」:写入 `SFMC_GITHUB_TOKEN`(见上文 Version PR 权限;旧名 `CHANGESETS_GITHUB_TOKEN` 仍可用) ## 模块包 diff --git a/tools/changeset-github-release.mjs b/tools/changeset-github-release.mjs index a372f62..3a5342d 100644 --- a/tools/changeset-github-release.mjs +++ b/tools/changeset-github-release.mjs @@ -12,10 +12,8 @@ import path from "node:path"; import { ROOT, extractChangelogNotes, - gitCapture, - listPublishablePackages, + listPackagesWithExistingVersionTags, packageDirFor, - packageTagName, readReleaseTagsState, resolveReleaseTagEntries, run, @@ -26,17 +24,10 @@ const forceLatest = process.argv.includes("--latest"); function loadTargets() { const state = readReleaseTagsState(); + /* DRY:缺失态回退与 tag-packages / resolvePackagesNeedingTags 共用同一权威实现 */ const entries = resolveReleaseTagEntries(state, () => { - /* 仅状态文件缺失时回退:当前版本对应 tag 已在本地的可发包 */ console.warn("[changeset] 无 .sfmc-release-tags.json,回退扫描本地 name@version tag"); - const out = []; - for (const p of listPublishablePackages()) { - const tag = packageTagName(p.name, p.version); - if (gitCapture(["tag", "-l", tag])) { - out.push({ name: p.name, version: p.version, tag }); - } - } - return out; + return listPackagesWithExistingVersionTags(); }); return entries.map((t) => ({ name: t.name, diff --git a/tools/changeset-release.test.mjs b/tools/changeset-release.test.mjs index 2afb95d..6fe2296 100644 --- a/tools/changeset-release.test.mjs +++ b/tools/changeset-release.test.mjs @@ -7,6 +7,7 @@ import { packageTagName, extractChangelogNotes, listPendingChangesetFiles, + listPackagesWithExistingVersionTags, resolveReleaseTagEntries, RELEASE_TAGS_STATE, PRE_JSON, @@ -71,6 +72,15 @@ describe("resolveReleaseTagEntries (LSP)", () => { const out = resolveReleaseTagEntries({ tags, createdAt: "t" }, () => []); assert.equal(out, tags); }); + + it("gh-release missing-state fallback is listPackagesWithExistingVersionTags (DRY)", () => { + /* 契约:changeset-github-release 不得再手写一遍 tag -l 扫描 */ + const out = resolveReleaseTagEntries(null, () => listPackagesWithExistingVersionTags()); + assert.ok(Array.isArray(out)); + for (const e of out) { + assert.equal(e.tag, packageTagName(e.name, e.version)); + } + }); }); describe("listPendingChangesetFiles (pre mode LSP)", () => {