Azure devops 如何使用Azure管线发布web应用程序?

Azure devops 如何使用Azure管线发布web应用程序?,azure-devops,yaml,Azure Devops,Yaml,在Visual Studio(2019)中,我可以构建我的应用程序并在本地发布。然后我可以手动将文件复制到我的服务器上,一切正常 这是使用手动压缩/解压缩方法的文件列表:) 这是使用Azure管道方法的文件列表:( 我喜欢C#Asp.Net-Mvc Core 2.2,我将很快迁移到3.1,但我想在继续之前解决这个问题 我正在尝试设置Azure管道,因为我使用VSTS-GIT进行源代码管理 我的手动过程是 在Visual Studio中构建应用程序(2019年) 在我的计算机上发布本地文件夹的

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

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

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

我喜欢C#Asp.Net-Mvc Core 2.2,我将很快迁移到3.1,但我想在继续之前解决这个问题

我正在尝试设置Azure管道,因为我使用VSTS-GIT进行源代码管理

我的手动过程是

  • 在Visual Studio中构建应用程序(2019年)
  • 在我的计算机上发布本地文件夹的应用程序
  • 压缩文件夹
  • 将zip文件复制到ftp站点
  • 在ftp上解压缩文件
  • 然后这个网站就可以正常运行了。我唯一不需要的就是zip/unzip

    管道运行正常,它将文件上载到我的服务器,但网站不工作,上载的文件与手动方法不一样。错误是
    HTTP错误500.31-无法加载ASP.NET核心运行时
    ,但我认为这是一个误导,因为如果我手动上载文件,完全相同的网站工作得很好盟友

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

    我正在努力找到正确的设置来完成与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
    

    通过比较您的屏幕截图,我可以在您的DevOps Pipelines版本中看到比手动版本更多的文件和更少的文件夹。看起来您的FTP任务正在上载所有内容,而没有将其放入文件夹中

    查看YAML文件,FTP任务中有
    preservepath:false
    。根据:

    保留路径:保留文件路径(必需)
    如果选中,将在上载文件的远程目录下重新创建相对的本地目录结构。否则,文件将直接上载到远程目录,而不创建其他子目录。
    例如,假设您的源文件夹为:
    /home/user/source/
    ,包含文件:
    foo/bar/foobar.txt
    ,远程目录为:
    /uploads/
    。 如果选中,文件将上载到:
    /uploads/foo/bar/foobar.txt
    。否则,文件将上载到:
    /uploads/foobar.txt

    默认值:
    false

    您应该改为设置
    preservepath:true
    ,以便保持原始目录结构(例如
    wwwroot
    中的
    .png
    .js
    文件)

    -任务:FtpUpload@2
    投入:
    Credentials选项:“输入”
    服务器URL:'ftp://ftp.xxxxxxx.com/'
    用户名:“xxxxxxxx”
    密码:“XXXXXXXXX”
    根目录:'$(Build.ArtifactStagingDirectory)/s'
    文件模式:'**'
    remoteDirectory:“/”
    干净:假
    内容:错误
    答案:对
    trustSSL:false
    
    如果您不介意每次都清除FTP服务器,那么设置
    cleanContents:true
    可能是个好主意,因为它可以确保您不会有任何文件相互冲突


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

    这不是我自己的问题。但我猜其他人这样做的原因是您说问题的原因是azure管道FTP的结果不一致你没有提供这方面的任何信息,因此没有人知道问题出在哪里。因此,你需要以两种方式分享你不同结果的一些证据,例如屏幕截图和你想要的结果是什么?好的,我会看看在不使文章太大的情况下还能提供哪些其他信息。Sim请注意,我正在尝试在Azure管道中复制我的手动过程。我会将此添加到问题中。不要担心文章的长度,任何想要帮助你的人都会耐心阅读你的问题。你目前需要提供的是两种方法的结果之间的差异。要做到这一点,我必须列出文件cont你可以使用ents或附加zip文件,这是很多信息。这也意味着共享机密信息,因此这并不实际。我会看看我是否可以做一个屏幕截图或其他什么是的,所有这些js、png等都在
    wwwroot
    中。在上传之前,这两种情况下的目录都是完全空的。我尝试了d两者都是,这是我最后一次离开文件inI的状态。我现在正在使用
    preservepath:true
    再次运行管道。yaml处于最后一种状态,我在使用不同设置组合进行了大量尝试和错误后离开了它。在反复失败后,我变得有点暴躁。这样做很有效。它以正确的方式创建了文件但是在一个名为
    s
    的根目录下,我记得我的问题是从这里开始的,我最近才回到这里this@djack109
    s
    部分听起来很像DevOps管道中路径的最后一部分:它也在复制根目录本身。您是否使用
    ls
    等工具进行了检查方法在
    $(Build.ArtifactStagingDirectory)中没有额外的
    s
    文件夹
    ?你也可以试试。我想我无法找到那个文件夹。我该怎么做,它都在azure中。我实际上没有指定任何目录信息,我只是使用azure提供的目录变量,这是一项确定这些变量是什么的任务。这起了作用。
    “$(Build.ArtifactStagingDirectory)/s”
    直接发布到根目录。我回到azure文档并