#node.js #amazon-web-services #npm #npm-publish #aws-codeartifact
#node.js #amazon-веб-сервисы #нпм #npm-опубликовать #aws-codeartifact
Вопрос:
Я пытаюсь использовать npm publish
для публикации библиотеки javascript в частном репозитории NPM, размещенном на AWS Codeartifact.
Когда я пытаюсь запустить npm publish
на своем локальном компьютере, он работает без каких-либо проблем. Однако, когда я пытаюсь запустить его на Jenkins, похоже, что пакет пытается быть опубликован в репозитории пакетов NPM вместо AWS codeartifact, и я получаю следующую ошибку:
> @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/package - 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 codeartifact, она должна устанавливать правильные настройки .npmrc
при запуске aws codeartifact login
command. Я все еще не понимаю, почему он пытается перейти в реестр npm вместо AWS.
Вот мой package.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": {...}
}
Обновить
Я добавил ссылку на свой CodeArtificat с помощью
npm set registry <LINK_TO_CODE_ARTIFACT>
Когда я выполняю сценарий публикации локально, я получаю эту ошибку при первом запуске скрипта:
Unable to authenticate, need: Bearer realm="company/package", Basic realm="company/package"
Эта ошибка исчезает при последующих запусках. Однако, когда я пытаюсь сделать то же самое на своем конвейере Jenkins, я продолжаю получать эту ошибку. Не уверен, что это значит. Я видел поток, связанный с этой ошибкой в Azure, но не могу ничего найти в AWS CodeArtifact.
Ответ №1:
Проблема заключалась в том, что я использовал два разных менеджера пакетов yarn
и npm
выполнял несколько задач в этом проекте. Код был собран с использованием yarn
, но публикация повторялась npm
. Чтобы быть единообразным, то есть использовать yarn
во всех наших задачах, я попробовал yarn publish
, и это волшебным образом сработало.
Мораль этой истории: будьте последовательны со своими менеджерами пакетов.
Ответ №2:
У меня была очень похожая проблема с использованием CodeBuild и CodeArtifact для публикации пакетов npm.
Рекомендуемый подход с использованием prepare
шага с aws codeartifact login
помощью команды не сработал для меня. Я думаю, что это может быть связано с какой-то проблемой Ubuntu
и npm
не позволяет получить фактический доступ к .npmrc
файлу, в который login
записывается команда.
В конце я добавил следующие дополнительные команды оболочки в свой скрипт, прежде 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
для извлечения токена аутентификации — он входит в стандартную комплектацию сервера CodeBuild.
Обратите внимание, что также этот пример находится в eu-west-2
, но может быть в любом регионе, если вы его измените.