Verdaccio:如何使用正确的凭据从 Github Actions 发布到自定义服务器?

问题描述

我在谷歌云服务器上托管了一个可用的 verdaccio 服务器。我可以手动发布到它,但是当我推送到 master 分支时,我很难创建一个 GitHub 操作来发布到它。

我有一个在发布到 npmjs 公共存储库时可以完美运行的脚本。这是适用于 npmjs.org 的相关部分

- name: Publish to npm
    if: steps.semantic.outputs.new_release_published == 'true'
    run: |
      yarn install
      git checkout upm
      npm publish
    env:
      NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} 

现在,对于我自己的服务器,我在 package.json 中添加了以下内容

"publishConfig": {
    "registry": "http://my.ip.0.0:port"
 },

然后在存储库机密中,我创建了一个 NPM_TOKEN 机密,其中包含登录后从我计算机的 .npmrc 文件中复制的用户令牌。

我从 Github Actions 结果中得到以下错误

npm ERR! code E401
npm ERR! Unable to authenticate,your authentication token seems to be invalid.
npm ERR! To correct this please trying logging in again with:
npm ERR!     npm login

所以我显然没有正确进行身份验证。

我尝试(在服务器的 cli 上)使用 npm token create 但它给了我一个未经授权的错误,我在本地登录后也在我的计算机上尝试了同样的方法,并得到了同样的错误

如何验证我发布到自定义 Verdaccio 服务器的 Github Actions?我对整个 CI 业务还很陌生,所以我怀疑我错过了一些非常基本的东西。我怀疑我在使用 NPM_TOKEN 时做错了,但发布到 npmjs.org 公共存储库效果很好。

同样,我可以从 Mac 上的终端使用 npm publish 手动发布(使用 npm login 登录自定义服务器后),所以我知道服务器设置正确。

解决方法

经过多次谷歌搜索后,我从本教程中找到了一个解决方案 https://remysharp.com/2015/10/26/using-travis-with-private-npm-deps

它不是为 GitHub Actions 编写的,但同样的过程也有效。

首先,您需要从您的计算机登录到您的私人服务器。在您的主文件夹中查看 .npmrc 文件(打开显示隐藏文件)。

将此行添加到 yaml 操作文件中:

echo "//YOURREGISTRYADDRESS/:_authToken=\${NODE_AUTH_TOKEN}" > .npmrc

请注意,它实际上应该是 NODE_AUTH_TOKEN,不是您的实际令牌。

引号中的部分应该主要匹配 .npmrc 文件中的条目(不带令牌)。

现在看起来像这样

- name: Publish to npm
    if: steps.semantic.outputs.new_release_published == 'true'
    run: |
      yarn install
      git checkout upm
      echo "//YOURREGISTRYADDRESS/:_authToken=\${NODE_AUTH_TOKEN}" > .npmrc
      npm publish
    env:
      NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} 

然后在您的 GitHub 存储库的 Settings -> Secrets 部分,添加一个名为 NPM_TOKEN 的密钥并粘贴来自 .npmrc 的 auth 令牌值。这是一长串字母和数字。

现在这个脚本应该可以正确登录了。显然问题是默认的 Verdaccio 授权插件期望它以交互方式使用。这一行基本上是动态创建一个 .npmrc 文件并用正确的信息填充它,就好像您已经以交互方式登录一样。该文件实际上并未创建,运行后消失,这是一个很好的接触。它也非常安全,因为它将令牌存储在 repo 的 secrets 部分。上面的链接可以更好地解释它,所以请查看!