如何使用gitlab ci发布私有npm软件包?

时间:2019-02-13 08:23:33

标签: npm gitlab gitlab-ci

我想用Gitlab CI发布一个私有的npm软件包。

我已经为我的npm用户创建了一个身份验证令牌,并将其设置为我的Gitlab CI设置中的变量NPM_TOKEN

然后,作业使用注册表和auth令牌创建一个.npmrc文件。

- npm run build && npm run build:es6
- echo '//registry.npmjs.org/:_authToken=${NPM_TOKEN}'>.npmrc
- npm publish

作业失败,并显示以下消息:

npm ERR! code ENEEDAUTH
npm ERR! need auth auth required for publishing
npm ERR! need auth You need to authorize this machine using `npm adduser`

是否可以仅使用身份验证令牌进行发布?

2 个答案:

答案 0 :(得分:2)

就像@Amityo所说的,而不是手动编辑npmrc文件,

npm config set //registry.npmjs.org/:_authToken ${NPM_TOKEN}

是解决之道,因为否则您可能会编辑错误的npmrc文件。

如果仍然出现身份验证错误,并且确定令牌正确,请检查注册表URL。您可以运行

npm publish --verbose

其输出将包含类似

的行
npm verb getPublishConfig { registry: 'https://.......' }
npm verb mapToRegistry no registry URL found in name for scope @boxine
npm verb publish registryBase https://.......

如果要发布到npmjs.org,则URL(上面的.......)应该为https://registry.npmjs.org/

如果此注册表URL不适合,请在npmrc文件中查找其他文件。另外,请确保您没有覆盖package.json文件中的注册表!您可以在该文件中搜索 publishConfig

答案 1 :(得分:1)

为了稍微详细说明 @phihag 的回答,正斜杠 非常 很重要。

一开始我一直找不到 404

$ npm publish
...
...
npm ERR! code E404
npm ERR! 404 Not Found - PUT https://gitlab.company.com/api/v4/packages/npm/%2fmypackage - 404 Not Found
npm ERR! 404 
npm ERR! 404  '@scope/mypackage@0.1.0' is not in the npm registry.
npm ERR! 404 You should bug the author to publish it (or use the name yourself!)
npm ERR! 404 
npm ERR! 404 Note that you can also install from a
npm ERR! 404 tarball, folder, http url, or git url.

我使用的是 2FA,因此作为 gitlab docs state,我需要使用设置为 api 的个人访问令牌进行身份验证。在 the gitlab docs 的另一部分,它声明

<块引用>

某些功能(例如发布包)仅在项目级端点上可用。

所以在控制台中,我尝试发布到项目级别并进行身份验证

$ npm config set @scope:registry https://gitlab.company.com/api/v4/projects/123/packages/npm
$ npm config set //gitlab.company.com/api/v4/projects/123/packages/npm:_authToken 'MyGeneratedAccessToken'

这消除了我的第一个问题 404 not found,但现在我无法进行身份验证。 几个小时。

$ npm publish --verbose
npm verb cli [ '/usr/local/bin/node', '/usr/local/bin/npm', 'publish', '--verbose' ]
npm info using npm@7.11.2
npm info using node@v15.11.0
...
...
npm verb publish [ '.' ]
npm notice
npm notice ?  @scope/mypackage@0.1.0
npm notice === Tarball Contents === 
npm notice 214B  README.md   
npm notice 1.1kB package.json
npm notice === Tarball Details === 
npm notice name:          @scope/mypackage                            
npm notice version:       0.1.0                                   
npm notice filename:      @scope/mypackage-0.1.0.tgz                  
npm notice package size:  764 B                                   
npm notice unpacked size: 1.3 kB                                  
npm notice shasum:        c22a42756de43e282da01f33c7d5da4940c7d1d7
npm notice integrity:     sha512-l/P2cr52Lle7h[...]isu3rDME3lYuQ==
npm notice total files:   2                                       
npm notice
npm verb stack Error: This command requires you to be logged in.
npm verb stack     at Publish.publish (/usr/local/lib/node_modules/npm/lib/publish.js:104:29)
npm verb cwd /home/user/Workspace/mypackage
npm verb Linux 5.8.0-43-generic
npm verb argv "/usr/local/bin/node" "/usr/local/bin/npm" "publish" "--verbose"
npm verb node v15.11.0
npm verb npm  v7.11.2
npm ERR! code ENEEDAUTH
npm ERR! need auth This command requires you to be logged in.
npm ERR! need auth You need to authorize this machine using `npm adduser`
npm verb exit 1
npm timing npm Completed in 352ms
npm verb code 1

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/user/.npm/_logs/2021-05-12T11_23_19_273Z-debug.log

如您所见,npm publish --verbose 无法告诉我我要发布到的网址。再次检查文档表明我在“packages/npm”之后遗漏了尾部斜杠。

使用尾部斜杠,我能够发布到该项目的 gitlab npm 包存储库

$ npm config set @scope:registry https://gitlab.company.com/api/v4/projects/123/packages/npm/
$ npm config set //gitlab.company.com/api/v4/projects/123/packages/npm/:_authToken 'MyGeneratedAccessToken'

对于我使用的所有包

$ npm config set @scope:registry https://gitlab.company.com/api/v4/packages/npm/
$ npm config set //gitlab.company.com/api/v4/packages/npm/:_authToken 'MyGeneratedAccessToken'