将我的构建部署到 azure 时(我使用 devops 管道,但我也尝试直接通过 visual studio 进行部署)我一直找不到资源 404

When deploying my build to azure (i use devops pipeline but i also tried to deploy via visual studio directly) i keep getting resource not found 404

当我尝试将我的 .net core 2.2 webapi 发布到我的 azure 应用服务时(通过使用 Azure 应用服务部署的 azure devops 或通过 visual studio 发布方法)我不断得到: "The resource you are looking for has been removed, had its name changed, or is temporarily unavailable."

但是当我直接使用 visual studio 发布它时(没有包或 zip 配置)它有效。 (但我们不能继续这样做,因为我们需要它在 azure devops 管道上工作)。

我尝试使用 dotnet build/publish 和 vsbuild 以不同方式构建项目。我还尝试使用不同的发布方法(压缩、打包、网络部署)。

我查看了生成的 xml 文件(deploy.cmd、deploy-readme、参数、setparametersa 和 sourcemanifest)来检查是否存在一些错误的命名问题或文件夹结构是否不正确但是一切都正确匹配。我的项目所在的 zip 文件也与所有生成的 xml 文件(root)位于同一位置。

奇怪的是,它之前是工作的,我们正在使用 terraform 来生成 azure 资源。所以我们丢弃了我们手动制作的资源并使用 terraform 重新制作它们然后我们得到了错误。我们没有对管道进行任何更改。

来自管道的 yaml 构建代码:

trigger:
- master

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:CreatePackageOnPublish=true /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:DesktopBuildPackageLocation="$(build.artifactStagingDirectory)\{redactedprojectname}.zip" /p:DeployIisAppPath="Default Web Site"'
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'


- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)'
    ArtifactName: 'drop'
    publishLocation: 'Container'

应用服务部分的 Terraform 脚本:

# Create App Service Plan
resource "azurerm_app_service_plan" "asp" {
  name                = "${local.aspName}"
  location            = "${azurerm_resource_group.rg.location}"
  resource_group_name = "${azurerm_resource_group.rg.name}"
  tags                = "${var.tags}"

  sku {
      tier = "${var.aspSku.tier}"
      size = "${var.aspSku.size}"
    }
}

# Create App Service
resource "azurerm_app_service" "as" {
  name                = "${local.apiName}"
  location            = "${azurerm_resource_group.rg.location}"
  resource_group_name = "${azurerm_resource_group.rg.name}"
  app_service_plan_id = "${azurerm_app_service_plan.asp.id}"
  tags                = "${var.tags}"

  https_only          = true

  site_config {
    dotnet_framework_version = "v4.0"
    always_on = true
  }

  app_settings = {
    "APPINSIGHTS_INSTRUMENTATIONKEY" = "${azurerm_application_insights.ai.instrumentation_key}"
    "ASPNETCORE_ENVIRONMENT" = "${var.environment}"
  }
}

# --- Output section --
output "appServiceName" {
  value = azurerm_app_service.as.name
}

Azure Devops 中的 Terraform 步骤:

use terraform 0.12.11
Terraform init
Terraform plan
Terraform apply
Terraform output get appservice name

在此之后我们进行 Azure 应用服务部署

yaml 代码应用服务部署:

variables:
  environment: 'prd'

steps:
- task: AzureRmWebAppDeployment@4
  displayName: 'Azure App Service Deploy: $(appServiceName)'
  inputs:
    azureSubscription: '{redactedprojectname}'
    WebAppName: '$(appServiceName)'
    packageForLinux: '$(System.DefaultWorkingDirectory)/{redactedprojectname}/drop'
    AppSettings: ASPNETCORE_ENVIRONMENT "$(environment)"'
    enableCustomDeployment: true
    DeploymentType: zipDeploy
    TakeAppOfflineFlag: false

我希望在之前有一个可行的解决方案之后,删除资源并重新部署让 terraform 在不修改管道的情况下从头开始重新创建资源,只会提供一个可行的解决方案

我们最终通过使用带文件系统的 msbuild 而不是包来解决构建问题 这是遇到相同问题的任何人的 yaml 代码:


trigger:
- master

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:Configuration=Release /p:WebPublishMethod=FileSystem  /p:SkipInvalidConfigurations=true /p:DeployDefaultTarget=WebPublish /p:DeleteExistingFiles=True  /p:publishUrl="$(build.artifactStagingDirectory)\YourProjectNameFolder" /p:DeployIisAppPath="Default Web Site"'
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'


- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)'
    ArtifactName: 'drop'
    publishLocation: 'Container'

您只需更改 msbuildArgs 属性.

文件系统的 msbuild 参数基于 https://www.joe-stevens.com/2018/12/14/publish-to-file-system-with-msbuild/