Windows环境构建与部署

通过云效流水线Flow,自动化实现Windows环境下的Web服务构建与部署。

前提条件

请确保已准备了2台阿里云ECS实例或者非阿里云服务器,在本示例中分别将2台服务器称为A服务器和B服务器。

  • A服务器,用于Web服务IIS环境主机。

  • B服务器,用于版本构建环境主机。

步骤一:安装IIS(Internet Information Server)Web服务组件

  1. A服务器上,打开Server Manager服务器管理器,选择顶部菜单栏Manage,单击Add Roles and Features,在弹出的安装步骤配置向导中,开始步骤操作。

  2. 选择安装类型Role-based or Feature-based Installation

  3. 服务器选择Server Selection:选择默认的本地机器,根据需求选择合适的机器。

  4. 服务器角色Server Roles:请单击勾选Web Server(IIS),并同时勾选以下三个选项。

    • IIS Management Scripts and Tools

    • Management Service

    • IIS Management Console

    高的

  5. 功能Features:此项可以不用选择,因为IIS不需要额外的Features。

  6. Role Services:根据需求选择此项的设定,也可以保留默认设定。image

  7. 进入Confirmation确认步骤,单击按钮Install,安装完成后点击Close关闭。

步骤二:安装IIS插件Web Deploy

  1. A服务器上,安装Web Deploy,请务必选择全部安装而非典型安装。

    说明
    • 下载插件Web Deploy 4.0

    • 什么是 Web Deploy?Web Deploy 是一个可扩展的客户端-服务器工具,用于将内容和配置同步到 IIS,比如开发人员将已编译的 Web 应用程序(ASP .Net、PHP 等)从开发人员工具(Visual Studio、WebMatrix 等)同步(又称为“发布”)到 IIS。

  2. 如果选择的自定义安装,需要安装下方截图中的所有组件。如果安装的选项比截图的有缺少,说明之前安装IIS中少安装了Management相关组件,需要重新安装Web服务组件Add Roles and Featuresimage

  3. (可选)通过打开控制面板 > 系统和安全 > 管理工具 > 服务验证 Web 部署是否正确运行,查看以下服务状态:

    • Web部署代理服务,正在运行(旧版本中的服务名称不同)。

    • Web管理服务,正在运行。

    说明
    • 如果某个代理服务未运行,请重新启动“Web 部署代理服务”。

    • 如果 Web 部署代理服务根本不存在,请在控制面板 > 程序 > 卸载程序,查找“Microsoft Web 部署 <版本>”。 选择“更改”安装,并确保对 Web 部署组件选择“将安装到本地硬盘”,完成更改安装步骤。

步骤三:安装组件dotnet-hosting

  • A服务器上,需要安装dotnet-hosting组件模块,为了确保网站资源正常访问。如果没有安装dotnet-hosting组件,那么服务资源访问时候就会报HTTP错误500.19。

  • 下载windows-hosting-bundle并运行安装组件。

    说明

    “dotnet-hosting”用于支持.NET Core应用程序在IIS(Internet Information Services)上运行。使得IIS能够识别并管理.NET Core应用。

步骤四:创建Web网站并配置发布功能Web Deploy

  1. A服务器上,开始菜单中,选择Windows管理工具,单击启动Internet Information Services(IIS)管理器,或者运行命令inetmgr.exe

  2. 在左侧菜单,右键单击Sites网站,选择Add Website添加网站。

  3. Website配置面板中,根据需求填写Site name网站名称和Physical path网站路径,单击OK高的

  4. 右键单击已创建的Web网站,选择Deploy > Config Web Deploy Publishing

    说明

    如果没有Deploy这个选项,说明之前的Web Deploy没有正确安装和运行。

  5. 检查弹出面板中的各项参数,默认URL for the publishing server connection端口为8172,可以保留这个端口,也可以设置为其它端口。URL中的host name(8172端口冒号前部分)可以不用修改,在构建机中部署Deploy时,将用IP地址代替host name。j

  6. (可选)如果是阿里云ECS,我们需要打开防火墙,允许外部对于Server的 8172、80端口的访问。

    说明

    选择目标实例的安全组,根据需求添加规则,添加入方向端口808172,授权对象源设置特定IP地址段或者全放开。

步骤五:配置Windows构建机

  1. B服务器上,安装环境依赖工具,根据需求选择版本安装。

    Visual Studio 2022
    webdeploy_amd64_zh-CN.msi
    dotnet-sdk-6.0.202-win-x64.exe
  2. 安装完成后,配置环境变量,将以下路径添加到Path系统变量或者用户变量。

    C:\Windows\Microsoft.NET\Framework64\v4.0.30319
    C:\Program Files\IIS\Microsoft Web Deploy V3
    C:\Program Files\dotnet
    说明

    在安装dotnet时已经添加环境变量,如果没有找到dotnet,可以手动添加。

  3. 环境变量配置完成后,打开Windows PowerShell命令窗口,测试命令msbuildmsdeploydotnet是否执行成功,以确保成功安装和配置环境变量。

