我正在尝试使用npm publish
将javascript库发布到托管在AWS Codeartifact上的私有NPM存储库。
当我尝试在本地机器上运行npm publish
时,它可以正常工作。然而,当我试图在Jenkins上运行它时,看起来包正试图发布到NPM的包存储库,而不是AWS代码工件,我得到了以下错误:
> @company/package@0.2.2 prepare .
> npm run co:login
> @company/package@0.2.2 co:login /usr/src/components
> aws codeartifact login --tool npm --domain <DOMAIN> --repository <REPOSITORY>
Successfully configured npm to use AWS CodeArtifact repository <AWS_CODEARTIFACT_URL>
Login expires in 12 hours at 2020-12-08 11:15:37+00:00
npm notice
npm notice package: @company/package@0.2.2
npm notice === Tarball Contents ===
npm notice 2.9kB package.json
npm notice 1.6kB README.md
npm notice 268B dist/index.d.ts
npm notice === Tarball Details ===
npm notice name: @company/package
npm notice version: 0.2.2
npm notice package size: 2.1 kB
npm notice unpacked size: 4.8 kB
npm notice shasum: <SHASUM>
npm notice integrity: <INTEGRITY>
npm notice total files: 3
npm notice
npm ERR! code E404
npm ERR! 404 Not Found - PUT https://registry.npmjs.org/@company%2fpackage - Not found
npm ERR! 404
npm ERR! 404 '@company/package@0.2.3' 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/2020-12-08T00_20_19_949Z-debug.log
如果我理解AWS代码工件文档,那么当我们运行aws codeartifact login
命令时,它应该在.npmrc
中设置正确的设置。我仍然不明白为什么它试图推送到npm注册表而不是AWS。
这是我的包.json:
{
"name": "@company/package",
"version": <VERSION>,
"main": "dist/index.js",
"module": "dist/index.js",
"types": "dist/index.d.ts",
"files": [
"dist"
],
"dependencies": {...},
"scripts": {
"co:login": "aws codeartifact login --tool npm --domain <DOMAIN> --repository <REPOSITORY>",
"prepare": "npm run co:login"
},
"eslintConfig": {...},
"browserslist": {...},
"peerDependencies": {...},
"devDependencies": {...}
}
更新
我使用将链接添加到我的CodeArtifica
npm set registry <LINK_TO_CODE_ARTIFACT>
当我在本地执行发布脚本时,我在脚本的第一次运行时会出现以下错误:
Unable to authenticate, need: Bearer realm="company/package", Basic realm="company/package"
该错误在随后的运行中消失。然而,当我在Jenkins管道上尝试同样的操作时,我总是会出现这个错误。不确定这意味着什么。我在Azure上看到了一个与此错误相关的线程,但在AWS CodeArtifact上找不到任何内容。
我遇到了一个与此非常相似的问题,使用CodeBuild和CodeArtifact发布npm包。
建议使用prepare
步骤和aws codeartifact login
命令的方法对我不起作用。我认为这可能是因为Ubuntu
和npm
不允许实际访问login
命令写入的.npmrc
文件。
最后,在npm publish
之前,我使用来自https://docs.aws.amazon.com/codeartifact/latest/ug/npm-auth.html:
npm set registry https://<endpoint name>.d.codeartifact.eu-west-2.amazonaws.com/npm/<repo name>/
npm config set //<endpoint name>.d.codeartifact.eu-west-2.amazonaws.com/npm/<repo name>/:always-auth=true
npm config set //<endpoint name>.d.codeartifact.eu-west-2.amazonaws.com/npm/<repo name>/:_authToken=$(aws codeartifact get-authorization-token --domain <domain> | jq -r .authorizationToken)
npm publish --unsafe-perm
注意,端点名称和域名将取决于您自己的设置。
另外请注意,我已经使用jq
来提取auth令牌——这是CodeBuild服务器上的标准配置。
请注意,这个例子在eu-west-2
中,但如果您更改它,它可能在任何区域中。
问题是我在这个项目中使用了两个不同的包管理器yarn
和npm
来执行几个任务。代码是使用yarn
构建的,但发布是通过npm
进行的。为了统一,即在所有任务中使用yarn
,我尝试了yarn publish
,它神奇地起了作用。
故事的寓意:与你的包经理保持一致。