Jenkins 中的 WinSCP 失败并显示 "Cannot open file "...\WinSCP.ini”。进程无法访问该文件,因为它正被另一个进程使用”

WinSCP in Jenkins fails with "Cannot open file "...\WinSCP.ini". The process cannot access the file because it is being used by another process"

我们有一些 cmd 脚本需要访问远程 FTP 目录以在 Jenkins 上传输文件,我们偶尔会在 WinSCP 的控制台输出中遇到错误。

----------------------------------------------------------     
START SCRIPT - 20.08.2021  8:50:02                                          
----------------------------------------------------------   
                                                                              
**************                                                           
START FTP Operation - 20.08.2021  8:50:02                               
***                                                                     
 Volume in drive \localdata is DATA
 Volume Serial Number is 52EF-B4C7

 Directory of \local-directory

06.05.2020  20:07    <DIR>          .
06.05.2020  20:07    <DIR>          ..
06.05.2020  20:07    <DIR>          folder1
14.06.2021  14:17    <DIR>          folder2
17.08.2021  11:15    <DIR>          error
               0 File(s)              0 bytes
               5 Dir(s)  153.174.507.520 bytes free
batch           on        
confirm         off       
include         |archive;archiv;processed
reconnecttime   10        
Searching for host...
Connecting to host...
Cannot open file "C:\Program Files (x86)\WinSCP\WinSCP.ini". The process cannot access the file because it is being used by another process
No session.
No session.
No session.
transfer        ascii     
\localdirectory
No session.
No session.
No session.
No session.
No session.
No session.


***                                                       
END FTP Operation   - 20.08.2021  8:50:03                 
**************                                              
    
----------------------------------------------------------       
END SCRIPT - 20.08.2021  8:50:03                                            
----------------------------------------------------------  
                                                                            
                                                                            
Build step 'Execute Windows batch command' marked build as failure
Sending e-mails to:
Finished: FAILURE

它似乎在脚本试图打开一个新的 FTP-session 时出现:

 C:\"Program Files (x86)"\WinSCP\winSCP.com /console /script="%FTPScriptDir%%FTPScriptFile%" 

批处理脚本实际上调用了一个 .ftp 文件来打开一个新会话:

#option config
option batch on
option confirm off
option exclude "archive;archiv;processed"
option reconnecttime 10

##
# open SFTP session
# WinSCP Session (local installation => C:\"Program Files (x86)"\WinSCP\)
##        

open sftp:/// -hostkey="" -rawsettings ProxyPort=0

Jenkins 作业配置为 运行 一个又一个批处理命令:

两个批处理脚本文件做同样的事情。关于 local/remote 目录路径只有区别。

你能帮我找到避免这些偶然错误的方法吗?谢谢!

你的 WinSCP 脚本依赖于一个共享的 INI 配置文件,这与 guidelines 相悖。很可能您 运行 多个 WinSCP instances/transfers 并行,它们互相争夺文件的写入权限。

有两种解决方案:

  • 快速而肮脏的解决方案是 mark the INI file as read-only,这样 WinSCP 就不会在完成时尝试更新它。

  • 一个正确的解决方案是避免使用共享配置。而是使用 /ini=nul commandline switch 让 WinSCP 使用默认配置。虽然这可能需要对脚本进行一些调整,以防它真的依赖于 INI 文件中的某些配置。

https://winscp.net/eng/docs/scripting#configuration