[Gulp][.Net Web Application][CI] Gulp CI Deploy (2) – 使用 MSDeploy (WebDeploy) 进行 Deploy

前言

在上一篇,我们透过 Gulp Robocopy 套件进行网站布署,而本篇我们将使用微软的Web Deploy 进行网站布署。不同于 Robocopy ,网页服务器目标数据夹需要开放编辑权限(若开放所有使用者读写权限,可能有些安全性的疑虑),Web Deploy 则是使用Windows Service (透过 port 8172) 协助进行布署。理所当然,因为是第一次使用CI流程,过程中遇到许多IT问题,这此也一并记录下来,提供各位与未来自己设置的时候参考使用,若有观念错误或者建议请各位先进不吝指教。


本系列文章大概内容如下(暂定,会修改):
Using gulp to implement .Net web application continuous integration
1.Gulp 基础教学
2.流程简介、代入参数与修改AssemblyInfo
3.透过 Gulp 进行 NuGet Package Restore
4.透过 Gulp:gulp-msbuild 进行 Build project
5.透过 Gulp:gulp-nunit-runner 进行 Unit Test
6.Gulp CI Deploy (1) - 透过Gulp : Robocopy 进行 Deploy
7.Gulp CI Deploy (2) - 使用 MSDeploy (WebDeploy) 进行 Deploy
   7-2 流程说明
   7-2 前置作业 : 安装 Web Deploy
   7-3 透过 Gulp 使用 powershell 执行MSDeploy
   7-4 问题排除
8.Gulp CI IIS Management - 使用 PowerShell 变更实例路径
​9.最终篇: Team City 设定 与 Build Scripts 撰写

本系列文章使用的环境如下:
1.Visual Studio 2015 Community Update 3
2.Visual Studio Core
3.TeamCity
4.Nunit 3.2.1.0
5.NuGet 3.4.4.1321

介绍

流程说明
重要1. 确认于Web Server上有安装Web deploy套件,并启动服务。
重要2. 确认你的账号是administrator,或者有授予权限的 user 账号(此篇不讨论,另外讲)。




前置作业 : 安装 Web Deploy
Step 1. 前往 Microsoft /web 下载  Microsoft web platform installer



Step 2. 开启安装程序


Step 3. 搜寻框内输入Web Deploy进行搜寻,加入 Web Deploy 3.6 , 点选 install 按钮


Step 4. 安装中


Step 5. 安装完成


Step 6. 开启服务(Service) 确认


Step 7. 建立布署数据夹 (Create deploy folder)



Step 8. 建立实例路径数据夹
            (实例路径可先随意建立数据夹,变更实例路径章节会再详细说明)


Step 9. 于 IIS 上建立新的 WebSite (Create Website on IIS)
            并且设定实例路径(请注意您的路径,等等web deploy命令会用到)

 


透过 Gulp 使用 powershell 执行MSDeploy
Step 1. 我们使用 MSDeploy 命令如下 (命令说明可以参考这里)

msdeploy.exe
'-verb:sync'
'-source:contentPath=C:SourceFolder'
'-dest:contentPath="C:DestFolder", ComputerName="http://domain_or_ip/MSDeployAgentService" ,UserName="user", Password="passwrod",AuthType="NTLM"'
'-allowUntrusted'


重要1:你的使用者必须要是administrator,否则需要建立账号或指定权限给IIS使用者。
重要2:请依据你的需求调整参数。

Step 2.更新 gulpfile.js 程序如下
重要1:__dirname 为 gulp 语法,取得目前所在文件路径,因为需要从TeamCity Agent folder
布署到Web Server,故需要取得目前路径。
重要2:DestFolder 为 IIS 设定的实例路径。

var gulp = require('gulp'),
    args = require('yargs').argv;


gulp.task('webDeploy', function() {
    var siteName = "SiteName";
    var webDeployUrl ="http://Domain/MSDeployAgentService";
    var sourcePath = "SourcePath";
    var spawn = require("child_process").spawn,child;

        child = spawn("powershell.exe",['msdeploy.exe '-verb:sync' '-source:contentPath=' + __dirname + '\' + sourcePath +'' '-dest:contentPath="C:\web\ProjectName\' + siteName + '\' + args.buildVersion + '",ComputerName="'+ webDeployUrl +'",UserName="duran.hsieh",Password="123456",AuthType="NTLM"' '-allowUntrusted'']);
        child.stdout.on("data",function(data){
            console.log("Powershell Data: " + data);

        });
        child.stderr.on("data",function(data){
            console.log("Powershell Errors: " + data);

        });
        child.on("exit",function(){
            console.log("Powershell Script finished");
        });
        child.stdin.end();
});

 

在这段程序中,我们在gulp中使用powershell,使用命令的方式执行MSDeploy.exe

Step 3. 输入命令进行测试
gulp webDeploy --project-name Aft.Project --build-version 2.0.0

问题排除

Q1. Connecting to remote server failed with the following error message : The WinRM client
cannot process the request. Default authentication may be used with an IP address under the following conditions: the transport is HTTPS or the destination is in the TrustedHosts list, and explicit credentials are provided. Use winrm.cmd to configure TrustedHosts. Note that computers in the TrustedHosts list might not be authenticated. For more information on how to set TrustedHosts run the following command: winrm help config. For more information, see the about_Remote_Troubleshooting Help topic.

A:使用以操作增加信任清单
winrm set winrm/config/client '@{TrustedHosts="machineA,machineB"}'


Q2. Connecting to remote server 10.72.102.155 failed with the following error message :
WinRM cannot complete the operation. Verify that the specified computer name is valid, that the computer is accessible over the network, and that a firewall exception for the WinRM service is enabled and allows access from this computer. By default, the WinRM firewall exception for public profiles limits access to remote computers within the same local subnet. For more information, see the about_Remote_Troubleshooting Help topic.

A.输入命令 Enable-PSRemoting
参考下面这篇博客进行设定:
https://blogs.technet.microsoft.com/heyscriptingguy/2012/12/30/understanding-powershell-remote-management/


上一篇:[Gulp][.Net Web Application][CI] Gulp CI Deploy(1)-透过Gulp:Robocopy进行Deploy
下一篇:[Gulp][.Net Web Application][CI] IIS Management - 使用 PowerShell 变更实例路径

参考数据

1.Using Gulp to Build and Deploy .NET Apps on Windows
2.MSBuild - MSDN - Microsoft
3.Command Line Reference - NuGet Docs
4.NUnit-Console Command Line Options
5.gulp API docs


本篇文章有部分内容参考相关网站数据,若有不妥请告知,我将尽快移除。