Jenkins服务器上的Robocopy运行缓慢

69次阅读
没有评论

问题描述

正在使用Jenkins自动化部署Fullstack应用程序的过程中遇到了问题。该应用程序部署在Windows服务器上。他使用的自动部署脚本是这样的:

@ECHO OFF
REM 设置脚本运行的参数
SET CONFIG_ENV=%1
SET SERVER_DOMAIN=%2
SET ADMIN_LOGIN=%3
SET ADMIN_PASS=%4
SET ARTIFACT_DIR=%~5
SET DROPFOLDER_PATH=%~6
SET DEPLOY_PATH=%~7
SET SERVICE_NAME=%8

REM 输出参数到控制台(以便查看)
ECHO ...
ECHO RUNNING WCF AUTO DEPLOYMENT. PARAMETERS ARE:
ECHO CONFIG_ENV      : %CONFIG_ENV%
ECHO SERVER_DOMAIN   : %SERVER_DOMAIN%
ECHO ADMIN_LOGIN     : %ADMIN_LOGIN%
ECHO ADMIN_PASS      : %ADMIN_PASS%
ECHO ARTIFACT_DIR    : %ARTIFACT_DIR%
ECHO DROPFOLDER_PATH : %DROPFOLDER_PATH%
ECHO DEPLOY_PATH     : %DEPLOY_PATH%
ECHO SERVICE_NAME    : %SERVICE_NAME%
ECHO ...

REM 从DSL中选择最新的发布构建
FOR /F "delims=" %%i IN ('dir "%ARTIFACT_DIR%" /b /ad-h /t:c /od') DO SET latest_build=%%i

ECHO DEPLOYING ARTIFACTS IN: %ARTIFACT_DIR%\%latest_build% (latest build)
ECHO DEPLOYING TO "\\%SERVER_DOMAIN%\%DROPFOLDER_PATH%"
ECHO ...

REM 登录到服务器
net use \\%SERVER_DOMAIN% %ADMIN_PASS% /USER:%ADMIN_LOGIN%

REM 复制所有发布构建到服务器上的目标文件夹
ECHO COPYING ARTIFACTS TO DROP FOLDER
ROBOCOPY "%ARTIFACT_DIR%\%latest_build%" "\\%SERVER_DOMAIN%\%DROPFOLDER_PATH%" /MIR /is /it /np /r:1 /w:1 /eta /tee /copy:DT
ECHO ...

REM 停止服务以便更新文件
ECHO STOPPING THE SERVICE
SC \\%SERVER_DOMAIN% STOP %SERVICE_NAME%
ECHO ...

REM 复制所有的.dll和.exe文件
ECHO COPYING .DLL AND .EXE FILES
ROBOCOPY "\\%SERVER_DOMAIN%\%DROPFOLDER_PATH%" "\\%SERVER_DOMAIN%\%DEPLOY_PATH%" *.dll *.exe /is /it /np /r:1 /w:1 /eta /tee /copy:DT
ECHO ...

REM 复制适用于环境的配置文件
ECHO COPYING CONFIGURATION FILE
ROBOCOPY "\\%SERVER_DOMAIN%\%DROPFOLDER_PATH%\Configuration_Files\%CONFIG_ENV%" "\\%SERVER_DOMAIN%\%DEPLOY_PATH%" *.config /is /it /np /r:1 /w:1 /eta /tee /copy:DT
ECHO ...

REM 启动服务
ECHO STARTING THE SERVICE
SC \\%SERVER_DOMAIN% START %SERVICE_NAME%
ECHO ...

REM 完成
ECHO SCRIPT COMPLETE

如果我直接在Jenkins服务器上运行脚本,脚本会在几秒钟内完成。但是,当我将脚本排队在Jenkins作业中运行时,ROBOCOPY命令大约需要一分钟才能复制每个文件。

问题评论:
1. 当您将其作为Jenkins作业运行时,它是在同一台服务器上运行还是在从节点上运行?
2. Jenkins作业在主节点上运行。
3. 它将文件复制到何处?本地还是远程节点?
4. 您是否在进行任何多线程操作,这可能与核心/虚拟CPU有关?
5. 文件正在从远程服务器复制到远程服务器,但服务器位于完全相同的内部网络中。就像我说的,如果直接调用它,脚本就可以正常工作。
6. @JosephFaulkner Jenkins是否在同一网络中?
7. 是的,Jenkins服务器与远程服务器在同一个本地网络中。
8. 您使用的Jenkins版本是什么?

最佳回答:

这个问题已经解决了。Robocopy有很多智能功能,可以检查复制的文件是否实际上有所不同。不幸的是,这个比较过程是耗时的。一旦我们将脚本更改为首先删除目标文件夹中的文件(每次都删除)- 我们应该有一个可重复运行的过程,运行时间约为10-15秒。

评论:
1. 另一种解决方法是在备份模式下复制文件(使用/b标志)。

正文完