不使用私有注册表的 Gitlab 语义发布

Gitlab semantic release not using private registry

我正在尝试使用语义发布来发布到 gitlab 上的范围内的私有注册表,但我一直收到错误,因为它正在尝试针对 public 注册表而不是私有注册表进行身份验证。

这是我的设置(有些东西被遮住了)

package.json


    {
      "name": "@mygroup/npm_registry",
      "version": "1.0.12",
      "description": "Test",
      "main": "index.ts",
      "repository": "https://gitlab.com/mygroup/randomStuff/npm_registry",
      "author": "An author",
      "license": "UNLICENSED",
      "private": false,
      "scripts": {
        .....
           "semantic-release": "semantic-release"
      },
      "dependencies": {
      ......
      },
      "devDependencies": {
      .....
        "semantic-release": "^17.4.4",
        "@semantic-release/commit-analyzer": "^8.0.1",
        "@semantic-release/release-notes-generator": "^9.0.3",
        "@semantic-release/gitlab": "^6.2.1",
        "@semantic-release/npm": "^7.1.3",
        "@semantic-release/git": "^9.0.0"
      }
      .......
    "publishConfig": {
        "@mygroup:registry": "https://gitlab.com/api/v4/projects/XXXXXX/packages/npm/"
      }
    }

.npmrc(authTokens 是具有完全访问权限的个人令牌)


    //gitlab.com/api/v4/projects/XXXXXXX/packages/npm/:_authToken=YYYYYYYYYYYYYYYYY
    //gitlab.com/api/v4/packages/npm/:_authToken=YYYYYYYYYYYYYYYYY
    @mygroup:registry "https://gitlab.com/api/v4/packages/npm/"

.releaserc.json


    {
        "branches": ["main"],
        "plugins": [
          "@semantic-release/commit-analyzer",
          "@semantic-release/release-notes-generator",
          [
            "@semantic-release/gitlab",
            {
              "gitlabUrl": "https://gitlab.com",
              "gitlabApiPathPrefix": "/api/v4",
              "verifyConditions": []
            }
          ],
          "@semantic-release/npm",
          [
            "@semantic-release/git",
            {
              "assets": ["package.json"],
              "message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
            }
          ]
        ]
      }

我从本地尝试了多种 运行 它的方式,它多次提示我输入用户名和密码(对于密码,我使用 gitlab 个人访问令牌)和 CI/CD 使用:

.gitlab-ci.yaml


    default:
      image: node:14.17
    
    variables:
      NPM_TOKEN: ${CI_JOB_TOKEN}
    
    stages:
      - publish
    
    Publish:
      stage: publish
      script:
        - mkdir -p /root/.config/git
        - echo https://myusername:XXXXXXXXXXXXX@gitlab.com/ > /root/.config/git/credentials
        - git config --global credential.helper store
        - GL_TOKEN=YYYYYYYYYYYYYY;NPM_TOKEN=YYYYYYYYYYYYYY; npm run semantic-release --debug

值得注意的是,CI/CD 上的确切步骤发生了很大变化,因为我一直在测试多项内容,例如不在调用中传递变量并确保它们都直接在 gitlab 上设置,但是什么都没用。

对于环境变量,我有 NPM_TOKENGL_TOKENGITLAB_TOKEN

这是本地 运行 时的实际错误:


