Skip to content

Commit b505b59

Browse files
author
iammm0
committed
feat(ci): 打标发布时同步到 GitHub Packages
1 parent ff6b471 commit b505b59

3 files changed

Lines changed: 71 additions & 1 deletion

File tree

.github/workflows/release.yml

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
# · 或 Classic Token:类型必须选 Automation(勿用需 OTP 的 Publish 类令牌)。
77
# 权限须覆盖 @opensec;GitHub Secret 名仍为 NPM_TOKEN。
88
# 3. git tag v2.0.0 && git push origin v2.0.0
9-
# 将触发:构建 → 校验版本 → 打 GitHub Release 并上传 tgz → npm publish。
9+
# 将触发:构建 → 校验版本 → 打 GitHub Release 并上传 tgz → npm publish(npmjs)+
10+
# GitHub Packages(仓库 Settings → Packages 可见;包名为 @<仓库所有者>/secbot,与 @opensec/secbot 并存)。
11+
# 工作流 permissions 需含 packages: write(已配置);使用 GITHUB_TOKEN 认证 npm.pkg.github.com。
1012

1113
name: Release
1214

@@ -18,6 +20,7 @@ on:
1820

1921
permissions:
2022
contents: write
23+
packages: write
2124

2225
jobs:
2326
build:
@@ -106,3 +109,36 @@ jobs:
106109
run: npm publish --access public
107110
env:
108111
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
112+
113+
publish-github-packages:
114+
name: Publish to GitHub Packages
115+
needs: build
116+
runs-on: ubuntu-latest
117+
if: startsWith(github.ref, 'refs/tags/v')
118+
steps:
119+
- uses: actions/checkout@v4
120+
121+
# GitHub Packages 要求作用域小写,与 apply-github-packages-name.js 中 pkg.name 一致
122+
- name: Normalize npm scope owner (lowercase)
123+
run: echo "NPM_SCOPE_OWNER=$(echo '${{ github.repository_owner }}' | tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV
124+
125+
- name: Set up Node.js for GitHub Packages
126+
uses: actions/setup-node@v4
127+
with:
128+
node-version: '24'
129+
registry-url: 'https://npm.pkg.github.com'
130+
scope: '${{ env.NPM_SCOPE_OWNER }}'
131+
cache: 'npm'
132+
133+
- name: Install dependencies
134+
run: npm ci
135+
136+
- name: Apply scoped name for GitHub Packages registry
137+
run: node scripts/apply-github-packages-name.js
138+
env:
139+
GITHUB_REPOSITORY_OWNER: ${{ env.NPM_SCOPE_OWNER }}
140+
141+
- name: Publish to GitHub Packages
142+
run: npm publish
143+
env:
144+
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

docs/RELEASE.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,14 @@ GitHub Actions 工作流:
4949
2. 使用 `npm run build` 构建 TypeScript 后端。
5050
3. 打包发布产物并上传到 GitHub Release。
5151
4. 发布 npm 包(如配置)。
52+
5. 同一次打标还会 **发布到 GitHub Packages**(使用 `GITHUB_TOKEN`,无需额外 Secret):包名为 `@<仓库所有者小写>/secbot`(例如 `iammm0/secbot` 对应 `@iammm0/secbot`),与 npmjs 上的 `@opensec/secbot` **名称不同、可并存**。在仓库 **Settings → Packages**(或个人 **Packages**)中查看。
5253

5354
**`NPM_TOKEN` 与 2FA**:若 npm 账号启用了双因素认证,CI 里必须用 **Granular 令牌且允许发布时绕过 2FA**,或 **Classic 的 Automation 令牌**;否则会出现 `403 ... bypass 2fa enabled is required to publish`
5455

56+
### 从 GitHub Packages 安装(可选)
57+
58+
消费方仓库需在 `.npmrc` 中指向 `https://npm.pkg.github.com`,并使用具有 `read:packages` 权限的 **Classic PAT**(或有权读取该包的工作流 token)。包名示例:`@iammm0/secbot`。详见 [Working with the npm registry](https://docs.github.com/packages/working-with-a-github-packages-registry/working-with-the-npm-registry)
59+
5560
## 本地发布任务
5661

5762
安装依赖:
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#!/usr/bin/env node
2+
/**
3+
* Release CI:将 package.json 调整为发布到 GitHub Packages。
4+
* GitHub npm registry 要求作用域与仓库所有者一致(与 npmjs 上的 @opensec/* 可并存为二次发布)。
5+
*
6+
* 环境变量:GITHUB_REPOSITORY_OWNER(由 Actions 注入)
7+
*/
8+
'use strict';
9+
10+
const fs = require('node:fs');
11+
const path = require('node:path');
12+
13+
const owner = (process.env.GITHUB_REPOSITORY_OWNER || '').trim().toLowerCase();
14+
if (!owner) {
15+
console.error('Missing GITHUB_REPOSITORY_OWNER');
16+
process.exit(1);
17+
}
18+
19+
const pkgPath = path.join(__dirname, '..', 'package.json');
20+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
21+
const parts = String(pkg.name || '').split('/');
22+
const tail = (parts.length >= 2 ? parts[1] : 'secbot').toLowerCase();
23+
24+
pkg.name = `@${owner}/${tail}`;
25+
pkg.publishConfig = {
26+
registry: 'https://npm.pkg.github.com',
27+
};
28+
29+
fs.writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\n`);

0 commit comments

Comments
 (0)