步骤六:创建流水线Flow任务

  1. Flow中添加私有Windows构建机,具体操作请参阅构建集群

  2. 登录流水线Flow服务控制台,在控制台界面新建流水线,根据需求选择合适的流水线模板,单击创建按钮。

  3. 添加流水线源任务,在右侧滑出面板中,根据需求选择合适代码源,完成代码源流水线任务配置。

  4. 配置构建任务,在下个阶段区域,添加执行命令任务类型,在面板中完成配置参数。

    1. 任务名称:自定义任务名称。

    2. 构建集群:在私有构建集群中,选择私有目标Windows构建主机。

    3. 指定构建节点:选择构建环境Windows/amd64

    4. 构建环境:单击选中默认VM环境。

  5. 在任务步骤中,配置执行命令参数。

    1. 步骤名称:自定义名称。

    2. 执行命令:填写构建命令。

      dotnet msbuild  /p:Configuration=Debug /t:Publish
    3. 是否指定运行Shell:单击勾选,选择Shell类型powershell

    高的

  6. 配置部署任务,在下个阶段区域,添加执行命令任务类型,在面板中完成配置参数,请参考上述步骤4的参数配置。

  7. 在任务步骤中,配置执行命令参数。

    1. 步骤名称:自定义名称。

    2. 执行命令:填写Web Deploy自动部署命令。

      # input your command here
      
      $PUBLISH_BASE = (Get-Item .).FullName | Out-String
      $PUBLISH_PATH = Join-Path -Path $PUBLISH_BASE.Trim() -ChildPath "bin\Debug\net6.0\publish"
      
      & 'C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy'  -verb:sync -source:contentPath=${PUBLISH_PATH} -dest:contentPath=DemoWin,computerName=https://xx.xxx.xxx.xx:8172/MsDeploy.axd?site=DemoWin,userName=YOURUSERNAME,password=YOUPASSWORD,authtype="Basic",includeAcls="False" -allowUntrusted -disableLink:AppPoolExtension -disableLink:ContentExtension -disableLink:CertificateExtension -verbose
      说明

      命令参数介绍:

      -source:contentPath:指定需要发布的路径,这里的路径是上文中dotnet msbuild以后的output路径。

      -dest:contentPath:指定目标机器地址和站点名称,自定义站点名称是DemoWin,computerName设置A服务器公网地址、网站名称、服务器登录用户名和密码。

    3. 是否指定运行Shell:单击勾选,选择Shell类型powershell

    高的 (1)

  8. 保存并执行流水线,完成构建并运行成功的流水线任务后,在浏览器中访问IIS网站资源。高的 (3)

步骤七:添加Packages(可选)

  1. 可以使用云效Packages创建一个NuGet制品库,以管理二方制品和三方制品,在代码源中添加以下依赖库,此时msbuild不能成功运行,因为缺少依赖包。

    using Newtonsoft.Json;
  2. 请访问官方网站,下载NuGet依赖包Newtonsoft.Json。

  3. 打开云效 Packages,创建一个新的 NuGet 制品仓库。image

  4. 根据仓库指南,在本地进行配置,首先在本地设置仓库凭证,然后将Newtonsoft.Json依赖包push到仓库中。image

  5. 推送成功后,可以在 packages 中确认已添加该包。

  6. 根据仓库指南中的第三条指令,在B服务器的本地构建环境中进行该软件包的添加测试。然后执行构建指令dotnet msbuild成功运行。

  7. 在流水线中,也可以调用相关的包,需要将流水线源更换为(该仓库已添加using Newtonsoft.Json):

    gi*@atomgit.com:oauth2_xxxxxx/PackagesDemo.git
  8. 将流水线构建任务进行扩展。

    dotnet nuget add source http://yunxiao-poc.devops.aliyuncs.com:80/packages/02e873bb-xxxx-xxxx-xxxx-ec2298c5385d/nuget/repo-hzaul/index.json -n repo-hzaul -u "xxxxxxxxxxx" -p "xxxxxxxxx"
    
    dotnet add package Newtonsoft.Json  --source http://yunxiao-poc.devops.aliyuncs.com:80/packages/02e873bb-xxxx-xxxx-xxxx-ec2298c5385d/nuget/repo-hzaul/index.json
    
    dotnet msbuild  /p:Configuration=Debug /t:Publish
  9. 保存后运行,流水线就可以正常调用packages。