You need to enable JavaScript to run this app. 如何为拉取Docker镜像的Jenkins Groovy脚本添加私有仓库认证
优惠活动
大模型
产品
解决方案
定价
更多

如何为拉取Docker镜像的Jenkins Groovy脚本添加私有仓库认证

私有Docker镜像仓库认证功能实现指南

改造核心逻辑

私有Docker Registry(V2版本)的接口访问认证,本质是在HTTP请求中携带合规的身份凭证,改造过程不需要替换原有公开拉取的逻辑,仅需在请求阶段补充认证相关的请求头即可,具体改造点:

  • 提前配置可开关的认证参数:支持独立设置私有仓库的账号、密码,可选择开启/关闭认证逻辑,兼容原有公开仓库的拉取流程
  • 构造标准Basic Auth请求头:将账号:密码格式的字符串做Base64编码,按照HTTP认证规范拼接到Authorization请求头中
  • 补全错误分支处理:新增401未授权状态的判断,输出明确的认证失败提示,替代原脚本笼统的HTTP错误日志
  • 补充超时配置:增加连接、读取的超时阈值,避免网络异常时脚本长时间阻塞

改造后可直接使用的完整脚本

import groovy.json.JsonSlurper
import java.util.Base64

// 接口地址配置
def docker_image_tags_url = "https://registry.adx.abc/v2/mysql/tags/list"
// 认证配置(*生产环境禁止明文硬编码账号密码*,建议从凭据管理系统读取)
def registry_account = "your_private_registry_user"
def registry_pwd = "your_private_registry_password"
// 认证开关:访问私有仓库时设为true,公开仓库设为false
def enable_auth = true

try {
    def http_client = new URL(docker_image_tags_url).openConnection() as HttpURLConnection
    http_client.setRequestMethod('GET')
    // 配置请求超时时间
    http_client.setConnectTimeout(5000)
    http_client.setReadTimeout(10000)

    // 开启认证时,自动添加身份凭证请求头
    if (enable_auth) {
        def raw_auth_content = "${registry_account}:${registry_pwd}".getBytes("UTF-8")
        def encoded_auth = Base64.getEncoder().encodeToString(raw_auth_content)
        http_client.setRequestProperty("Authorization", "Basic ${encoded_auth}")
    }

    http_client.connect()
    def response_body = [:]

    // 按状态码分支处理响应
    if (http_client.responseCode == 200) {
        response_body = new JsonSlurper().parseText(http_client.inputStream.getText("UTF-8"))
    } else if (http_client.responseCode == 401) {
        println("认证失败:请检查私有仓库账号、密码配置是否正确")
        System.exit(0)
    } else {
        println("请求异常,HTTP状态码:${http_client.responseCode}")
        System.exit(0)
    }

    def image_tag_list = []
    // 按实际接口返回结构解析标签
    // 标准Docker Registry V2接口可直接解析:response_body.tags.each { tag -> image_tag_list.add(tag) }
    response_body.results.each { tag_meta ->
        image_tag_list.add(tag_meta.name)
    }

    // 返回排序后的标签列表,兼容Active Choice插件的下拉框渲染要求
    return image_tag_list.sort()
} catch (Exception e) {
    println("脚本执行异常:${e.getMessage()}")
}

特殊场景适配说明

  • 如果私有仓库采用Token认证模式(即请求未授权时返回带Www-Authenticate头的401响应,而非直接验证Basic Auth),需要先调用认证授权接口获取临时访问Token,再将Token以Authorization: Bearer <临时Token>的格式添加到请求头,和Docker客户端的认证流程保持一致
  • 在Jenkins等流水线场景使用时,建议将私有仓库的账号密码存储在系统凭据库,通过凭据绑定的方式在脚本中读取,避免明文密码泄露
  • 若私有仓库开启了HTTPS证书校验,且使用自签名证书,需要在脚本中导入对应证书的信任链,否则会出现SSL连接报错

内容的提问来源于stack exchange,提问作者Quân nguyễn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.12 03:27:04