首页 > 解决方案 > 如何使用 Azure 管道发布 Web 应用程序?

问题描述

在 Visual Studio (2019) 中,我可以构建我的应用程序并在本地发布它。然后我可以手动将文件复制到我的服务器,一切都很好。

这是使用手动压缩/解压缩方法的文件列表 :) 使用手动压缩/解压缩方法的文件列表

这是使用 Azure Pipeline 方法的文件列表 :( 使用 Azure Pipeline 方法的文件列表

我对 C# Asp.Net-Mvc Core 2.2 很感兴趣,我很快就会迁移到 3.1,但我想在继续之前解决这个问题。

我正在尝试设置 Azure 管道,因为我使用 VSTS-GIT 进行源代码控制。我的 YAML 文件如下。

我的手动过程是

  1. 在 Visual Studio (2019) 中构建应用程序
  2. 在我的机器上发布本地文件夹的应用程序
  3. 压缩文件夹
  4. 将压缩包复制到 ftp 站点
  5. 在ftp上解压文件

该网站然后工作正常。我唯一不需要管道的是压缩/解压缩

管道运行良好,它将文件上传到我的服务器,但网站无法正常工作,并且上传的文件与手动方法不同。错误是HTTP Error 500.31 - Failed to load ASP.NET Core runtime,但我认为这是一个红鲱鱼,因为如果我手动上传文件,完全相同的网站可以正常工作。

我已经有一段时间了,阅读了各种各样的文章和视频,但我似乎无法让它发挥作用。我知道我做错了什么,但我不知道是什么。

我正在努力寻找正确的设置来使用 Azure Dev Ops 做同样的事情。我已广泛阅读此站点Azure Dev Ops,但似乎找不到正确的设置,有人可以帮忙吗?

trigger:
- local-1

pool:
  vmImage: 'ubuntu-latest'

variables:
  buildConfiguration: 'Release'

steps:
- script: dotnet build --configuration $(buildConfiguration)
  displayName: 'dotnet build $(buildConfiguration)'

- task: DotNetCoreCLI@2
  displayName: Publish
  inputs:
    command: publish
    publishWebProjects: True
    arguments: '--configuration $(BuildConfiguration) --output $(build.artifactstagingdirectory)'
    zipAfterPublish: false

- task: FtpUpload@2
  inputs:
    credentialsOption: 'inputs'
    serverUrl: 'ftp://ftp.xxxxxxx.com/'
    username: 'xxxxxxxxxxxxx'
    password: 'xxxxxxxxxx'
    rootDirectory: '$(Build.ArtifactStagingDirectory)'  
    filePatterns: '**'
    remoteDirectory: '/'
    clean: false
    cleanContents: false
    preservePaths: false
    trustSSL: false

标签: azure-devopsyaml

解决方案


From comparing your screenshots, I can see a lot more files and fewer folders in your DevOps Pipelines version than in your manual version. It looks like your FTP task is uploading everything without putting it in folders.

Looking at your YAML file, you have preservePaths: false in the FTP task. According to the task's documentation:

preservePaths:保留文件路径(必需)
如果选中,则在上传文件的远程目录下重新创建相对本地目录结构。否则,文件会直接上传到远程目录,而无需创建额外的子目录。
例如,假设您的源文件夹是:/home/user/source/并包含文件:foo/bar/foobar.txt,而您的远程目录是:/uploads/。如果选中,文件将上传到:/uploads/foo/bar/foobar.txt. 否则,为:/uploads/foobar.txt
默认值:false

您应该改为设置preservePaths: true,以便维护原始目录结构(例如您的.png.js文件在 中wwwroot)。

- task: FtpUpload@2
  inputs:
    credentialsOption: 'inputs'
    serverUrl: 'ftp://ftp.xxxxxxx.com/'
    username: 'xxxxxxxxxxxxx'
    password: 'xxxxxxxxxx'
    rootDirectory: '$(Build.ArtifactStagingDirectory)/s'  
    filePatterns: '**'
    remoteDirectory: '/'
    clean: false
    cleanContents: false
    preservePaths: true
    trustSSL: false

如果您不介意每次都清除 FTP 服务器,那么设置cleanContents: true可能是一个好主意,因为它可以确保您没有任何文件相互冲突。

编辑:在您进行了一些调查之后,您发现/s根目录上需要后缀,因此我已将其添加到我的答案中。


推荐阅读