不使用私有注册表的 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_TOKEN
、GL_TOKEN
、GITLAB_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
我正在尝试使用语义发布来发布到 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_TOKEN
、GL_TOKEN
、GITLAB_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