翻新机器人Azure DevOps NPM feed Auth错误
如果我尝试在 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)"
}
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。您需要在 项目设置 -> 设置 中禁用选项: 将非发布管道的作业授权范围限制为当前项目 。
似乎带有私有 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