使用策略不适用于 AzureRmWebAppDeployment@4

using strategy does not work for AzureRmWebAppDeployment@4

我开始使用策略 runonce yaml 架构,因此我可以将环境标签添加到我的发布中并添加批准步骤。 https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=azure-devops&tabs=schema

但是这样做 AzureRmWebAppDeployment@4 步以下面的格式部署整个文件

/site/wwwroot/mywebApi/Content/D_C/a/1/s/src/mywebApi/obj/Release/Package/PackageTmp/

而不是将包解压到 /site/wwwroot/mywebApi/

这曾经在我不使用策略时有效

这曾经有效


jobs:
  - job: Deploy
    variables:
      vmImage: 'windows-latest'   
    pool:
      vmImage: $(vmImage)  
    displayName: 'Deploy ${{ parameters.project }} ${{ parameters.envName }}'         
    continueOnError: "false"
    steps:
    - task: DownloadBuildArtifacts@0
      inputs:
        buildType: 'current'
        downloadType: 'single'
        artifactName: '${{ parameters.project }}${{ parameters.envName }}'
        downloadPath: '$(build.artifactStagingDirectory)'
    - task: AzureRmWebAppDeployment@4
      inputs:
        ConnectionType: 'AzureRM'
        azureSubscription: '****Azure'
        appType: 'webApp'
        WebAppName: '${{ parameters.webAppName }}'
        deployToSlotOrASE: true
        ResourceGroupName: '****'
        SlotName: '${{ parameters.slotName }}'
        VirtualApplication: '${{ parameters.virtualApplication }}'
        packageForLinux: '$(build.artifactStagingDirectory)/**/*.zip'

这不起作用,但这是我想要使用环境标记发布的内容

jobs:
  # track deployments on the environment
- deployment: DeployWeb
  displayName: deploy paystub Web App 
  environment: ${{ parameters.envName }}  
  variables:
    vmImage: 'windows-latest'   
  pool:
    vmImage: $(vmImage)  
  continueOnError: "false"
  strategy:
    runOnce:
      deploy:
        steps:
        - task: DownloadBuildArtifacts@0
          inputs:
            buildType: 'current'
            downloadType: 'single'
            artifactName: '${{ parameters.project }}${{ parameters.envName }}'
            downloadPath: '$(build.artifactStagingDirectory)'
        - task: AzureRmWebAppDeployment@4
          inputs:
            ConnectionType: 'AzureRM'
            azureSubscription: '***Azure'
            appType: 'webApp'
            WebAppName: '${{ parameters.webAppName }}'
            deployToSlotOrASE: true
            ResourceGroupName: '*****'
            SlotName: '${{ parameters.slotName }}'
            VirtualApplication: '${{ parameters.virtualApplication }}'
            packageForLinux: '$(build.artifactStagingDirectory)/**/*.zip'

我希望新步骤也将代码部署到 这个文件夹 打包到 /site/wwwroot/mywebApi/

而不是做一些 kudu 复制到

/site/wwwroot/mywebApi/Content/D_C/a/1/s/src/mywebApi/obj/Release/Package/PackageTmp/

我能够重现相同的场景。不幸的是,我没有找到通过配置任务 AzureRmWebAppDeployment 来修复它的方法。该任务似乎自动使用 kudu 将文件复制到 Azure App 服务,而 msdeploy 用于在非策略管道中部署文件。您可以报告此问题 here

我通过更改 vsbuild 任务的 msbuild 参数并添加 zip 存档任务找到了解决方法。检查以下内容:

使用 /t: publish 将构建发布到 $(build.artifactstagingdirectory)\publish 文件夹,以便在 ArchiveFiles 任务中压缩。

- task: VSBuild@1
      displayName: 'Build solution **\*.sln'
      inputs:
        msbuildArgs: '/t:publish /p:outputpath="$(build.artifactstagingdirectory)\"'
        platform: '$(BuildPlatform)'
        configuration: '$(BuildConfiguration)'
        clean: true
        restoreNugetPackages: true

使用 archiveFiles 任务压缩上述步骤中 \publish 文件夹中的所有文件。

 - task: ArchiveFiles@2
      inputs:
        rootFolderOrFile: '$(Build.ArtifactStagingDirectory)\publish\*'
        includeRootFolder: true
        archiveType: 'zip'
        archiveFile: '$(Build.ArtifactStagingDirectory)/package/$(Build.BuildId).zip'
        replaceExistingArchive: true

使用 PublishBuildArtifacts 任务发布上述步骤

创建的 zip 文件
 - task: PublishBuildArtifacts@1
      displayName: 'Publish Artifact: drop'
      inputs:
        pathtoPublish: '$(Build.ArtifactStagingDirectory)\package\' 
        artifactName: 'strategy' 

通过上述步骤,在 Deploy 阶段下载的 zip 文件将只包含已部署的代码。

希望以上步骤对您有所帮助。