MsDeploy远程执行清单两次

10

我已经:

  1. 创建了一个msdeploy清单,以实现:
    停止、卸载、复制、安装和启动Windows服务。
  2. 从清单中创建了一个包。
  3. 对远程服务器执行了msdeploy命令。

问题:它会执行整个清单两次。

尝试过:我已经调整了waitInterval和waitAttempts,以为它会超时并重新开始,但没有帮助。

问题:是什么原因导致了它执行两次?

清单内容:

<sitemanifest>
  <runCommand path="net stop TestSvc"
              waitInterval="240000"
              waitAttempts="1"/>

  <runCommand 
    path="C:\Windows\Microsoft.NET\Framework\v4.0.30319\installutil.exe /u
       C:\msdeploy\TestSvc\TestSvc\bin\Debug\TestSvc.exe"
       waitInterval="240000"
       waitAttempts="1"/>

  <dirPath path="C:\msdeploy\TestSvc\TestSvc\bin\Debug" />

  <runCommand 
    path="C:\Windows\Microsoft.NET\Framework\v4.0.30319\installutil.exe
    C:\msdeploy\TestSvc\TestSvc\bin\Debug\TestSvc.exe"
    waitInterval="240000"
    waitAttempts="1"/>

  <runCommand path="net start TestSvc"
    waitInterval="240000"
    waitAttempts="1"/>

</sitemanifest>

用于打包的命令:

"C:\Program Files\IIS\Microsoft Web Deploy V2\msdeploy" 
         -verb:sync 
         -source:manifest=c:\msdeploy\custom.xml 
         -dest:package=c:\msdeploy\package.zip

执行该命令的命令:

"C:\Program Files\IIS\Microsoft Web Deploy V2\msdeploy" 
         -verb:sync 
         -source:package=c:\msdeploy\package.zip 
         -dest:auto,computername=<computerNameHere>

我正在以拥有管理员访问权限的域用户身份运行。 我已经尝试了传递凭据 - 这不是权限问题,命令成功执行,只是执行两次。


编辑:

我启用了 -verbose 并在日志中发现了一些有趣的行:

详细信息:执行同步传递#1。

...

详细信息:源文件路径(C:\ msdeploy \ MyTestWindowsService \ MyTestWindowsService \ bin \ Debug \ MyTestWindowsService.exe)与目标文件路径(C:\ msdeploy \ MyTestWindowsService \ MyTestWindowsService \ bin \ Debug \ MyTestWindowsService.exe)不匹配,在属性上不同(lastWriteTime ['11/08/2011 23:40:30','11/08/2011 23:39:52'])。 更新待处理。

详细信息:源文件路径(C:\ msdeploy \ MyTestWindowsService \ MyTestWindowsService \ bin \ Debug \ MyTestWindowsService.pdb)与目标文件路径(C:\ msdeploy \ MyTestWindowsService \ MyTestWindowsService \ bin \ Debug \ MyTestWindowsService.pdb)不匹配,在属性上不同(lastWriteTime ['11/08/2011 23:40:30','11/08/2011 23:39:52'])。 更新待处理。

在这些行之后,文件第一次不会被复制,但第二次会被复制

...

详细信息:依赖项检查“DependencyCheckInUse”未发现问题。
详细信息:从代理收到响应(HTTP状态 'OK')。
详细信息:当前同步传递缺少 2 个对象的流内容。

详细信息:执行同步传递#2。

...


高级

通常,我会部署一个具有比服务器上更新的版本的新构建包。

在第二遍中,它会重复执行第一遍中所做的所有操作。

在第一遍中,它将:

  • 停止、卸载(删除服务安装创建的某些日志文件)、安装和启动 Windows 服务

在第二遍中,它将:

  • 停止、卸载、复制文件、安装和启动 Windows 服务。

我不知道为什么它不会在第一遍中复制文件,或者为什么会触发第二遍。

如果我重新部署相同的包而不是部署新的版本,则会运行第一遍中的所有步骤,而不会运行第二遍。这可能是因为文件具有相同的时间戳。


你可以尝试使用 -verbose 选项启动 msdeploy,看一下日志是否提供了有用的信息? - mthierba
所有命令都执行两次吗?还是只有一些?你如何注意到它? - esskar
劫持了问题以添加“-verbose”日志输出。还重新排列了清单中的执行顺序,使其更有意义。 - Merlyn Morgan-Graham
2个回答

1

问题中的信息不足以真正重现问题并给出具体答案...但有几个要检查/更改/尝试的事情可以使其正常工作:

编辑-添加-verbose输出后:

我看到了以下几种可能性:

  • 时间
    两台机器的时间存在差异(其中一台机器的时间有点偏差或者时区问题...)
  • 文件系统
    如果其中一个文件系统是FAT,这可能会导致问题(时间戳分辨率...)

