🔧 修复npm认证配置,参考DPML项目设置 - 添加NODE_AUTH_TOKEN环境变量 - 配置registry-url - 使用pnpm发布 - 添加测试脚本和文档
This commit is contained in:
9
.github/workflows/snapshot.yml
vendored
9
.github/workflows/snapshot.yml
vendored
@ -27,6 +27,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
node-version: '20.x'
|
node-version: '20.x'
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
registry-url: 'https://registry.npmjs.org/'
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: pnpm install --frozen-lockfile
|
run: pnpm install --frozen-lockfile
|
||||||
@ -39,9 +40,6 @@ jobs:
|
|||||||
# 确保在正确的分支
|
# 确保在正确的分支
|
||||||
git checkout develop
|
git checkout develop
|
||||||
|
|
||||||
# 配置npm认证
|
|
||||||
echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > ~/.npmrc
|
|
||||||
|
|
||||||
# 获取当前时间戳和短commit hash
|
# 获取当前时间戳和短commit hash
|
||||||
TIMESTAMP=$(date +%Y%m%d%H%M%S)
|
TIMESTAMP=$(date +%Y%m%d%H%M%S)
|
||||||
SHORT_COMMIT=$(git rev-parse --short HEAD)
|
SHORT_COMMIT=$(git rev-parse --short HEAD)
|
||||||
@ -57,14 +55,15 @@ jobs:
|
|||||||
# 直接设置版本号
|
# 直接设置版本号
|
||||||
npm version $SNAPSHOT_VERSION --no-git-tag-version
|
npm version $SNAPSHOT_VERSION --no-git-tag-version
|
||||||
|
|
||||||
# 发布snapshot版本
|
# 使用pnpm发布snapshot版本(与DPML项目保持一致)
|
||||||
npm publish --tag snapshot
|
pnpm publish --tag snapshot --no-git-checks
|
||||||
|
|
||||||
# 输出版本信息供后续步骤使用
|
# 输出版本信息供后续步骤使用
|
||||||
echo "SNAPSHOT_VERSION=$SNAPSHOT_VERSION" >> $GITHUB_ENV
|
echo "SNAPSHOT_VERSION=$SNAPSHOT_VERSION" >> $GITHUB_ENV
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||||
|
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||||
|
|
||||||
- name: Comment on related PRs
|
- name: Comment on related PRs
|
||||||
if: success()
|
if: success()
|
||||||
|
|||||||
116
docs/npm-publishing-setup.md
Normal file
116
docs/npm-publishing-setup.md
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
# NPM 发布认证设置指南
|
||||||
|
|
||||||
|
## 问题诊断
|
||||||
|
|
||||||
|
当前CI发布失败的错误信息:
|
||||||
|
```
|
||||||
|
npm error code ENEEDAUTH
|
||||||
|
npm error need auth This command requires you to be logged in to https://registry.npmjs.org/
|
||||||
|
npm error need auth You need to authorize this machine using `npm adduser`
|
||||||
|
```
|
||||||
|
|
||||||
|
## 解决方案
|
||||||
|
|
||||||
|
### 1. 获取NPM Access Token
|
||||||
|
|
||||||
|
#### 步骤1:登录NPM
|
||||||
|
访问 [https://www.npmjs.com/](https://www.npmjs.com/) 并登录您的账户
|
||||||
|
|
||||||
|
#### 步骤2:生成Access Token
|
||||||
|
1. 点击右上角头像 → "Access Tokens"
|
||||||
|
2. 点击 "Generate New Token"
|
||||||
|
3. 选择 "Automation" 类型(用于CI/CD)
|
||||||
|
4. 复制生成的token(格式类似:`npm_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`)
|
||||||
|
|
||||||
|
### 2. 配置GitHub Secrets
|
||||||
|
|
||||||
|
#### 步骤1:访问仓库设置
|
||||||
|
访问:https://github.com/Deepractice/PromptX/settings/secrets/actions
|
||||||
|
|
||||||
|
#### 步骤2:添加NPM_TOKEN
|
||||||
|
1. 点击 "New repository secret"
|
||||||
|
2. Name: `NPM_TOKEN`
|
||||||
|
3. Secret: 粘贴上一步获取的npm token
|
||||||
|
4. 点击 "Add secret"
|
||||||
|
|
||||||
|
### 3. 验证配置
|
||||||
|
|
||||||
|
#### 本地测试(可选)
|
||||||
|
```bash
|
||||||
|
# 设置临时环境变量
|
||||||
|
export NPM_TOKEN=npm_your_token_here
|
||||||
|
|
||||||
|
# 测试认证
|
||||||
|
./scripts/test-npm-auth.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
#### CI测试
|
||||||
|
推送代码到develop分支,观察CI日志中的发布结果
|
||||||
|
|
||||||
|
### 4. 包权限检查
|
||||||
|
|
||||||
|
#### 确保包名可用
|
||||||
|
```bash
|
||||||
|
npm view dpml-prompt
|
||||||
|
```
|
||||||
|
|
||||||
|
如果包不存在或您没有发布权限,可能需要:
|
||||||
|
1. 更改包名
|
||||||
|
2. 请求包的发布权限
|
||||||
|
3. 或者发布为scoped包(如:`@deepractice/dpml-prompt`)
|
||||||
|
|
||||||
|
### 5. 常见问题排查
|
||||||
|
|
||||||
|
#### 问题1:Token无效
|
||||||
|
- 确保token类型是 "Automation"
|
||||||
|
- 确保token没有过期
|
||||||
|
- 重新生成token并更新GitHub Secret
|
||||||
|
|
||||||
|
#### 问题2:权限不足
|
||||||
|
- 确保您的npm账户有发布权限
|
||||||
|
- 如果是组织包,确保您是组织成员并有发布权限
|
||||||
|
|
||||||
|
#### 问题3:包名冲突
|
||||||
|
- 检查包名是否已存在:`npm view dpml-prompt`
|
||||||
|
- 考虑使用scoped包名:`@deepractice/dpml-prompt`
|
||||||
|
|
||||||
|
#### 问题4:2FA认证
|
||||||
|
如果启用了2FA,需要:
|
||||||
|
1. 使用Automation token(不需要2FA)
|
||||||
|
2. 或在token设置中配置适当的权限
|
||||||
|
|
||||||
|
### 6. 最佳实践
|
||||||
|
|
||||||
|
#### Token安全
|
||||||
|
- 永远不要在代码中硬编码token
|
||||||
|
- 定期轮换token
|
||||||
|
- 使用最小权限原则
|
||||||
|
|
||||||
|
#### CI配置
|
||||||
|
- 使用`NODE_AUTH_TOKEN`环境变量
|
||||||
|
- 配置正确的registry URL
|
||||||
|
- 使用`--no-git-checks`标志避免git相关检查
|
||||||
|
|
||||||
|
#### 监控
|
||||||
|
- 监控发布日志
|
||||||
|
- 设置发布成功/失败通知
|
||||||
|
- 定期检查已发布的版本
|
||||||
|
|
||||||
|
### 7. 参考DPML项目
|
||||||
|
|
||||||
|
DPML项目(https://github.com/Deepractice/dpml)也使用类似的发布流程,可以参考其配置:
|
||||||
|
- 使用pnpm发布
|
||||||
|
- 配置NODE_AUTH_TOKEN
|
||||||
|
- 使用actions/setup-node的registry-url配置
|
||||||
|
|
||||||
|
### 8. 当前修复状态
|
||||||
|
|
||||||
|
已修复的配置:
|
||||||
|
- ✅ 添加了NODE_AUTH_TOKEN环境变量
|
||||||
|
- ✅ 配置了registry-url
|
||||||
|
- ✅ 使用pnpm发布(与DPML项目一致)
|
||||||
|
- ✅ 移除了手动.npmrc配置(使用actions/setup-node自动配置)
|
||||||
|
|
||||||
|
待验证:
|
||||||
|
- 🔍 GitHub Secrets中的NPM_TOKEN配置
|
||||||
|
- 🔍 npm账户的包发布权限
|
||||||
28
scripts/test-npm-auth.sh
Executable file
28
scripts/test-npm-auth.sh
Executable file
@ -0,0 +1,28 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# 测试npm认证配置
|
||||||
|
|
||||||
|
echo "🔍 测试NPM认证配置"
|
||||||
|
echo "=================="
|
||||||
|
|
||||||
|
# 检查npm配置
|
||||||
|
echo "📋 当前npm配置:"
|
||||||
|
npm config list
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "🔑 检查认证配置:"
|
||||||
|
npm whoami 2>/dev/null && echo "✅ NPM认证成功" || echo "❌ NPM认证失败"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "📦 测试包信息查看:"
|
||||||
|
npm view dpml-prompt versions --json 2>/dev/null | tail -5 || echo "❌ 无法查看包信息"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "🔍 检查registry配置:"
|
||||||
|
npm config get registry
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "💡 如果认证失败,请确保:"
|
||||||
|
echo "1. GitHub Secrets中设置了正确的NPM_TOKEN"
|
||||||
|
echo "2. NPM_TOKEN具有发布权限"
|
||||||
|
echo "3. 包名dpml-prompt可用或者您有权限发布"
|
||||||
Reference in New Issue
Block a user