【问题标题】:YAML CI is flattening file structureYAML CI 正在扁平化文件结构
【发布时间】:2020-06-30 22:45:29
【问题描述】:

我在 GitHub 中托管我的存储库,并将 Azure DevOps 用于 CI/CD 管道。在使用 GUI CI/CD 屏幕之前,我已经完成了这项工作,没有任何问题。

我注意到的第一件事是使用 YAML 的构建过程似乎使文件结构扁平化。我还在放置文件夹中看到了一些 XML 和 TXT 文件,而不是实际的 JSON 文件。

所以,在放置文件夹中,我看到的是 drop/TestYAML.Parameters.xml,而不是 drop/AzureResourceGroup/azuredeploy.parameters-dev.json

构建和发布任务:

stages:
- stage: Build
  jobs: 
  - job: Build

    pool:
      vmImage: 'windows-2019'

    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)\\" /p:SourceLinkCreate=true'
        platform: '$(buildPlatform)'
        configuration: '$(buildConfiguration)'
    - task: PublishBuildArtifacts@1
      inputs: 
        pathToPublish: '$(Build.ArtifactStagingDirectory)' 
        artifactName: 'drop' 
        publishLocation: 'container' # Options: container, filePath
        #targetPath: # Required when publishLocation == FilePath
        #parallel: false # Optional
        #parallelCount: # Optional
        #fileCopyOptions: #Optional

已编辑以显示包内容

在我下载并解压缩文件后,我看到的就是这个。来自两个不同项目的文件被放在同一个文件夹下:

工件中立即可用的文件:

VS 构建日志:

【问题讨论】:

  • 显然这不是正确的行为。但是您没有分享一些有用的信息,我们无法提供任何有用的信息。根据您的 YAML,放置文件夹应包含文件 TheProjectName.zipTheProjectName.SetParameters.xml 等。这个文件azuredeploy.parameters-dev.json 是否包含在您生成的包中?你会在你的 repo 中分享你的 VSbuild 日志和文件目录结构关于文件azuredeploy.parameters-dev.json 吗?
  • @LeoLiu-MSFT 我添加了屏幕截图以显示 drop 和 package 内容。 VSBuild 日志太长,无法粘贴到正文中,我没有看到附加单独日志文件的方法。
  • 这个问题我已经给出了答案,请检查它是否对你有帮助。

标签: azure-devops yaml


【解决方案1】:

YAML CI 正在扁平化文件结构

这是预期的行为。当我们将ASP.NET Core 项目作为包发布时,MSBuild 将在包位置创建以下文件:

因为指定了“AlwaysCreate”,并且“AlwaysCreate”是 Visual Studio 构建环境设置的一部分,并且是 Microsoft.CppBuild.targets XML 文件的一部分:

因此,文件TestYAML.Parameters.xml 在生成时是预期的,而不是替换文件AzureResourceGroup/azuredeploy.parameters-dev.json

此外,如果您有任何类似AzureResourceGroup/azuredeploy.parameters-dev.json 的文件添加到项目中,您可以检查是否添加。如果您想将此 json 文件添加到发布中,您可以将该 json 文件的 Build Action 设置为 Content,它将包含在 .zip 文件中:

希望这会有所帮助。

【讨论】:

  • 啊,这就是区别。它以不同的方式对待 .NET Framework 和 .NET Core。我们有使用 Azure 数据库、函数应用程序和服务总线队列的项目,都使用 ARM 模板来设置它们,但由于某些原因,主要项目仍在 .NET Framework 中。
【解决方案2】:

我遇到的主要问题是 azuredeploy JSON 文件不在部署任务使用的构建任务之后的放置文件夹中。我将不得不使用 Copy Files 任务来获取文件。

- task: CopyFiles@2
      displayName: 'Copy Files to: $(build.ArtifactStagingDirectory)/AzureResourceGroup'
      inputs:
        SourceFolder: TestYAML\AzureResourceGroup
        Contents: '*.json'
        TargetFolder: '$(build.ArtifactStagingDirectory)/AzureResourceGroup'

虽然这行得通,但我不明白微软为什么不自动包含这些文件。我不知道区别是 YAML 还是 .NET Core 与 .NET Framework,但我在其他具有 azuredeploy JSON 文件的项目上使用 GUI 设置的构建管道包括此步骤作为构建任务的一部分。

【讨论】:

    猜你喜欢
    • 2022-09-26
    • 1970-01-01
    • 2015-10-02
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 2017-04-17
    • 2017-04-22
    • 1970-01-01
    相关资源
    最近更新 更多