将 NPM 包发布到 GitLab 包注册表

问题描述 投票:0回答:2

我按照 GitLab 文档中的说明将我的项目作为包发布到项目的注册表中。这是我的

.gitlab-ci.yml
文件:

image: node:18

stages:
  - publish

publish:
  stage: publish
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
  script:
    - echo "//${CI_SERVER_HOST}/api/v4/projects/${CI_PROJECT_ID}/packages/npm/:_authToken=${CI_JOB_TOKEN}">.npmrc
    - npm publish

当我运行此管道时,出现以下错误:

npm ERR! code ENEEDAUTH
npm ERR! need auth This command requires you to be logged in to https://registry.npmjs.org/
npm ERR! need auth You need to authorize this machine using `npm adduser`
npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2023-02-16T19_08_00_397Z-debug-0.log

为什么它说我需要通过

registry.npmjs.org
进行身份验证?我正在尝试发布到我的 GitLab 包注册表,而不是 NPM。更重要的是,我如何正确地通过 GitLab 进行身份验证并将我的 NPM 包发布到项目的注册表?

更多详情

我尝试在我的

script
块的顶部添加这一行:

- echo "registry=https://${CI_SERVER_HOST}/api/v4/projects/${CI_PROJECT_ID}/packages/npm/">.npmrc

这会出现以下错误:

npm notice Publishing to https://gitlab.com/api/v4/projects/<project-id>/packages/npm/ with tag latest and default access
npm ERR! code E403
npm ERR! 403 403 Forbidden - PUT https://gitlab.com/api/v4/projects/<project-id>/packages/npm/npm-publish-gitlab
npm ERR! 403 In most cases, you or one of your dependencies are requesting
npm ERR! 403 a package version that is forbidden by your security policy, or
npm ERR! 403 on a server you do not have access to.
npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2023-02-16T19_26_48_321Z-debug-0.log

如果我也将

image: node:18
更改为
image: node:14
,它就可以了。因此,自 Nodejs 14 以来,似乎发生了一些变化,破坏了 gitlab 管道的实现。有什么想法吗?


我将

script
更改为

  script:
    - cd ui
    - echo "@${CI_PROJECT_NAMESPACE}:${CI_JOB_TOKEN}" >> .npmrc
    - cat .npmrc
    - npm publish --registry=https://${CI_SERVER_HOST}/api/v4/projects/${CI_PROJECT_ID}/packages/npm/

现在给出:

npm ERR! code E404
npm ERR! 404 Not Found - PUT https://gitlab.com/api/v4/projects/<project-id>/packages/npm/ui
npm ERR! 404 
npm ERR! 404  '[email protected]' 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.
npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2023-02-24T16_54_47_061Z-debug.log

我是作者,这是发布该包的尝试。所以这个错误完全没有意义。接下来我要尝试什么?

gitlab npm-publish
2个回答
2
投票

您似乎缺少将包发布到内部注册表的定义。

这可以在 package.json 中完成(尽管我认为那里没有使用环境变量的便捷方法):

"publishConfig": {
    "registry":"http://my-internal-registry.local"
}

或直接在

.npmrc
:

registry=https://${CI_SERVER_HOST}/api/v4/projects/${CI_PROJECT_ID}/packages/npm/

这也可以限制在特定范围内:

@myscope:registry=https://${CI_SERVER_HOST}/api/v4/projects/${CI_PROJECT_ID}/packages/npm/

0
投票

我知道我的回答有点晚了,但是 2024 年的一种方法甚至使用节点:最新图像(当时对应于版本 21)也帮助我解决了这个问题,那就是使用以下 ci-cd 配置:

publish-npm:
  stage: deploy
  script:
    - NPM_TOKEN=$CI_DEPLOY_PASSWORD
    - echo "@scope:registry=https://${CI_SERVER_HOST}/api/v4/projects/${CI_PROJECT_ID}/packages/npm/" > .npmrc
    - echo "//${CI_SERVER_HOST}/api/v4/projects/${CI_PROJECT_ID}/packages/npm/:_authToken=\"${NPM_TOKEN}\"" >> .npmrc
    - npm publish --verbose

其中 CI_DEPLOY_PASSWORD 是一种特殊类型的 GitLab 部署令牌,自动可供管道使用

我还使用publishConfig选项配置了package.json:

"publishConfig": {
  "@<my-scope>:registry": "https://<my-server>:<my-server-port>/api/v4/projects/<my-project-id>/packages/npm/"
}

并使用名称选项:

{
  "name": "@<my-scope>/<my-package>"
}

我希望这个解决方案能有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.