开发者问题收集

翻新机器人Azure DevOps NPM feed Auth错误

2022-12-01
957

如果我尝试在 Azure DevOps 中使用我的私有 npm 注册表,则会收到 401 错误。我的配置如下所示:

# pipeline.yaml (repo root folder)
steps:
  - task: npmAuthenticate@0
    inputs:
      workingFile: .npmrc
  - script: |
      git config --global user.email '[email protected]'
      git config --global user.name 'Renovate Bot'
      npx --userconfig .npmrc renovate
    env:
      TOKEN: $(System.AccessToken)
      PAT: $(PAT)
# config.js (repo root folder)
module.exports = {
    platform: 'azure',
    endpoint: 'https://devops.<url>.de/.../',
    logLevel: 'debug',
    token: process.env.TOKEN,
    repositories: ['...'],
    enabledManagers: ["npm"],
    hostRules: [
        {
            enabled: true,
            hostType: 'npm',
            matchHost: 'devops.<url>.de',
            token: process.env.PAT,
        },
    ],
};
# .npmrc (repo root folder)
registry=https://devops.<url>.de/Collaboration/_packaging/.../npm/registry/
always-auth=true

renovate 安装成功,我的注册表也可用于此。但 renovate 本身会遇到 401。我如何告诉 renovate 使用从 `npmAuthenticate@0` 任务生成的 .npmrc?

错误堆栈:

ERROR: Repository has unknown error (repository=...)
       "err": {
         "statusCode": 401,
         "message": "Failed request: (401)",
         "stack": "Error: Failed request: (401)\n    at RestClient.<anonymous> (/root/.npm/_npx/05eeecd92f4e18e0/node_modules/typed-rest-client/RestClient.js:202:31)\n    at Generator.next (<anonymous>)\n    at fulfilled (/root/.npm/_npx/05eeecd92f4e18e0/node_modules/typed-rest-client/RestClient.js:6:58)\n    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"
       }
2个回答

renovate 命令会修改你在 config.js 文件中定义的 repo(例如 repositories: ['...'])。

由于你使用 $(System.AccessToken) 作为身份验证方法,你需要向相应的构建服务账户授予目标 repo 的 Contribute 权限(例如 Contribute、Contribute to pull request、Create branch )。

Project Level Build Service Account Name: Your-project-name Build Service (your-collection-name)

Organization Level Build Service Account Name: Project Collection Build Service (your-collection-name)

你可以导航至 Project Settings -> Repositories -> Target Repo -> Security 并向两个构建服务账户授予 Contribute 权限。

例如:

在此处输入图像描述

有关更多详细信息,您可以参考此文档: 管理构建服务账户权限

另一方面,如果您需要从另一个项目更新 repo。您需要在 项目设置 -> 设置 中禁用选项: 将非发布管道的作业授权范围限制为当前项目

Kevin Lu-MSFT
2022-12-02

似乎带有私有 feed 的 azure devops 官方更新文档不正确。这对我来说有效:

授予管道“构建用户”对 feed 的贡献权限: Azure Devops Artifacts -> 设置 -> 权限 ->添加使用贡献者运行管道的用户/服务。

azure-pipelines.yml

schedules:
  - cron: '0 3 * * *'
    displayName: 'Every day at 3am'
    branches:
      include: [main]
    always: true

trigger: none

pool:
  vmImage: ubuntu-latest

steps:
  - task: npmAuthenticate@0
    inputs:
      workingFile: .npmrc

  - bash: |
      git config --global user.email '[email protected]'
      git config --global user.name 'Renovate Bot'
      npx --userconfig .npmrc renovate
    env:
      LOG_LEVEL: DEBUG
      TOKEN: $(System.AccessToken)
      RENOVATE_TOKEN: AZURE_DEVOPS_PAT_TOKEN_HERE
      GITHUB_COM_TOKEN: REPLACEME

config.js

这里的重要部分是不要使用“pkgs.dev.azure.com”作为 matchHost 值,而是可以在调试日志中看到 401 请求中的 feed 是否不同,在我的情况下它是“ORG_NAME_LOWERCASED.pkgs.visualstudio.com”。

const repositories = require("./repositories");

// Security token used by the running build
const pipelineToken = process.env.TOKEN;
const patTokenForFeed = process.env.RENOVATE_TOKEN;

module.exports = {
  platform: "azure",
  endpoint: "https://dev.azure.com/ORG_NAME/",
  token: pipelineToken,
  hostRules: [
    {
      hostType: "npm",
      matchHost: "ORG_NAME_LOWERCASED.pkgs.visualstudio.com",
      username: "apikey",
      password: patTokenForFeed,
    },
  ],
  repositories
};


.npmrc

registry=https://pkgs.dev.azure.com/ORG_NAME/PROJECT_NAME/_packaging/FEED_NAME/npm/registry/
always-auth=true
Sauceman
2023-02-17