>> @mygroup/npm_registry@1.0.12 semantic-release
>> semantic-release
>
>[11:36:42 a.m.] [semantic-release] › ℹ  Running semantic-release version 17.4.4
>[11:36:42 a.m.] [semantic-release] › ✔  Loaded plugin "verifyConditions" from "@semantic-release/gitlab"
>[11:36:42 a.m.] [semantic-release] › ✔  Loaded plugin "verifyConditions" from "@semantic-release/npm"
>[11:36:42 a.m.] [semantic-release] › ✔  Loaded plugin "verifyConditions" from "@semantic-release/git"
>[11:36:42 a.m.] [semantic-release] › ✔  Loaded plugin "analyzeCommits" from "@semantic-release/commit-analyzer"
>[11:36:42 a.m.] [semantic-release] › ✔  Loaded plugin "generateNotes" from "@semantic-release/release-notes-generator"
>[11:36:42 a.m.] [semantic-release] › ✔  Loaded plugin "prepare" from "@semantic-release/npm"
>[11:36:42 a.m.] [semantic-release] › ✔  Loaded plugin "prepare" from "@semantic-release/git"
>[11:36:42 a.m.] [semantic-release] › ✔  Loaded plugin "publish" from "@semantic-release/gitlab"
>[11:36:42 a.m.] [semantic-release] › ✔  Loaded plugin "publish" from "@semantic-release/npm"
>[11:36:42 a.m.] [semantic-release] › ✔  Loaded plugin "addChannel" from "@semantic-release/npm"
>[11:36:42 a.m.] [semantic-release] › ⚠  This run was not triggered in a known CI environment, running in dry-run mode.
>j[11:36:56 a.m.] [semantic-release] › ⚠  Run automated release from branch main on repository https://gitlab.com/mygroup/randomStuff/npm_registry in dry-run mode
>[11:37:00 a.m.] [semantic-release] › ✔  Allowed to push to the Git repository
>[11:37:00 a.m.] [semantic-release] › ℹ  Start step "verifyConditions" of plugin "@semantic-release/gitlab"
>[11:37:00 a.m.] [semantic-release] [@semantic-release/gitlab] › ℹ  Verify GitLab authentication (https://gitlab.com/api/v4)
>[11:37:00 a.m.] [semantic-release] › ✖  Failed step "verifyConditions" of plugin "@semantic-release/gitlab"
>[11:37:00 a.m.] [semantic-release] › ℹ  Start step "verifyConditions" of plugin "@semantic-release/npm"
>[11:37:00 a.m.] [semantic-release] [@semantic-release/npm] › ℹ  Verify authentication for registry https://registry.npmjs.org/
>[11:37:00 a.m.] [semantic-release] [@semantic-release/npm] › ℹ  Reading npm config from /home/user/Work/git/npm_registry/.npmrc
>[11:37:00 a.m.] [semantic-release] [@semantic-release/npm] › ℹ  Wrote NPM_TOKEN to /tmp/6a8800c051f3e40927850be223835151/.npmrc
>npm ERR! code E401
>npm ERR! 401 Unauthorized - GET https://registry.npmjs.org/-/whoami
>
>npm ERR! A complete log of this run can be found in:
>npm ERR!     /home/user/.npm/_logs/2021-07-22T18_37_01_006Z-debug.log
>[11:37:01 a.m.] [semantic-release] › ✖  Failed step "verifyConditions" of plugin "@semantic-release/npm"
>[11:37:01 a.m.] [semantic-release] › ℹ  Start step "verifyConditions" of plugin "@semantic-release/git"
>[11:37:01 a.m.] [semantic-release] › ✔  Completed step "verifyConditions" of plugin "@semantic-release/git"
>[11:37:01 a.m.] [semantic-release] › ✖  EINVALIDNPMTOKEN Invalid npm token.
>The npm token (https://github.com/semantic-release/npm/blob/master/README.md#npm-registry-authentication) configured in the NPM_TOKEN environment variable must be a valid token (https://docs.npmjs.com/getting-started/working_with_tokens) allowing to publish to the registry https://registry.npmjs.org/.
>
>If you are using Two Factor Authentication for your account, set its level to "Authorization only" (https://docs.npmjs.com/getting-started/using-two-factor-authentication#levels-of-authentication) in your account settings. semantic-release cannot publish with the default "
>Authorization and writes" level.
>
>Please make sure to set the NPM_TOKEN environment variable in your CI with the exact value of the npm token.
>
>[11:37:01 a.m.] [semantic-release] › ✖  An error occurred while running semantic-release: HTTPError: Response code 403 (Forbidden)
>    at EventEmitter.<anonymous> (/home/user/Work/git/npm_registry/node_modules/got/dist/source/as-promise.js:118:31)
>    at processTicksAndRejections (internal/process/task_queues.js:93:5) {
>  pluginName: '@semantic-release/gitlab'
>}
>AggregateError: 
>    HTTPError: Response code 403 (Forbidden)
>        at EventEmitter.<anonymous> (/home/user/Work/git/npm_registry/node_modules/got/dist/source/as-promise.js:118:31)
>    SemanticReleaseError: Invalid npm token.
>        at module.exports (/home/user/Work/git/npm_registry/node_modules/@semantic-release/npm/lib/get-error.js:6:10)
>        at module.exports (/home/user/Work/git/npm_registry/node_modules/@semantic-release/npm/lib/verify-auth.js:26:33)
>        at async verifyConditions (/home/user/Work/git/npm_registry/node_modules/@semantic-release/npm/index.js:36:7)
>        at async validator (/home/user/Work/git/npm_registry/node_modules/semantic-release/lib/plugins/normalize.js:34:24)
>        at async /home/user/Work/git/npm_registry/node_modules/semantic-release/lib/plugins/pipeline.js:37:34
>        at async Promise.all (index 0)
>        at async next (/home/user/Work/git/npm_registry/node_modules/p-reduce/index.js:16:18)
>    at /home/user/Work/git/npm_registry/node_modules/semantic-release/lib/plugins/pipeline.js:54:11
>    at processTicksAndRejections (internal/process/task_queues.js:93:5)
>    at async Object.pluginsConf.<computed> [as verifyConditions] (/home/user/Work/git/npm_registry/node_modules/semantic-release/lib/plugins/index.js:80:11)
>    at async run (/home/user/Work/git/npm_registry/node_modules/semantic-release/index.js:95:3)
>    at async module.exports (/home/user/Work/git/npm_registry/node_modules/semantic-release/index.js:260:22)
>    at async module.exports (/home/user/Work/git/npm_registry/node_modules/semantic-release/cli.js:55:5)

当 运行 到 CI/CD

时我得到相同的结果

不确定是否有帮助,但这里还有文件夹结构:


    .
    ├── dist
    │   └── ...
    ├── node_modules
    │   └── ...
    ├── src
    │   └── ...
    ├── types
    │   └── ...
    ├── .gitignore
    ├── .gitlab-ci.yml
    ├── .npmrc
    ├── .releaserc.json
    ├── package-lock.json
    ├── package.json
    └── tsconfig.json

知道这是配置问题还是我使用的语义包版本不兼容?

编辑: 所以我意识到,如果在 package.json 上,我将私有字段从 false 更改为 true,那么我将不再收到错误,并且语义发布实际上完成了所有操作,但是实际上没有包在注册表中发布。注意到它说跳过了实际的 npm 发布步骤,因为它被标记为私有。

开发人员在语义发布 github 页面上给我提供了解决方案,基本上归结为我的格式错误 .npmrc.

所以我的有:

@mygroup:registry "https://gitlab.com/api/v4/packages/npm/"

但应该是:

@mygroup:registry=https://gitlab.com/api/v4/packages/npm/

我在知道实际问题之前绕过它的另一种方法是:

export NPM_CONFIG_REGISTRY=https://gitlab.com/api/v4/projects/XXXX/packages/npm/

但这更像是一种解决方法,只能在 运行 语义发布时完成,而不是之前,因为它会覆盖所有注册表,因此无法安装任何 public 包。

编辑:将 link 添加到 github 对话 https://github.com/semantic-release/npm/issues/381

before_script:
- whoami
- apt-get update && apt-get install -y --no-install-recommends git-core ca-certificates
- npm install @semantic-release/gitlab
- |
  {
    echo "@${CI_PROJECT_ROOT_NAMESPACE}:registry=${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/npm/"
    echo "${CI_API_V4_URL#https?}/projects/${CI_PROJECT_ID}/packages/npm/:_authToken=${GITLAB_TOKEN}"
  } | tee -a .npmrc