我试图复制一个自动化的github工作流程,这些步骤允许我通过一个合适的**.npmrc**文件从我的本地控制台手动发布一个包。
如果手动输入(从我的Node.js项目的根文件夹):
echo "@myorganization:registry=https://npm.pkg.github.com" > .npmrc
echo "//npm.pkg.github.com/:username=myname" >> .npmrc
echo "//npm.pkg.github.com/:_authToken=xyz" >> .npmrc
npm publish
我成功地出版了我的包裹。
但是,如果我在**.yml**文件中写入:
on:
release:
types: [created]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 18
- run: npm ci
- run: npm test
publish-gpr:
needs: build
runs-on: ubuntu-latest
permissions:
packages: write
contents: read
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 16
registry-url: https://npm.pkg.github.com/
- name: npm publish
env:
NODE_AUTH_TOKEN: ${{secrets.MY_TOKEN}
run: |
echo "myorganization:registry=https://npm.pkg.github.com" > .npmrc
echo "//npm.pkg.github.com/:username=myname" >> .npmrc
echo "//npm.pkg.github.com/:_authToken=${NODE_AUTH_TOKEN:?}" >> .npmrc
npm publish
我得到错误:
...
npm notice Publishing to https://npm.pkg.github.com
npm ERR! code E401
npm ERR! 401 Unauthorized - PUT https://npm.pkg.github.com/@myorganization%2fmyrepository - unauthenticated: User cannot be authenticated with the token provided.
...
因此,我认为问题来自环境变量NODE_AUTH_TOKEN到显式xyzsecret值的转换。然而,我一直未能解决这样的问题。你能理解什么是错的吗?
2条答案
按热度按时间lpwwtiir1#
在我看来,新引入的参数
NODE_AUTH_TOKEN
在环境中丢失了。只有在调用
npm publish
并出现错误时才会注意到这一点。一些提示和示例:
当您转换为工作流时,开始将您的命令序列移植到单个
run:
中,因为它属于一个整体。此外,始终将
env:
放在run:
之前,以便环境在前面可见(并且更容易发现丢失的参数)。最后,如果所需参数为空(
${NODE_AUTH_TOKEN:?}
),则会出现错误,因此可以尽早产生错误,并且易于定位。为了使它更安全,你可以改变第一次写入.npmrc通过使用
>
而不是>>
来创建该文件。如果该文件存在(不干净的构建),您就不会遇到这样的问题。但严格地说,这是没有必要的。xmq68pz92#
即使在理解了如何通过
.npmrc
文件(参见here)非交互式登录之后,我仍然在成功地自动发布我的软件包之前挣扎了几个小时。因此,让我建议其他人,在github工作流的上下文中,.nmprc
文件的位置由环境变量NPM_CONFIG_USERCONFIG
引用,也就是说,你不能简单地说:在
.yml
文件中。相反,你必须这样写:此外,如果您在某个组织范围内发布您的包,则必须使用组织令牌,而不是您的个人令牌,即使您是组织所有者。
.yml
文件如下:我希望这能帮上忙。