You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Jenkins流水线认证Azure DevOps私有包源(含.npmrc与服务主体)

解决方案:Jenkins流水线中认证Azure DevOps私有NPM源

一、GitLab .npmrc在Jenkins流水线中的认证配置

GitLab中存储的.npmrc通常仅包含私有源的registry地址,缺少认证信息,需在Jenkins流水线中动态注入凭据完成认证。

步骤1:在Jenkins中存储Azure DevOps PAT凭据

  • 生成Azure DevOps个人访问令牌(PAT),权限勾选Packaging (Read)
  • 在Jenkins「凭据」中添加Secret text类型凭据,存入PAT,记录凭据ID为azure-devops-npm-pat

步骤2:流水线中动态生成认证后的.npmrc

在流水线阶段中添加以下逻辑,覆盖或生成项目根目录的.npmrc:

pipeline {
    agent any
    environment {
        AZURE_ORG = "你的Azure组织名"
        AZURE_PROJECT = "你的项目名"
        AZURE_FEED = "你的私有源名称"
    }
    stages {
        stage('注入NPM认证信息') {
            steps {
                withCredentials([string(credentialsId: 'azure-devops-npm-pat', variable: 'AZURE_PAT')]) {
                    sh '''
                        cat > .npmrc << EOF
registry=https://pkgs.dev.azure.com/${AZURE_ORG}/${AZURE_PROJECT}/_packaging/${AZURE_FEED}/npm/registry/
always-auth=true
//pkgs.dev.azure.com/${AZURE_ORG}/${AZURE_PROJECT}/_packaging/${AZURE_FEED}/npm/registry/:username=any
//pkgs.dev.azure.com/${AZURE_ORG}/${AZURE_PROJECT}/_packaging/${AZURE_FEED}/npm/registry/:_password=${AZURE_PAT}
//pkgs.dev.azure.com/${AZURE_ORG}/${AZURE_PROJECT}/_packaging/${AZURE_FEED}/npm/registry/:email=placeholder@example.com
EOF
                    '''
                }
            }
        }
        stage('安装依赖') {
            steps {
                sh 'npm install'
            }
        }
        // 后续部署阶段...
    }
}
  • 说明:username可填任意字符串,Azure DevOps仅校验_password中的PAT;email为npm强制要求的占位值,无需真实邮箱

二、使用Azure AD服务主体实现认证

可以用服务主体替代PAT,更适合企业级权限管控(不依赖个人账号)。

步骤1:创建并配置Azure AD服务主体

  1. 用Azure CLI创建服务主体并分配私有源读取权限:
az ad sp create-for-rbac \
    --name "jenkins-npm-service-principal" \
    --role "Packaging Reader" \
    --scopes "/subscriptions/{你的订阅ID}/resourceGroups/{资源组}/providers/Microsoft.DevOps/organizations/{AZURE_ORG}/projects/{AZURE_PROJECT}/feeds/{AZURE_FEED}"

执行后返回appId(client ID)、password(client secret)、tenant(tenant ID),保存这些值。

  1. 在Jenkins中添加三个Secret text凭据:
    • Client ID:凭据IDazure-sp-client-id
    • Client Secret:凭据IDazure-sp-client-secret
    • Tenant ID:凭据IDazure-sp-tenant-id

步骤2:流水线中通过服务主体获取令牌并认证

在流水线中添加获取Azure AD令牌的逻辑,替换PAT作为npm认证密码:

pipeline {
    agent any
    environment {
        AZURE_ORG = "你的Azure组织名"
        AZURE_PROJECT = "你的项目名"
        AZURE_FEED = "你的私有源名称"
    }
    stages {
        stage('获取Azure AD令牌') {
            steps {
                withCredentials([
                    string(credentialsId: 'azure-sp-client-id', variable: 'CLIENT_ID'),
                    string(credentialsId: 'azure-sp-client-secret', variable: 'CLIENT_SECRET'),
                    string(credentialsId: 'azure-sp-tenant-id', variable: 'TENANT_ID')
                ]) {
                    sh '''
                        # 获取Azure AD访问令牌
                        TOKEN=$(curl -s -X POST \
                            -d "grant_type=client_credentials&client_id=${CLIENT_ID}&client_secret=${CLIENT_SECRET}&resource=https://pkgs.dev.azure.com" \
                            https://login.microsoftonline.com/${TENANT_ID}/oauth2/token | jq -r '.access_token')
                        
                        # 生成带令牌的.npmrc
                        cat > .npmrc << EOF
registry=https://pkgs.dev.azure.com/${AZURE_ORG}/${AZURE_PROJECT}/_packaging/${AZURE_FEED}/npm/registry/
always-auth=true
//pkgs.dev.azure.com/${AZURE_ORG}/${AZURE_PROJECT}/_packaging/${AZURE_FEED}/npm/registry/:username=any
//pkgs.dev.azure.com/${AZURE_ORG}/${AZURE_PROJECT}/_packaging/${AZURE_FEED}/npm/registry/:_password=${TOKEN}
//pkgs.dev.azure.com/${AZURE_ORG}/${AZURE_PROJECT}/_packaging/${AZURE_FEED}/npm/registry/:email=placeholder@example.com
EOF
                    '''
                }
            }
        }
        stage('安装依赖') {
            steps {
                sh 'npm install'
            }
        }
        // 后续部署阶段...
    }
}
  • 说明:流水线运行环境需安装jq工具解析JSON响应;若没有jq,可改用grep+sed提取令牌。

内容的提问来源于stack exchange,提问作者Anjali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 01:31:21