编辑2 - 根据评论:

在我的最后一次编辑中,我写了关于时间戳的内容,因为我怀疑在比较时间戳时出现了问题...这可能是由于两台机器之间的时钟不同(即使相差30秒也会产生影响),和/或一些时区问题...

我提到了文件系统,特别是FAT,因为FAT的时间戳分辨率约为2秒,而NTFS具有更高的分辨率,这在比较时间戳时可能会产生影响...

根据您的描述,我建议采用以下解决方法:

编辑3 - 根据Merlyn Morgan-Graham的评论,以下是未来参考的结果:

使用runCommand提供程序时,请使用批处理文件。由于某种原因,这使它停止了运行两个过程。

这种解决方案的问题是无法通过SetParameters.xml文件指定服务的安装目录(对于dontUseCommandExe/preSync/postSync也是一样)。

编辑4 - 根据Merlyn Morgan-Graham的评论:

超时参数适用于是否终止特定命令,而不是关闭Windows服务本身...在这种情况下,似乎Windows服务停止需要相当长的时间,因此只有runCommand被执行,而没有复制/同步,并且会启动整个运行的新尝试...


文件预计具有不同的时间戳,因为我已经重新创建了它们。这就是为什么我正在同步它们。如果您注意到源文件的时间戳比目标文件晚,那是有道理的。让我感到困惑的是它们在“第一遍”没有更新,但在“第二遍”更新了。为什么要进行两次通行令我困惑不解。 - Merlyn Morgan-Graham
啊哈,我知道为什么它会完全重试,并且即使使用dontUseCommandExe和参数,runCommand也无法修复它。尽管我设置了一个显著的waitInterval,但在我的服务卸载过程中发生了超时。该值只是杀死进程的间隔,而不是避免中止传递的间隔。我认为中止传递间隔将是1秒钟左右,您无法覆盖它。如果达到该大小,则它将假定无法复制文件,将运行其余的runCommand任务,并尝试整个过程。 - Merlyn Morgan-Graham
我通过调整 retryAttemptsretryIntervalwaitAttempts 参数来解决了这个问题。看起来它们还需要绑定到一个被忽略的设置值上。我可以通过 preSyncpostSync 来修复,但是这些方法在 SetParameters.xml 中不起作用。好了,我保证现在完全解决了 :) 感谢你的帮助! - Merlyn Morgan-Graham
@MerlynMorgan-Graham 没问题,我已经加上了(编辑4)...为了更新Windows服务,我可能会构建两个服务(一个是更新程序,另一个是真正的服务)...更新程序服务获取新的EXE文件,停止另一个服务,复制并重新启动它...这样你就可以适应任何特殊情况,比如需要等待更长时间或需要检查某些事务处理是否完成等。 - Yahia
我遇到了同样的问题,但是在runCommand阶段使用Powershell脚本。有2个同步传递。有时候,后置的runCommand会在同步之前运行。尽管它们在清单中按顺序出现,但似乎无法保证顺序。您有什么进一步的建议来解决这个问题吗? - jaffa
显示剩余4条评论

0

我曾经遇到过同样的问题,但是我没有制作package.zip文件。 我直接在一步中执行同步操作。 preSync/postSync解决方案对我帮助很大,而且不需要使用清单文件。 你可以尝试在你的情况下使用以下命令:

"C:\Program Files\IIS\Microsoft Web Deploy V2\msdeploy"  
-verb:sync 
-preSync:runCommand="net stop TestSv && C:\Windows\Microsoft.NET\Framework\v4.0.30319\installutil.exe /u
       C:\msdeploy\TestSvc\TestSvc\bin\Debug\TestSvc.exe",waitInterval=240000,waitAttempts=1 
-source:dirPath="C:\msdeploy\TestSvc\TestSvc\bin\Debug"
-dest:auto,computername=<computerNameHere>
-postSync:runCommand="C:\Windows\Microsoft.NET\Framework\v4.0.30319\installutil.exe
    C:\msdeploy\TestSvc\TestSvc\bin\Debug\TestSvc.exe && net start TestSvc",waitInterval=240000,waitAttempts=1

"

“-verb:sync”参数表示您在源和目标之间同步数据。在您的情况下,第一次执行同步是在“C:\msdeploy\TestSvc\TestSvc\bin\Debug”文件夹和“package.zip”之间进行的。此外,您正在使用清单文件,因此当您在“package.zip”和目标“计算机名称”之间执行第二次同步时,msbuild会为目标和源分别使用先前提供的清单两次,因此每个清单操作都会运行两次。 我使用了“&&”技巧来执行多个命令。 此外,在我的情况下,我必须添加超时操作以确保服务完全停止(“ping -n 30 127.0.0.1 > nul”)。

"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接