在ADO流水线中使用Maven Jib:Build推送至ACR遇认证问题
解决Azure DevOps中Maven Jib推送ACR的认证失败问题
核心原因
Maven Jib任务不会自动关联Azure DevOps的containerRegistry服务连接,而原Docker@2任务是通过服务连接内置逻辑处理ACR登录,因此直接运行jib:build会因缺失凭证返回UNAUTHORIZED错误。
两种可行解决方案
方案1:利用Docker登录任务自动传递凭证
Jib会自动读取Docker客户端的登录配置文件(~/.docker/config.json),因此可以先通过原有服务连接完成Docker登录,再执行Jib构建:
# 先通过服务连接登录ACR - task: Docker@2 inputs: containerRegistry: '<你的ACR服务连接名称>' command: 'login' # 执行Jib构建,无需额外传递凭证 - task: Maven@4 inputs: mavenPomFile: 'pom.xml' goals: 'jib:build' options: '-Dimage=<你的ACR地址>/<镜像名>:<版本号>'
方案2:手动传递ACR凭证作为Maven参数
通过Azure CLI获取ACR的访问凭证,注入流水线变量后,在Maven命令中通过-D参数传递给Jib插件:
# 获取ACR凭证并设置为流水线变量 - task: AzureCLI@2 inputs: azureSubscription: '<你的Azure订阅服务连接>' scriptType: 'bash' inlineScript: | ACR_NAME="<你的ACR名称>" # 获取ACR用户名 ACR_USER=$(az acr credential show --name $ACR_NAME --query username -o tsv) # 获取ACR密码(取第一个密码) ACR_PASS=$(az acr credential show --name $ACR_NAME --query passwords[0].value -o tsv) # 设置为流水线变量 echo "##vso[task.setvariable variable=ACR_USER]$ACR_USER" echo "##vso[task.setvariable variable=ACR_PASS]$ACR_PASS" # 执行Jib构建,传递凭证参数 - task: Maven@4 inputs: mavenPomFile: 'pom.xml' goals: 'jib:build' options: > -Dimage=<你的ACR地址>/<镜像名>:<版本号> -Djib.to.auth.username=$(ACR_USER) -Djib.to.auth.password=$(ACR_PASS)
额外说明
- 方案1更简洁,复用原有服务连接,无需额外配置Azure CLI权限;
- 方案2适合无法使用Docker客户端的场景,直接通过API获取凭证;
- 不要在pom.xml中硬编码凭证,避免敏感信息泄露。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

