我正在尝试使用TFS在CI中部署一堆WPF应用程序。到目前为止,部署步骤是手动激活的,即我从开发人员调用了Powershell脚本。框来运行每个项目并进行部署。如果有帮助,请参阅代码段。
$projs = Get-ChildItem -Path $pwd -Recurse -Include '*.csproj
foreach ($proj in $projs)
{
$xml = [xml](Get-Content $proj)
$assemblyName=""
$publishUrl = ""
$productName =""
$nodes = $xml.GetElementsByTagName('AssemblyName')
#Write "Trying to get AssemblyName"
foreach ($node in $nodes) {
$oldName = $node.'#text'
if($oldName.Contains("Beta")){continue}
$newName =$oldName+'_Beta'
#skip any PublishUrl that is still the default 'publish\'
# Write $newName
$node.'#text' = $newName
$assemblyName = $newName
}
#Write "Trying to get ProductName"
$nodesProduct = $xml.GetElementsByTagName('ProductName')
foreach ($node in $nodesProduct) {
if($node.'#text'.Contains(".NET"))
{
continue
}
$oldName = $node.'#text'
if($oldName.Contains("Beta")){continue}
$newName =$oldName+'_Beta'
# Write $newName
$node.'#text' = $newName
$productName = $newName
}
#Write "Trying to get PublishURL"
$nodesPublish = $xml.GetElementsByTagName('PublishUrl')
foreach ($node in $nodesPublish) {
$oldName = $node.'#text'
#skip any PublishUrl that is still the default 'publish\'
if ($node.'#text' -eq 'publish\') { break }
if($oldName.Contains("Beta")){continue}
$newName =$oldName+'Beta\'
# Write $newName
$node.'#text' = $newName
$publishUrl = $newName
}
#if all three params are not null save and deploy project
if($assemblyName -ne"" -And $publishUrl -ne "" -And $productName -ne "" )
{
$xml.Save($proj)
Write "trying to deploy $productName to $publishUrl"
msbuild /m /t:publish /p:Configuration='Debug' /p:Platform=AnyCPU /p:ApplicationVersion=$appVersion /p:ApplicationRevision=$Revision /p:MinimumRequiredVersion=$newVersion /p:PublishUrl="$publishUrl" /verbosity:m $proj
$pubDir = Join-Path $proj.Directory -ChildPath "bin\Debug\app.publish" -Resolve -ErrorAction Stop
#copy the files to the publish URL
Write "$pubDir"
Copy-Item -Path "${pubDir}\*" -Destination "$publishUrl" -Include '*.*' -Recurse -Force
Copy-Item -Path "${pubDir}\Application Files" -Destination "$publishUrl" -Recurse -Force
tf vc undo /noprompt $proj
Write "Tf undone"
}`
当我更改Assembly-info.cs以分开开发和生产环境部署时,请忽略所有Beta内容。我已经生成了自己的证书并将其链接到我的.csproj文件。这项工作已经过测试,是我们目前的战略。 我想将此脚本集成为Team Foundation Server中的后处理操作,以便我们可以获得CD。
在服务器上,我有:
此相同的脚本会生成以下错误:
\(x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(2884,5): warning MSB3327: Unable to find code signing certificate in the current user's Windows certificate store. To correct this, either disable signing of the ClickOnce manifest or install the certificate into the certificate store.
\(x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(4961,5): MSB4044: The "SignFile" task was not given a value for the required parameter "CertificateThumbprint".
我注意到TFS服务复制到代理上的.csproj没有与导入证书(也在源代码管理中)的链接
到目前为止,我已尝试在服务器上安装证书,并尝试以NTService身份运行。可以在这些线程中找到有关此错误的更多信息 1,2,3。但是,他们的解决方案似乎都不起作用。 我将不胜感激任何帮助。
答案 0 :(得分:0)
这就是我最终做的工作。
将我的pfx添加为我的所有UI项目的链接文件
使所有项目都使用来自此menu
将其检入源代码管理
制作一个新的构建定义,唯一的工作就是运行我的PowerShell 段
在我的TFS帐户