Jakub Vojtašák
Jakub Vojtašák

Reputation: 47

Azure Devops - Include files/folder in artifact from another artifact

My pipeline build several projects in specific order.

I have to include some folders with files created when publishing the first project to artifacts in the second project. I tried to CopyFiles task and include files in SourcesDirectory, before Second project is published, but unfortunately copied folder is not tracked by Second project, so it's not included in Published artifact. I was thinking to copy it directly to second.zip, but don't know if it's possible. How can I get this done? Can I specify folders to include when publishing Second project?

- task: DotNetCoreCLI@2
  displayName: 'Build First project'
  inputs:
    command: 'publish'
    publishWebProjects: false
    projects: '**/First.sln'
    arguments: '--configuration $(BuildConfiguration) --output $(build.artifactstagingdirectory)\first'
    zipAfterPublish: false

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

- task: CopyFiles@2
  inputs:
    SourceFolder: '$(Build.ArtifactStagingDirectory)\first\wwwroot\_folderToCopy'
    Contents: '*'
    TargetFolder: '$(Build.SourcesDirectory)\second\TargetFolder\_folderToCopy'


- task: VSBuild@1
  displayName: Second
  inputs:
    solution: '**\Second.sln'
    vsVersion: '17.0'
    msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactStagingDirectory)\second"'
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'

- task: PublishPipelineArtifact@1
  inputs:
    targetPath: '$(Build.ArtifactStagingDirectory)\second'
    artifact: 'Second'
    publishLocation: 'pipeline'

Upvotes: 0

Views: 1550

Answers (1)

Kevin Lu-MSFT
Kevin Lu-MSFT

Reputation: 35109

From your YAML sample, when you build the second project and set the argument to package the output files, it will zip the output of second project instead of all files in the source folder.

To meet your requirement, you can extract the zip package created by VSBuild task and then you can copy the files(created by dotnet publish task) to the folder of the extracted file. Finally, you can create a new Zip package contains all related files.

Here is an example:

steps:
- task: DotNetCoreCLI@2
  displayName: 'Build First project'
  inputs:
    command: 'publish'
    publishWebProjects: false
    projects: '**/First.sln'
    arguments: '--configuration $(BuildConfiguration) --output $(build.artifactstagingdirectory)\first'
    zipAfterPublish: false

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


- task: VSBuild@1
  displayName: Second
  inputs:
    solution: '**\Second.sln'
    vsVersion: '17.0'
    msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactStagingDirectory)\second"'
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'
  
- task: ExtractFiles@1
  inputs:
    archiveFilePatterns: '$(build.artifactStagingDirectory)/second/*.zip'
    destinationFolder: '$(build.artifactStagingDirectory)/second-1'
    cleanDestinationFolder: true
    overwriteExistingFiles: false
- task: CopyFiles@2
  inputs:
    SourceFolder: '$(Build.ArtifactStagingDirectory)\first\wwwroot\_folderToCopy'
    Contents: '*'
    TargetFolder: '$(build.artifactStagingDirectory)\second-1\TargetFolder\_folderToCopy'

- task: ArchiveFiles@2
  inputs:
    rootFolderOrFile: '$(build.artifactStagingDirectory)\second-1'
    includeRootFolder: true
    archiveType: 'zip'
    archiveFile: '$(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip'
    replaceExistingArchive: true

- task: PublishPipelineArtifact@1
  inputs:
    targetPath: '$(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip'
    artifact: 'Second'
    publishLocation: 'pipeline'

Upvotes: 1

Related Questions