将MsBuild打包和部署拆分为单独的MsBuild和MsDeploy命令

12

我遇到了一些问题,想要将MsBuild的打包和部署命令分成两个单独的命令。(我需要这么做来传递额外的参数给MsDeploy)。

下面是正常工作的命令:

msbuild "src\Solution.sln" 
  /P:Configuration=Deploy-Staging 
  /P:DeployOnBuild=True
  /P:DeployTarget=MSDeployPublish
  /P:MsDeployServiceUrl=https://192.168.0.1:8172/MsDeploy.axd
  /P:DeployIISAppPath=staging.website.com 
  /P:AllowUntrustedCertificate=True 
  /P:MSDeployPublishMethod=WmSvc 
  /P:CreatePackageOnPublish=True 
  /P:UserName=staging-deploy 
  /P:Password=xyz

分离打包命令看起来像这样:

msbuild "src\Solution.sln" 
  /P:Configuration=Deploy-Staging 
  /P:DeployOnBuild=True
  /P:DeployTarget=Package 
  /P:_PackageTempDir=C:\temp\web

这很好用。但是接下来是MsDeploy部分:

msdeploy 
 -verb:sync 
 -allowUntrusted 
 -usechecksum
 -source:manifest=
  'src\WebProject\obj\Deploy-Staging\Package\WebProject.SourceManifest.xml'  
 -dest:auto,ComputerName=
  'https://192.168.0.1:8172/MsDeploy.axd?site=staging.website.com',
   username='staging-deploy',password='xyz',authType='basic',includeAcls='false'
 -enableRule:DoNotDeleteRule

操作失败,WmSvc.log记录以下错误信息

wmsvc.exe Error: 0 : Attempted to perform an unauthorized operation.
setAcl/C:\temp\web (Read)
ProcessId=15784
ThreadId=31
DateTime=2011-03-30T14:57:02.4867689Z
Timestamp=3802908721815
wmsvc.exe Error: 0 : Not authorized.
Details: No rule was found that could authorize user 'staging-deploy', 
         provider 'setAcl', operation 'Read', path 'C:\temp\web'.

(还有几个读/写操作)

明显出现了一些问题,它试图访问的路径有误(因为使用其他方法时可以正常工作)-我不确定它是否正确地使用了iisApp定位,而且目前我认为正确的web.config也没有被部署。

3个回答

15

我已经解决了这个问题-我需要使用不同的命令而不是自动生成的.cmd文件使用的命令,但比较这两个命令使我能够修复它(感谢@Vishal R. Joshi)

我所需的区别是:

  • 基本身份验证
  • 允许不受信任的证书
  • ?site=staging.webserver出现在MsBuild.axd路径的末尾,就像我的原始命令一样
  • 覆盖设置在参数文件中的IIS Web应用程序名称
  • 启用不删除规则

获胜的命令如下:

msdeploy 
 -verb:sync 
 -allowUntrusted 
 -source:package='src\WebProject\obj\Deploy-Staging\Package\WebProject.zip'  
 -dest:auto,ComputerName=
  'https://192.168.0.1:8172/MsDeploy.axd?site=staging.website.com',
  username='staging-deploy',password='xyz',authType='basic',includeAcls='false'
  setParamFile:
    "src\WebProject\obj\Deploy-Staging\Package\WebProject.SetParameters.xml"
 -setParam:name='IIS Web Application Name',value='staging.website.com'
 -enableRule:DoNotDeleteRule
 -disableLink:AppPoolExtension -disableLink:ContentExtension 
 -disableLink:CertificateExtension

希望这能帮到某些人!


1
詹姆斯,这个msdeploy命令是由myproj.deploy.cmd文件生成的还是手工制作的? 谢谢 Vishal R. Joshi | http://vishalrjoshi.com | http://twitter.com/vishalrjoshi - Vishal R Joshi
1
嘿,Vishal,不太对-使用deploy.cmd命令的问题在于:我需要设置基本身份验证,并且必须在目标计算机名称上添加?site=staging.webserver作为参数,因为用户没有访问所有IIS的权限。话虽如此,我现在已经成功地解决了这个问题-结果是我应该使用source:package而不是source:manifest(我认为它试图在目标服务器上使用清单定义创建包而不是在本地-这是我自己对其工作方式的误解)。 - James Crowley

1

使用inetmgr在服务器上添加委派规则,允许staging-deploy执行set-Acl操作。 Inetmgr -> 单击服务器节点 -> 管理服务委派(在管理中) -> 单击右侧的添加规则 -> 选择标记为“设置应用程序权限”的模板 -> 接受默认值并单击确定。

这样,只要您要部署的用户具有访问您要部署的站点的权限,就可以让您部署任何包或清单,并使用setAcl。


1
谢谢Owais,但是该用户已经拥有setAcl权限(以及contentPath、createApp和iisApp)。此外,如果我正确地调用msdeploy,直接调用msdeploy肯定需要与msbuild路线相同的服务器端权限 - 而且那个方法完全正常运行... - James Crowley

0

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