【问题标题】:Adding additional files to Azure Build Pipeline向 Azure Build Pipeline 添加其他文件
【发布时间】:2020-11-20 14:10:18
【问题描述】:

我有一个 Azure DevOps Pipeline,它从存储库中提取并构建一个 Visual Studio Web 项目。然后将其发布到应用服务。

我有几个不包含在存储库(或 VS 项目)中的敏感配置文件,它们在 Azure DevOps 系统中存储为“安全文件”。

我需要将这些文件包含在要发布的包的“配置/安全”文件夹中(在 zip 文件中)。我可以下载它们,但无论我尝试什么,我都无法将这些文件包含在部署 zip 文件中。它们只出现在“drop”文件系统中,因此我似乎无法将它们部署到 Web App。

有人知道我该怎么做吗?在此先感谢下面的管道 YAML:

trigger:
- main

pool:
  vmImage: 'windows-latest'

variables:
  solution: '**/*.sln'
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Release'

steps:
- task: NuGetToolInstaller@1

- task: NuGetCommand@2
  inputs:
    restoreSolution: '$(solution)'

- task: DownloadSecureFile@1
  inputs:
    secureFile: 'AppSettings.secret.config'

- task: DownloadSecureFile@1
  inputs:
    secureFile: 'cache.secret.config'

- task: DownloadSecureFile@1
  inputs:
    secureFile: 'security.secret.config'

- task: DownloadSecureFile@1
  inputs:
    secureFile: 'Smtp.secret.config'

- task: CopyFiles@2
  inputs:
    SourceFolder: '$(Agent.TempDirectory)'
    Contents: |
      AppSettings.secret.config
      cache.secret.config
      security.secret.config
      Smtp.secret.config
    TargetFolder: '$(Build.ArtifactStagingDirectory)/config/secret'
    OverWrite: true
    flattenFolders: true

- task: VSBuild@1
  inputs:
    solution: '$(solution)'
    msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(Build.ArtifactStagingDirectory)\\"'
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'

- task: VSTest@2
  inputs:
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'

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

【问题讨论】:

    标签: azure azure-devops azure-pipelines azure-pipelines-release-pipeline


    【解决方案1】:

    我需要将这些文件包含在要发布的包的“Config/Secure”文件夹中(在 zip 文件中)

    我们无法将新文件直接添加到 zip 文件中。作为一种解决方法,我们可以提取文件夹 $(System.DefaultWorkingDirectory),将安全文件复制到 $(Build.ArtifactStagingDirectory)/PrescQIPPWebApp/config/secret 并压缩文件夹 $(Build.ArtifactStagingDirectory)/PrescQIPPWebApp,然后发布工件。

    另外,由于zip文件解压后不会被删除,PrescQIPPWebApp文件夹在归档后也不会被删除,所以我们需要添加power shell任务删除zip文件和PrescQIPPWebApp文件夹

    我已经更新了你的 YAML 构建定义,你可以试试并在这里分享结果。

    trigger:
    - main
    
    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:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(Build.ArtifactStagingDirectory)\\"'
        platform: '$(buildPlatform)'
        configuration: '$(buildConfiguration)'
    
    #Extract PrescQIPPWebApp.zip file to $(Build.ArtifactStagingDirectory)/PrescQIPPWebApp folder
    - task: ExtractFiles@1
      inputs:
        archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/PrescQIPPWebApp.zip'
        destinationFolder: '$(Build.ArtifactStagingDirectory)/PrescQIPPWebApp'
        cleanDestinationFolder: false
        overwriteExistingFiles: false
    
    #Delete PrescQIPPWebApp.zip file
    - task: PowerShell@2
      inputs:
        targetType: 'inline'
        script: 'Remove-Item ''$(Build.ArtifactStagingDirectory)/PrescQIPPWebApp.zip'''
    
    - task: DownloadSecureFile@1
      inputs:
        secureFile: 'AppSettings.secret.config'
    
    - task: DownloadSecureFile@1
      inputs:
        secureFile: 'cache.secret.config'
    
    - task: DownloadSecureFile@1
      inputs:
        secureFile: 'security.secret.config'
    
    - task: DownloadSecureFile@1
      inputs:
        secureFile: 'Smtp.secret.config'
    
    - task: CopyFiles@2
      inputs:
        SourceFolder: '$(Agent.TempDirectory)'
        Contents: |
          AppSettings.secret.config
          cache.secret.config
          security.secret.config
          Smtp.secret.config
        TargetFolder: '$(Build.ArtifactStagingDirectory)/PrescQIPPWebApp/config/secret'
        OverWrite: true
        flattenFolders: true
    
    #Archive file to PrescQIPPWebApp.zip
    - task: ArchiveFiles@2
      inputs:
        rootFolderOrFile: '$(Build.ArtifactStagingDirectory)/PrescQIPPWebApp'
        includeRootFolder: true
        archiveType: 'zip'
        archiveFile: '$(Build.ArtifactStagingDirectory)/PrescQIPPWebApp.zip'
        replaceExistingArchive: true
    
    - task: VSTest@2
      inputs:
        platform: '$(buildPlatform)'
        configuration: '$(buildConfiguration)'
    
    #Delete PrescQIPPWebApp folder
    - task: PowerShell@2
      inputs:
        targetType: 'inline'
        script: 'Remove-Item -path ''$(Build.ArtifactStagingDirectory)/PrescQIPPWebApp'' -Recurse -Force -EA SilentlyContinue -Verbose'
    
    - task: PublishBuildArtifacts@1
      inputs:
        PathtoPublish: '$(Build.ArtifactStagingDirectory)'
        ArtifactName: 'drop'
        publishLocation: 'Container'
    

    【讨论】:

    • 谢谢!我不得不修改“ArchiveFiles@2”任务的路径,因为它将文件放在 zip 的根目录中,并将“includeRootFolder”更改为 false。但它有效,再次感谢 - 非常感谢。
    【解决方案2】:

    如果您的项目配置为使用它们,请将它们移动到源代码管理文件夹而不是 ArtifactStagingDirectory

    - task: CopyFiles@2
      inputs:
        SourceFolder: '$(Agent.TempDirectory)'
        Contents: |
          AppSettings.secret.config
          cache.secret.config
          security.secret.config
          Smtp.secret.config
        TargetFolder: '$(Build.ArtifactStagingDirectory)/config/secret'
        OverWrite: true
        flattenFolders: true
    

    所以这是错误的,因为您将其直接移动到您发布的文件夹中,而 VSBuild 根本不会触及该文件夹。

    如果您在 repo 的根目录中配置文件夹(并且您在这里只使用一个 repo),这应该将您的文件移动到解决方案中。

    - task: CopyFiles@2
      inputs:
        SourceFolder: '$(Agent.TempDirectory)'
        Contents: |
          AppSettings.secret.config
          cache.secret.config
          security.secret.config
          Smtp.secret.config
        TargetFolder: '$(System.DefaultWorkingDirectory)/config/secret'
        OverWrite: true
        flattenFolders: true
    

    但请注意,不推荐发布秘密文件(即使作为工件)。请考虑在部署之前下载它们并放置在正确的位置。

    【讨论】:

    • 谢谢 Krzysztof,我已将目标文件夹修改为使用 System.DefaultWorkingDirectory,但文件未出现在 zip 中。您提到“如果您的项目配置为使用它们”-您能否详细说明一下,因为我可能遗漏了一些东西?再次感谢 - 非常感谢您的帮助。
    猜你喜欢
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    相关资源
    最近更新 更多