【问题标题】:How to copy specific folders/files to artifact?如何将特定文件夹/文件复制到工件?
【发布时间】:2021-04-01 20:17:16
【问题描述】:

我有以下构建管道:

pool:
  name: Azure Pipelines
  demands:
  - npm
  - msbuild

steps:
- task: Npm@1
  displayName: 'npm install'
  inputs:
    workingDir: Project123/Angular
    verbose: false
    
steps:
- task: Npm@1
  displayName: 'npm custom: angular build'
  inputs:
    command: custom
    workingDir: Project123/Angular
    verbose: false
    customCommand: 'run-script build --prod --extractCss'

steps:
- task: NuGetCommand@2
  displayName: 'NuGet restore'
  
steps:
- task: MSBuild@1
  displayName: '.Net build'
  inputs:
    solution: 'Project123/*.csproj'
    msbuildArchitecture: x64
    configuration: Release
    msbuildArguments: '/p:OutputPath=$(Build.ArtifactStagingDirectory)'

- task: CopyFiles@2
  displayName: 'Copy Files to: $(Build.ArtifactStagingDirectory)'
  inputs:
    SourceFolder: Project123/Bundles
    TargetFolder: '$(Build.ArtifactStagingDirectory)'

- task: PublishBuildArtifacts@1
  displayName: 'Publish Artifact: Release'
  inputs:
    ArtifactName: Release

当我们从 VS 手动构建项目时,这是我们部署的(预期的)工件:

但是,我使用的 YAML 会生成此工件:

我如何完成预期的工件?

我真的很惊讶 AngularOutput 被复制到工件的根目录中,而不是 Bundles...我在复制任务中指定复制 Bundles 文件夹,其中将包含 AngularOutput...

【问题讨论】:

    标签: azure-devops azure-pipelines azure-pipelines-tasks


    【解决方案1】:

    由于我不知道 .csproj 的配置,所以根据截图提供一个解决方法。

    在这个工件中不需要这个 Angular 文件夹

    工件中不需要这些 Web.Debug 和 Web.Release

    通过以下脚本添加任务电源外壳并删除文件夹和文件

    #Delete Angular folder and files
    - task: PowerShell@2
      inputs:
        targetType: 'inline'
        script: |
          Remove-Item ''$(Build.ArtifactStagingDirectory)/_PublishedWebsites/Project123/Angular''      
          Remove-Item ''$(Build.ArtifactStagingDirectory)/_PublishedWebsites/Project123/Web.Debug.configure''    
          Remove-Item ''$(Build.ArtifactStagingDirectory)/_PublishedWebsites/Project123/Web.Release.configure''
    
    

    这里不需要那些 dll、.pdb、.xml 和 .configure 文件。

    这里需要有一个由 Angular 构建任务生成的“Bundles”目录

    勾选这个Copy files任务,这些文件在文件夹Project123/Bundles中吧?

    - task: CopyFiles@2
      displayName: 'Copy Files to: $(Build.ArtifactStagingDirectory)'
      inputs:
        SourceFolder: Project123/Bundles
        TargetFolder: '$(Build.ArtifactStagingDirectory)'
    

    我们需要改变复制文件任务如下:

    - task: CopyFiles@2
      displayName: 'Copy Files to: $(Build.ArtifactStagingDirectory)'
      inputs:
        SourceFolder: Project123/Bundles
        TargetFolder: '$(Build.ArtifactStagingDirectory)/_PublishedWebsites/Project123/Bundles'
    

    它将这些文件保存在文件夹 Bundles 而不是根目录中。

    这个 AngularOutput 文件夹需要位于上面 'Project123' 文件夹内的 'Bundles' 目录下

    我们可以将文件夹复制到 project123 文件夹,然后发布工件。

    - task: CopyFiles@2
      inputs:
        SourceFolder: '$(Build.ArtifactStagingDirectory)/AngularOutput'
        Contents: '**'
        TargetFolder: '$(Build.ArtifactStagingDirectory)/_PublishedWebsites/Project123/AngularOutput'
    

    您可以在 YAML 构建下运行并检查结果。

    pool:
      name: Azure Pipelines
      demands:
      - npm
      - msbuild
    
    steps:
    - task: Npm@1
      displayName: 'npm install'
      inputs:
        workingDir: Project123/Angular
        verbose: false
        
    - task: Npm@1
      displayName: 'npm custom: angular build'
      inputs:
        command: custom
        workingDir: Project123/Angular
        verbose: false
        customCommand: 'run-script build --prod --extractCss'
    
    - task: NuGetCommand@2
      displayName: 'NuGet restore'
      
    - task: MSBuild@1
      displayName: '.Net build'
      inputs:
        solution: 'Project123/*.csproj'
        msbuildArchitecture: x64
        configuration: Release
        msbuildArguments: '/p:OutputPath=$(Build.ArtifactStagingDirectory)'
    
    - task: CopyFiles@2
      displayName: 'Copy Files to: $(Build.ArtifactStagingDirectory)'
      inputs:
        SourceFolder: Project123/Bundles
        TargetFolder: '$(Build.ArtifactStagingDirectory)/_PublishedWebsites/Project123/Bundles'
    
    #Delete Angular folder and files
    - task: PowerShell@2
      inputs:
        targetType: 'inline'
        script: |
          Remove-Item ''$(Build.ArtifactStagingDirectory)/_PublishedWebsites/Project123/Angular''      
          Remove-Item ''$(Build.ArtifactStagingDirectory)/_PublishedWebsites/Project123/Web.Debug.configure''    
          Remove-Item ''$(Build.ArtifactStagingDirectory)/_PublishedWebsites/Project123/Web.Release.configure''
    
    - task: CopyFiles@2
      inputs:
        SourceFolder: '$(Build.ArtifactStagingDirectory)/AngularOutput'
        Contents: '**'
        TargetFolder: '$(Build.ArtifactStagingDirectory)/_PublishedWebsites/Project123/AngularOutput'
    
    - task: PublishBuildArtifacts@1
      displayName: 'Publish Artifact: Release'
      inputs:
        ArtifactName: Release
    

    更新1

    如果问题是删除文件夹和文件,请更新power shell脚本如下再试一次。

    #Delete Angular folder and files
    - task: PowerShell@2
      inputs:
        targetType: 'inline'
        script: |
          Remove-Item -Path $(Build.ArtifactStagingDirectory)/_PublishedWebsites/Project123/Angular -Recurse -Force     
          Remove-Item -Path $(Build.ArtifactStagingDirectory)/_PublishedWebsites/Project123/Web.Debug.configure -Recurse -Force  
          Remove-Item -Path $(Build.ArtifactStagingDirectory)/_PublishedWebsites/Project123/Web.Release.configure -Recurse -Force
    

    以及测试结果:

    【讨论】:

    • 哦,powershell?有趣..但这不适用于 ubuntu 代理,对吗? .我认为我们会在复制任务中使用否定通配符来删除它们作为一种解决方法
    • 我在windows代理、ubuntu代理上测试过,也许我们需要通过bash cmd删除文件和文件夹?
    • 顺便问一下,你介意在这里分享错误日志吗?或者在这里分享不工作的任务步骤,谢谢。
    • 我在想而不是为不同的代理使用 bash 命令,如果这可以在复制任务中使用负通配符来完成,那就太棒了。至于日志,除非我们进入聊天室,否则不允许我在 SO 上的帖子/评论中上传
    • 嗨@Cataster,我已经更新了答案,请检查更新1。现在,我们似乎无法创建聊天室...
    猜你喜欢
    • 2018-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 2018-12-27
    相关资源
    最近更新 更多