【问题标题】:YAML IIS web deploy deployment groupYAML IIS web 部署部署组
【发布时间】:2019-11-20 12:20:56
【问题描述】:

我正在按照IIS Web App Deploy task 上的文档学习 IIS Web 部署管道的教程

如果您看到参数列表,似乎没有任何部署组参数。因此,我如何知道/控制部署结果在哪个服务器上?

- task: IISWebAppDeploymentOnMachineGroup@0
  inputs:
    webSiteName: 
    virtualApplication: # Optional
    package: '$(System.DefaultWorkingDirectory)\**\*.zip' 
    setParametersFile: # Optional
    removeAdditionalFilesFlag: false # Optional
    excludeFilesFromAppDataFlag: false # Optional
    takeAppOfflineFlag: false # Optional
    additionalArguments: # Optional
    xmlTransformation: # Optional
    xmlVariableSubstitution: # Optional
    jSONFiles: # Optional

我希望它按照下面的屏幕截图部署到我的“开发”组。如果 YAML 无法部署到部署组,默认部署位置在哪里(即哪台计算机?)

假设我要部署到我的 PC 上,如何将部署引导到我的 localbox 并将其放在 C:/publish 下?

【问题讨论】:

    标签: azure azure-devops azure-pipelines


    【解决方案1】:

    截至 2020 年 6 月,基于 YAML 的多阶段管道不支持部署组。但是,基于 YAML 的管道有一个替代方案:环境。

    您可以在 Azure Pipelines > Environments 下手动创建环境。创建环境后,您可以在其下方添加资源。目前只支持两种类型的资源:Kubernetes 和虚拟机。虚拟机资源类型有点误导:它可以是虚拟机,但也可以是本地物理服务器。如果要部署到 IIS,则需要创建虚拟机资源。

    在环境下创建虚拟机资源非常类似于将目标添加到部署组:当您将虚拟机资源添加到环境时,它将生成一个 PowerShell 脚本,您将其复制到目标服务器并在那里运行行政人员。运行该脚本将在目标服务器上创建一个自托管代理,并将该代理注册为环境下的资源。

    此过程几乎与将目标添加到部署组的过程相同。

    在 YAML 文件中指定部署作业下的环境。仅通过名称指定环境是不够的。您还必须指定环境的资源类型以及名称。

    这是我用于构建和部署阶段的 YAML:

    trigger:
    - master
    
    stages:
    - stage: 'Build'
      displayName: 'Build the web application'
      
      jobs:
      - job: 'Build'
        displayName: 'Build job'
        
        pool:
          vmImage: 'windows-latest'
        
        variables:
          solution: '**/*.sln'
          buildPlatform: 'Any CPU'
          buildConfiguration: 'Release'
        
        steps:
        - task: NuGetToolInstaller@1
        
        - task: NuGetCommand@2
          inputs:
            restoreSolution: '$(solution)'
        
        - task: VSBuild@1
          inputs:
            solution: '$(solution)'
            msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactStagingDirectory)"'
            platform: '$(buildPlatform)'
            configuration: '$(buildConfiguration)'
        
        - task: VSTest@2
          inputs:
            platform: '$(buildPlatform)'
            configuration: '$(buildConfiguration)'
            
        - task: PublishBuildArtifacts@1
          inputs:
            PathtoPublish: '$(Build.ArtifactStagingDirectory)'
            ArtifactName: 'drop'
            publishLocation: 'Container'
    
    - stage: 'Deploy'
      displayName: 'Deploy the web application'
      dependsOn: Build
      jobs:
      - deployment: 'DeployToDev'
        displayName: 'Deploy the web application to dev environment'
        variables:
          Parameters.IISDeploymentType: 'IISWebsite'
          Parameters.ActionIISWebsite: 'CreateOrUpdateWebsite'
          Parameters.WebsiteName: 'Default Web Site'
          Parameters.WebsitePhysicalPath: '%SystemDrive%\inetpub\wwwroot\AspNetDemo'
          Parameters.AddBinding: false
          Parameters.VirtualPathForApplication: '/AspNetDemo'
          Parameters.AppPoolName: ''
          Parameters.VirtualApplication: 'AspNetDemo'
          Parameters.Package: '$(Pipeline.Workspace)\drop\*.zip'
          Parameters.RemoveAdditionalFilesFlag: true
          Parameters.TakeAppOfflineFlag: true
          Parameters.XmlTransformation: true
          Parameters.XmlVariableSubstitution: true
        environment:
          name: Dev
          resourceType: VirtualMachine
        strategy:
          runOnce:
            deploy:
              steps:
              - download: current
                artifact: drop
                
              - task: IISWebAppManagementOnMachineGroup@0
                displayName: 'IIS Web App Manage'
                inputs:
                  IISDeploymentType: '$(Parameters.IISDeploymentType)'
                  ActionIISWebsite: '$(Parameters.ActionIISWebsite)'
                  WebsiteName: '$(Parameters.WebsiteName)'
                  WebsitePhysicalPath: '$(Parameters.WebsitePhysicalPath)'
                  AddBinding: $(Parameters.AddBinding)
                  ParentWebsiteNameForVD: '$(Parameters.WebsiteName)'
                  VirtualPathForVD: '$(Parameters.VirtualPathForApplication)'
                  ParentWebsiteNameForApplication: '$(Parameters.WebsiteName)'
                  VirtualPathForApplication: '$(Parameters.VirtualPathForApplication)'
                  AppPoolName: '$(Parameters.AppPoolName)'
    
              - task: IISWebAppDeploymentOnMachineGroup@0
                displayName: 'IIS Web App Deploy'
                inputs:
                  WebSiteName: '$(Parameters.WebsiteName)'
                  VirtualApplication: '$(Parameters.VirtualApplication)'
                  Package: '$(Parameters.Package)'
                  RemoveAdditionalFilesFlag: $(Parameters.RemoveAdditionalFilesFlag)
                  TakeAppOfflineFlag: $(Parameters.TakeAppOfflineFlag)
                  XmlTransformation: $(Parameters.XmlTransformation)
                  XmlVariableSubstitution: $(Parameters.XmlVariableSubstitution)
    

    注意部署阶段的环境信息,指定名称(Dev)和resourceType(VirtualMachine):

    environment:
      name: Dev
      resourceType: VirtualMachine
    

    【讨论】:

    • 嗨,西蒙,您有机会分享您的 yaml 配置的构建阶段吗?我正在努力弄清楚如何将 Build 阶段的输出(构建的工件)链接到 Deploy 阶段的输入。
    • 嗨,肖恩。我已经编辑了答案以包括构建阶段。重要的是PublishBuildArtifacts@1 任务。这会将构建工件保存到名称为“drop”的管道存储区域。然后,在部署阶段,第一步是下载当前版本的“drop”工件。当我第一次开始使用 Azure DevOps 时,我认为管道就像 shell 脚本中的管道:一个阶段的输出可以馈送到下一个阶段。但是使用 Azure DevOps,每个阶段都是孤立的。要将某些内容传递到另一个阶段,您需要发布它,然后在下一个阶段下载它。
    • 有用,但如果没有所有变量,可读性会更好。
    【解决方案2】:

    YAML does not support 部署组。如果要使用部署组,则不能使用 YAML。

    【讨论】:

    • 如果 YAML 无法部署到部署组,默认部署位置在哪里(即哪台计算机?)假设我要部署到我的 PC 上,我如何指导部署去到我的 localbox 并将其放在 C:/publish 下?
    • 部署组之外的版本从代理池运行 代理。这通常是一台机器或一组机器,专门用于运行构建/发布的活动。工件在代理机器上暂存,您必须在发布过程中添加活动以将文件复制到目标部署机器并运行您在这些机器上编写的任何其他部署脚本。这是过程中的额外“跳跃”。我提供的链接还有一些(IMO hacky)解决方法,用于在 YAML 中模拟部署组。
    • 现在有一个名为 Environments 的东西,您可以从 YAML 定位它。
    【解决方案3】:

    Daniell 是对的,目前 YAML 似乎无法发布到部署组解决方法如下:

    在构建中添加以下代码:

    • 任务:PublishPipelineArtifact@1 输入: targetPath: '$(Pipeline.Workspace)' 发布位置:'管道'

    • 任务:PublishBuildArtifacts@1 输入: PathtoPublish: '$(Build.ArtifactStagingDirectory)' ArtifactName: '掉落' 发布位置:'容器'

    • 任务:ArchiveFiles@2 输入: rootFolderOrFile: '$(Build.BinariesDirectory)' 包括根文件夹:真 存档类型:'zip' archiveFile: '$(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip' replaceExistingArchive: true

    然后您可以转到发布,使用 iis web deploy,确保在第 1 步中使用了正确的工件并选择您的包文件夹。您应该能够看到您构建的工件。

    【讨论】:

      猜你喜欢
      • 2015-08-18
      • 2013-12-02
      • 1970-01-01
      • 2016-12-06
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多