如何为拉取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
相关产品推荐
相关产品推荐

