Eri*_*ebb 3 windows powershell batch-file debug-symbols
我们正在努力将一个步骤集成到我们的持续集成(CI)服务器(CruiseControl.NET)中.我们希望*.pdb将从构建过程生成的调试符号注册到Microsoft Symbol Server.由Microsoft实现,符号服务器是Visual Studio用于查找*.pdbC++/C#可执行文件的调试符号的目录结构.Microsoft提供了一个命令symstore,该命令将调试符号放在一个目录中,并根据需要填充中心符号存储目录.
问题是symstore明确指出并发运行是不安全的.
我们可以尝试symstore通过BATCH或Powershell脚本禁止同时执行命令的方法或策略是什么?
我们在方法上很灵活,但由于我们在Windows平台上运行,因此BATCH和Powershell是首选解决方案.
澄清:
对于我们的用例,symstore需要从两个不同的CI服务器运行,这些服务器将符号保存在公共网络驱动器上.
资源:
symstore :: http://msdn.microsoft.com/en-us/library/windows/desktop/ms681417(v=vs.85).aspx
您可以使用锁定的文件作为简单的信号量来序列化事件.将stdout重定向到批处理文件中的文件时,它会在该文件上建立独占写锁定.没有其他进程可以打开相同的文件进行写访问.无论方法如何结束(清除退出,CTRL-C,异常失败等),锁定将在进程完成时自动释放
批处理文件可以尝试将9重定向到锁定文件,如果失败,则循环返回成功.symstore命令仅在锁定到位时运行.使用非标准文件句柄(stream?),以便锁不会干扰stdin,stdout或stderr处理.
所以你只需要确保你不要直接调用symstore.相反,您总是通过批处理脚本调用它.类似于以下内容(serializeSymstore.bat):
@echo off
setlocal
:loop
:: Save stderr definition and redirect stderr to nul
:: to hide possible redirection error when establishing lock.
8>&2 2>nul (
%= Attempt to establish the lock and restore stderr =%
9>"\\centralServer\somePath\symstore.lock" 2>&8 (
%= If got here then lock is established throughout all commands =%
%= in this set of parentheses. =%
%= Execute your command =%
symstore %*
%= Save the return code =%
call set "rtnCd=%%errorlevel%%"
%= The next command is a very fast way to clear the ERRORLEVEL. =%
%= We don't want symstore failure to trigger a loop. =%
(call )
)
) || (
%= If entered here then failed to establish lock. =%
%= Wait 1 second and then loop back to retry. =%
%= Replace with PING delay if TIMEOUT not universally available. =%
timeout 1 /nobreak >nul
goto loop
)
:: Exit with appropriate return code
exit /b %rtnCd%
Run Code Online (Sandbox Code Playgroud)
没有注释,它就变成了一小段代码
@echo off
setlocal
:loop
8>&2 2>nul (
9>"\\centralServer\somePath\symstore.lock" 2>&8 (
symstore %*
call set "rtnCd=%%errorlevel%%"
(call )
)
) || (
timeout 1 /nobreak >nul
goto loop
)
exit /b %rtnCd%
Run Code Online (Sandbox Code Playgroud)
我发现这种原始而简单的策略在许多项目中都非常有效.我必须承认我没有在远程机器上测试锁定和释放特性.但我相信只要所有机器都是Windows,它应该是可靠的.
我所知道的唯一缺点是没有FIFO队列.如果收到多个重叠请求,那么抽奖的随机运气就是接下来要进入哪个进程.但这些过程将被序列化.
编辑:
在编辑之前,我已经读过splattered bits的原始答案.他质疑远程机器上的文件锁定是否可靠.我做了一些快速的谷歌搜索,似乎在UNC路径上存在一些文件锁定问题.如果遇到问题,您可能会更好地重定向到映射驱动器盘符上的文件而不是直接通过UNC路径.这都是理论 - 我没有做过测试.在提交此解决方案之前,请务必进行充分的测试.请注意,PUSHD是一种方便的方法,可以在不知道可用的驱动器号的情况下临时将驱动器号分配给UNC路径.POPD将取消映射驱动器分配.
| 归档时间: |
|
| 查看次数: |
1018 次 |
| 最近记录: |