如何自动将Jenkins作业制品复制到指定网络驱动器?是否有插件或脚本方案?
把Jenkins制品/脚本文件自动同步到本地网络目录的实操方案
我来给你整理几种实用的方案,帮你轻松把Jenkins生成的制品和脚本输出文件自动同步到本地网络指定目录——不管你偏好插件的便捷还是脚本的灵活,都能找到合适的方法:
方法一:用Jenkins插件实现(省心首选)
插件的好处是不用自己写太多代码,图形化配置就能搞定,适合大多数常规场景。
1. File Operations Plugin(通用文件操作插件)
这个插件支持复制、移动、删除等多种文件操作,适配各种网络目录类型(SMB/NFS/本地挂载目录):
- 第一步:安装插件:Jenkins后台→「插件管理」→搜索「File Operations」安装并重启Jenkins
- 自由风格项目配置:
- 进入项目配置页,在「构建后操作」里添加「File Operations」
- 选择「Copy files」操作,按需设置:
- 源文件路径:比如
**/*.jar(匹配你的制品文件)或scripts/output/*.txt(脚本生成的文件),支持通配符 - 目标路径:如果是Windows共享,填
//192.168.1.100/shared-folder/;如果是挂载到Jenkins服务器的NFS目录,直接写/mnt/network-share/ - 可选勾选「Overwrite existing files」覆盖旧文件
- 源文件路径:比如
- 流水线项目示例:
stage('同步到网络目录') { steps { fileOperations([ copyFileOperation( includes: '**/*.war, scripts/logs/*.log', targetLocation: '//192.168.1.50/jenkins-builds/' ) ]) } }
2. Publish Over SMB Plugin(针对Windows共享优化)
如果你的目标目录是Windows的SMB共享文件夹,这个插件专门做这个场景,配置更细致:
- 第一步:全局配置SMB服务器:Jenkins后台→「系统管理」→「系统配置」→找到「Publish over SMB」,添加你的SMB服务器信息(IP/域名、共享名、登录账号密码,若需要验证)
- 项目配置:
- 在「构建后操作」添加「Publish files over SMB」
- 选择刚才配置的SMB服务器,设置:
- 源文件:比如
target/*.jar - 远程目录:可以用Jenkins变量区分构建版本,比如
/builds/${BUILD_NUMBER} - 可选勾选「Delete remote files before transfer」清理旧文件
- 源文件:比如
方法二:用脚本实现(灵活可控)
要是你需要自定义复制逻辑(比如加校验、分批次复制),直接用Shell或PowerShell脚本会更灵活,分两种环境给你示例:
1. Linux Jenkins服务器→NFS/SMB共享
针对NFS共享:
先把网络共享挂载到Jenkins服务器(建议配置开机自动挂载,避免重启后失效):
# 临时挂载(重启后失效,用于测试) mount -t nfs 192.168.1.100:/shared /mnt/network-share # 永久挂载,编辑/etc/fstab添加一行 echo "192.168.1.100:/shared /mnt/network-share nfs defaults 0 0" >> /etc/fstab
然后在Jenkins的「构建步骤」里添加Shell命令复制:
# 复制制品到网络目录的指定版本文件夹 mkdir -p /mnt/network-share/builds/${BUILD_NUMBER} cp -r target/*.jar /mnt/network-share/builds/${BUILD_NUMBER}/ # 复制脚本生成的日志文件 cp scripts/output/*.log /mnt/network-share/logs/ # 校验复制是否成功,失败则终止构建 if [ $? -ne 0 ]; then echo "文件复制失败,终止构建" exit 1 fi
针对SMB共享:
用smbclient命令直接操作(需要先在Jenkins服务器安装smbclient):
# 复制单个文件 smbclient //192.168.1.100/shared -U username%password -c "put target/*.jar /builds/${BUILD_NUMBER}/" # 批量复制目录 smbclient //192.168.1.100/shared -U username%password -c "recurse on; cd /logs/; lcd scripts/output/; mput *"
2. Windows Jenkins服务器→SMB共享
用PowerShell脚本适配Windows环境,直接在Jenkins的「构建步骤」里添加PowerShell命令:
# 创建对应构建版本的目录 $targetDir = "\\192.168.1.50\jenkins-artifacts\$env:BUILD_NUMBER" New-Item -Path $targetDir -ItemType Directory -Force | Out-Null # 复制制品和脚本文件 Copy-Item -Path "target\*.war" -Destination $targetDir -Recurse -Force Copy-Item -Path "scripts\output\*.log" -Destination "\\192.168.1.50\jenkins-artifacts\logs" -Force # 校验复制结果 if (-not $?) { Write-Error "文件复制失败,终止构建" exit 1 }
关键注意事项
- 权限问题:Jenkins运行的用户(Linux的
jenkins用户、Windows的「Local System」账户)必须拥有目标网络目录的读写权限,否则会复制失败,建议先手动在Jenkins服务器上测试复制命令验证权限 - 版本区分:建议用Jenkins内置变量(比如
${BUILD_NUMBER}、${JOB_NAME})给每个构建的制品创建独立目录,避免覆盖旧文件 - 失败通知:不管用插件还是脚本,最好添加构建失败后的通知(比如邮件、Slack),及时发现问题
- 测试先行:先手动在Jenkins服务器上执行复制命令,确保能正常访问目标目录后,再配置到Jenkins项目里
内容的提问来源于stack exchange,提问作者matdev




