【问题标题】:MsDeploy remoting executing manifest twiceMsDeploy 远程执行清单两次
【发布时间】:2011-07-21 11:36:31
【问题描述】:

我有:

  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 状态“正常”)。
详细:当前同步过程缺少 2 个对象的流内容。

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

...


高级

通常我会部署一个新构建的包,其位比服务器上的更新。

在第二关中,它复制了第一关中所做的一切。

在第 1 阶段,它将:

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

在第 2 阶段,它将:

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

我不知道为什么它不复制第 1 遍中的文件,或者为什么会触发第 2 遍。

如果我重新部署相同的包而不是部署新的位,它将运行第 1 步中的所有步骤,而不运行第 2 步。可能是因为文件具有相同的时间戳。

【问题讨论】:

  • 您能否使用 -verbose 选项运行 msdeploy 并查看日志是否为您提供任何有用的信息?
  • 是否所有命令都执行了两次?还是只有一些?你是怎么注意到的?
  • 劫持问题以添加-verbose 日志输出。重新排序清单中的执行,使其更有意义。

标签: iis deployment msdeploy


【解决方案1】:

问题中没有足够的信息来真正重现问题以给出具体答案......但是有几件事需要检查/更改/尝试使其工作:

编辑 - 添加-verboseoutput 之后:

我看到了这些可能性:

  • 时间
    两台机器都有时间差异(其中一台只是有点偏离或某些时区问题......)
  • 文件系统
    如果其中一个文件系统是 FAT,这可能会导致问题(时间戳解析...)

编辑 2 - 根据 cmets:

在我上一次编辑中,我写了关于时间戳的文章,因为我怀疑在比较这些时会出现问题……例如,两台机器之间的时钟不同(即使是 30 秒的差异也会产生影响)和/或一些时区问题...

我写了关于文件系统的文章。 FAT,因为 FAT 的时间戳分辨率约为 2 秒,而 NTFS 的分辨率要高得多,这在比较时间戳时也会产生影响...

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

编辑 3 - 根据 Merlyn Morgan-Graham 的评论,结果供将来参考:

使用runCommand 提供程序时,请使用批处理文件。出于某种原因,这使它停止运行两次传球。

此解决方案的问题是无法通过SetParameters.xml 文件指定服务的安装目录(dontUseCommandExe / preSync / postSyncSetParameters.xml 相同)。

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

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

【讨论】:

  • 命令两次都没有失败,所以我不确定这是权限问题(?)。尝试修复报价 - 没有骰子。目录/文件不是问题(我不认为),因为在实际进行部署时我再次没有错误。我尝试了临时代理选项,我得到了相同的行为(在复制临时代理之后)。我尝试了-whatif,但部署时没有两次通过(启用-whatif 时“更新”的项目较少,然后似乎只有一次通过)。
  • 这些文件应该有不同的时间戳,因为我已经重新创建了它们。这就是我同步它们的原因。如果您注意到源文件的时间戳比目标文件晚,那是有道理的。令我困惑的是,它们不会在“第一遍”时更新,而是在“第二遍”时更新。为什么它要进行两次传递让我感到困惑。
  • 我一直在纠结要早点放哪一部分日志,以至于我忘了实际描述正在发生的所有步骤 :) 我将其添加到 Q 的底部。
  • 好的,开始工作了。简短回答:使用runCommand 提供程序时,请使用批处理文件。出于某种原因,这使它停止运行两次传球。这个解决方案的问题是你不能通过 SetParameters.xml 文件指定服务的安装目录。我也终于找到并尝试了dontUseCommandExe 选项,但我发现该选项不允许您为 exe 指定参数。您的 preSync 选项等也不允许您在 SetParameters.xml 中指定目录。所以,我将放弃试图让这一切变得完美。 MsDeploy 不成熟。 :)
  • @MerlynMorgan-Graham 谢谢-我将其添加为上面的 EDIT 3 以供将来参考:-)
【解决方案2】:

我遇到了同样的问题,但我没有制作 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”)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    相关资源
    最近更新 更多