完成此处建议的操作:从Visual Studio Online构建部署到私有IIS服务器...构建整个分支时,**/*.sln
如何在构建过程中设置自动部署?
我尝试过的...
在VS中,我可以获得最新版本的代码,打开一个解决方案,然后...右键单击>发布>选择发布配置文件>部署
我已将我的发布配置文件命名为“ dev”,“ qa”,“生产”之类,它们是指将项目部署到的环境,并且配置文件包含VS部署所需的所有配置信息(通过webdeploy / msdeploy)使用“一键部署”该应用程序。
我希望构建服务器上的Team Services对在构建代码后定义了发布配置文件的项目执行完全相同的操作。
我的理解是我可以像这样添加msbuild args ...
这导致构建的部署部分在构建日志中抛出以下异常...
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.Publishing.targets(4288,5):
Error ERROR_USER_NOT_ADMIN: Web deployment task failed.
(Connected to 'server' using the Web Deployment Agent Service, but could not authorize. Make sure you are an administrator on 'server'.
Learn more at: http://go.microsoft.com/fwlink/?LinkId=221672#ERROR_USER_NOT_ADMIN.)
如果不是在发布配置文件中定义的用户,这是什么用户?
相关问题:
我向有问题的服务器添加了一个帐户(由于将构建和部署到的服务器是同一台服务器,这使事情变得更加容易),我还向服务器添加了一个名为“ MSDepSvcUsers”的组,并向其中添加了新的帐户和盒子上的管理员组。
然后,我告诉Web部署代理服务和Team Services代理服务都在此帐户下运行(然后重新启动它们)。
不幸的是结果是一样的...我现在真的很想知道我该如何确保用于msdeploy命令的帐户是我期望的,而不必依赖脚本的加载...或者也许这就是Microsoft为何不这样做的原因已将其设置为Team Services中的默认部署步骤选项!
好的,所以我在微软与VSTS团队进行了长时间的交谈,这是长期的还是短暂的。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
微软:
我们了解您对这一领域的不满,因此将启动一个大项目来解决此问题
...
我就是我,想出了一些“技巧来实现它”。
我设法弄清楚,由于某种奇怪的原因,构建箱也不能与您要部署的服务器相同(不知道为什么),但是弄清楚,我编写了一个简单的控制台应用程序,并获得了微软的一些其他反馈不错。
它甚至可以将进度报告给流程,并且可以将部署中的异常记录为异常,以通过调用“内部命令”(使构建工作以一种向团队敬畏的方式)来使构建失败。
这里有一些技巧,虽然它不是完美的,但希望它能对其他人有所帮助,我称其为“因为它是我的仓库中构建的代码的一部分,因此我可以在构建过程中添加一个步骤来调用它”从构建输出中传递要部署到的环境名称。
实习生将获取所有软件包(按照上面的设置),并使用它们的发布配置文件确定软件包需要存放的位置,然后将它们发送到要部署的正确服务器上。
using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
namespace Deploy
{
class Program
{
static string msDeployExe = @"C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe";
static void Main(string[] args)
{
var env = args[0];
var buildRoot = Path.Combine(Assembly.GetExecutingAssembly().Location.Replace("Deploy.exe", ""), env);
//var commands = GetCommands(buildRoot);
var packages = new DirectoryInfo(buildRoot).GetFiles("*.zip", SearchOption.AllDirectories);
bool success = true;
for (int i = 0; i < packages.Length; i++)
{
if (!Deploy(packages[i], env)) success = false;
Console.WriteLine("##vso[task.setprogress]" + (int)(((decimal)i / (decimal)packages.Length) * 100m));
}
Console.WriteLine("##vso[task.setprogress]100");
if(success) Console.WriteLine("##vso[task.complete result=Succeeded]");
else Console.WriteLine("##vso[task.complete result=SucceededWithIssues]");
}
static bool Deploy(FileInfo package, string environment)
{
bool succeeded = true;
Console.WriteLine("Deploying " + package.FullName);
var procArgs = new ProcessStartInfo
{
FileName = msDeployExe,
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
Arguments =
"-source:package='" + package.FullName + "' " +
"-dest:auto,ComputerName='" + environment + ".YourDomain.com',UserName='deployment user',Password='password',AuthType='ntlm',IncludeAcls='False' " +
"-verb:sync " +
"-disableLink:AppPoolExtension " +
"-disableLink:ContentExtension " +
"-disableLink:CertificateExtension " +
"-setParamFile:\"" + package.FullName.Replace("zip", "SetParameters.xml") + "\""
};
try
{
Console.WriteLine(msDeployExe + " " + procArgs.Arguments);
using (var process = Process.Start(procArgs))
{
var result = process.StandardOutput.ReadToEnd().Split('\n');
var error = process.StandardError.ReadToEnd();
process.WaitForExit();
if (!string.IsNullOrEmpty(error))
{
Console.WriteLine("##vso[task.logissue type=error]" + error);
succeeded = false;
}
foreach (var l in result)
if (l.ToLowerInvariant().StartsWith("error"))
{
Console.WriteLine("##vso[task.logissue type=error]" + l);
succeeded = false;
}
else
Console.WriteLine(l);
}
}
catch (Exception ex) {
succeeded = false;
Console.WriteLine("##vso[task.logissue type=error]" + ex.Message);
Console.WriteLine("##vso[task.logissue type=error]" + ex.StackTrace);
}
return succeeded;
}
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句