NodeJS 手动工作流与自动化Github工作流有何不同?

6ss1mwsb  于 2023-06-29  发布在  Node.js
关注(0)|答案(2)|浏览(174)

我试图复制一个自动化的github工作流程,这些步骤允许我通过一个合适的**.npmrc**文件从我的本地控制台手动发布一个包。
如果手动输入(从我的Node.js项目的根文件夹):

echo "@myorganization:registry=https://npm.pkg.github.com" > .npmrc
echo "//npm.pkg.github.com/:username=myname" >> .npmrc
echo "//npm.pkg.github.com/:_authToken=xyz" >> .npmrc
npm publish

我成功地出版了我的包裹。
但是,如果我在**.yml**文件中写入:

on:
    release:
        types: [created]
  
jobs:     
   
    build:
        runs-on: ubuntu-latest
        steps:
            - uses: actions/checkout@v3
            - uses: actions/setup-node@v3
              with:
                node-version: 18
            - run: npm ci
            - run: npm test

    publish-gpr: 
        needs: build
        runs-on: ubuntu-latest
        permissions: 
            packages: write
            contents: read
        steps:
            - uses: actions/checkout@v3
            - uses: actions/setup-node@v3 
              with:
                node-version: 16
                registry-url: https://npm.pkg.github.com/              
            - name: npm publish
              env:
                NODE_AUTH_TOKEN: ${{secrets.MY_TOKEN}
              run: |
                echo "myorganization:registry=https://npm.pkg.github.com" > .npmrc
                echo "//npm.pkg.github.com/:username=myname" >> .npmrc
                echo "//npm.pkg.github.com/:_authToken=${NODE_AUTH_TOKEN:?}" >> .npmrc
                npm publish

我得到错误:

...
npm notice Publishing to https://npm.pkg.github.com
npm ERR! code E401
npm ERR! 401 Unauthorized - PUT https://npm.pkg.github.com/@myorganization%2fmyrepository - unauthenticated: User cannot be authenticated with the token provided.
...

因此,我认为问题来自环境变量NODE_AUTH_TOKEN到显式xyzsecret值的转换。然而,我一直未能解决这样的问题。你能理解什么是错的吗?

lpwwtiir

lpwwtiir1#

在我看来,新引入的参数NODE_AUTH_TOKEN在环境中丢失了。
只有在调用npm publish并出现错误时才会注意到这一点。
一些提示和示例:
当您转换为工作流时,开始将您的命令序列移植到单个run:中,因为它属于一个整体。
此外,始终将env:放在run:之前,以便环境在前面可见(并且更容易发现丢失的参数)。
最后,如果所需参数为空(${NODE_AUTH_TOKEN:?}),则会出现错误,因此可以尽早产生错误,并且易于定位。

- name: npm publish
          env:
            NODE_AUTH_TOKEN: ${{secrets.MY_TOKEN}}    
          run: |
            echo "@myorganization:registry=https://npm.pkg.github.com" >> .npmrc
            echo "//npm.pkg.github.com/:username=myname" >> .npmrc
            echo "//npm.pkg.github.com/:_authToken=${NODE_AUTH_TOKEN:?}" >> .npmrc
            npm publish

为了使它更安全,你可以改变第一次写入.npmrc通过使用>而不是>>来创建该文件。如果该文件存在(不干净的构建),您就不会遇到这样的问题。但严格地说,这是没有必要的。

xmq68pz9

xmq68pz92#

即使在理解了如何通过.npmrc文件(参见here)非交互式登录之后,我仍然在成功地自动发布我的软件包之前挣扎了几个小时。因此,让我建议其他人,在github工作流的上下文中,.nmprc文件的位置由环境变量NPM_CONFIG_USERCONFIG引用,也就是说,你不能简单地说:

echo "@myOrg:registry=https://npm.pkg.github.com" > .npmrc
echo "//npm.pkg.github.com/:_authToken=${NODE_AUTH_TOKEN:?}" >> .npmrc

.yml文件中。相反,你必须这样写:

echo "@myOrg:registry=https://npm.pkg.github.com" > ${NPM_CONFIG_USERCONFIG:?}
echo "//npm.pkg.github.com/:_authToken=${NODE_AUTH_TOKEN:?}" >> ${NPM_CONFIG_USERCONFIG:?}

此外,如果您在某个组织范围内发布您的包,则必须使用组织令牌,而不是您的个人令牌,即使您是组织所有者。
.yml文件如下:

on:
    release:
        types: [created]
  
jobs:     
   
    build:
        runs-on: ubuntu-latest
        steps:
            - uses: actions/checkout@v3
            - uses: actions/setup-node@v3
              with:
                node-version: 18
            - run: |
                npm ci
                npm test

    publish-gpr: 
        needs: build
        runs-on: ubuntu-latest
        permissions: 
            packages: write
            contents: read
        steps:
            - uses: actions/checkout@v3
            - uses: actions/setup-node@v3 
              with:
                node-version: 18
                registry-url: https://npm.pkg.github.com/  
                scope: "@org"
            - name: npm publish
              env:
                NODE_AUTH_TOKEN: ${{secrets.ORG_TOKEN}}
              run: |           
                echo "@org:registry=https://npm.pkg.github.com" > ${NPM_CONFIG_USERCONFIG:?}
                echo "//npm.pkg.github.com/:_authToken=${NODE_AUTH_TOKEN:?}" >> ${NPM_CONFIG_USERCONFIG:?}
                npm publish

我希望这能帮上忙。

相关问题