在 Jenkins 中配置 Maven 连接 Nexus 私有仓库,最推荐的做法是使用 Jenkins Credentials 存储账号密码,配合 Config File Provider 插件动态生成 settings.xml 文件。适用场景为 Pipeline 或自由风格项目构建,风险边界在于需确保 settings.xml 中的 server id 与 pom.xml 中的 repository id 完全一致,否则认证不会生效。
先说结论:通过 Jenkins 凭证管理敏感信息,利用插件注入 Maven 配置文件,避免密码明文落地。
- 适合:需要频繁构建且涉及私有依赖的中大型团队
- 先准备:安装 Config File Provider 插件,在 Nexus 确认仓库 ID
- 验收:构建日志中无 401 错误,依赖下载来源显示私有仓库地址
快速处理思路
如果不方便使用命令,按以下界面路径操作:进入 Jenkins 凭证管理添加 Nexus 账号,进入 Managed Files 创建 settings.xml 模板并引用凭证,最后在构建任务中勾选“提供配置文件”。
为什么会这样
Maven 认证依赖 settings.xml 中的<servers>配置,而 Jenkins 构建环境通常是临时容器或隔离工作空间。直接在代码库提交含密码的 settings.xml 存在泄露风险,且无法区分不同环境。通过 Jenkins 插件动态注入,既能保证凭证安全,又能确保构建节点在运行时才获取配置文件。
分步处理
第一步:创建 Jenkins 凭证。进入“Manage Jenkins” > “Credentials”,添加类型为“Username with password”的凭证,ID 记为 nexus-cred,填入 Nexus 只读或部署账号。
第二步:配置 Managed Files。进入“Manage Jenkins” > “Managed Files”,添加“Custom Maven settings.xml”。在配置内容中,<server> 段的<id>必须与 pom.xml 中<repository>或<distributionManagement>的<id>一致。用户名和密码处使用 Jenkins 占位符,例如${NEXUS_USER}和${NEXUS_PASS},或在插件支持的情况下直接选择凭证 ID。
第三步:绑定配置文件到任务。自由风格项目需在“Build Environment”勾选“Provide Configuration files”,选择刚才创建的 settings.xml。Pipeline 项目需在 pipeline 脚本中使用 configFileProvider 包裹 mvn 命令。
第四步:Pipeline 脚本示例。使用 configFileProvider 插件语法,将 managed-file-id 映射到本地路径,并指定 Maven 参数 -s 指向该路径。
pipeline {
agent any
tools { maven 'Maven-3.8' }
stages {
stage('Build') {
steps {
configFileProvider([
configFile(fileId: 'maven-settings-id', targetLocation: 'custom-settings.xml')
]) {
sh 'mvn clean install -s custom-settings.xml'
}
}
}
}
}怎么验证是否生效
查看 Jenkins 构建控制台输出,搜索“Downloading”或“Downloaded”。如果认证成功,日志应显示从 Nexus 私有仓库地址下载依赖,且无“Return code is: 401”错误。若配置了 deploy,检查 Nexus 界面是否出现对应制品版本。
常见坑
第一,Server ID 不匹配。settings.xml 中的<server> ID 必须精确匹配 pom.xml 中的仓库 ID,大小写敏感,否则 Maven 不会使用该凭证。
第二,特殊字符未转义。如果密码包含&、<、>等 XML 特殊字符,直接在 settings.xml 模板中填写会导致解析失败,建议使用 Jenkins 凭证注入而非硬编码。
第三, agent 节点清理。如果构建节点是临时容器,确保插件在容器启动后可用;如果是永久节点,注意工作空间清理策略不要误删注入的配置文件。
常见问题
构建日志报 401 Unauthorized 怎么办
优先检查 settings.xml 中的 server id 是否与 pom.xml 完全一致,其次确认 Jenkins 凭证中的账号密码是否正确且未被锁定。
自由风格项目和 Pipeline 配置有什么区别
自由风格项目在“构建环境”图形化勾选配置文件,Pipeline 项目需在脚本中使用 configFileProvider 代码块包裹构建命令。
可以在 pom.xml 里直接写认证信息吗
不建议。 pom.xml 通常纳入版本控制,明文密码会泄露给所有代码库访问者,且难以针对不同 Jenkins 任务轮换密码。
参考来源
- Jenkins 官方文档,Config File Provider Plugin,https://plugins.jenkins.io/config-file-provider/
- Apache Maven 官方文档,Settings Reference,https://maven.apache.org/settings.html
- Jenkins 官方文档,Credentials Binding Plugin,https://plugins.jenkins.io/credentials-binding/