arcade icon indicating copy to clipboard operation
arcade copied to clipboard

Job template uploads logs multiple times.

Open MichaelSimons opened this issue 5 months ago • 0 comments

When using the jobs template, the logs are being uploaded/stored multiple times.

  - template: ${{ parameters.engCommonTemplatesDir }}/jobs/jobs.yml
    parameters:
      artifacts:
        publish:
          artifacts: true
          logs: true

Illustration of a build with the above yml. The two folders within the red boxes have the same contents.

Image

This appears to be caused by the gather logic putting everything in subfolder of an artifacts directory as shown below.

https://github.com/dotnet/arcade/blob/0c4027923c24fb5cd00ac8ccbb2e42b0f3fcff40/eng/common/core-templates/job/job.yml#L183C1-L206C28

  # gather artifacts
  - ${{ if ne(parameters.artifacts.publish, '') }}:
    - ${{ if and(ne(parameters.artifacts.publish.artifacts, 'false'), ne(parameters.artifacts.publish.artifacts, '')) }}:
      - task: CopyFiles@2
        displayName: Gather binaries for publish to artifacts
        inputs:
          SourceFolder: 'artifacts/bin'
          Contents: '**'
          TargetFolder: '$(Build.ArtifactStagingDirectory)/artifacts/bin'
      - task: CopyFiles@2
        displayName: Gather packages for publish to artifacts
        inputs:
          SourceFolder: 'artifacts/packages'
          Contents: '**'
          TargetFolder: '$(Build.ArtifactStagingDirectory)/artifacts/packages'
    - ${{ if and(ne(parameters.artifacts.publish.logs, 'false'), ne(parameters.artifacts.publish.logs, '')) }}:
      - task: CopyFiles@2
        displayName: Gather logs for publish to artifacts
        inputs:
          SourceFolder: 'artifacts/log'
          Contents: '**'
          TargetFolder: '$(Build.ArtifactStagingDirectory)/artifacts/log'
        continueOnError: true
        condition: always()

...and the publish logic for the artifacts publishes the entire artifacts directory.

https://github.com/dotnet/arcade/blob/0c4027923c24fb5cd00ac8ccbb2e42b0f3fcff40/eng/common/templates/job/job.yml#L37C1-L61C64

    - ${{ if ne(parameters.artifacts.publish, '') }}:
      - ${{ if and(ne(parameters.artifacts.publish.artifacts, 'false'), ne(parameters.artifacts.publish.artifacts, '')) }}:
        - template: /eng/common/core-templates/steps/publish-build-artifacts.yml
          parameters:
            is1ESPipeline: false
            args:
              displayName: Publish pipeline artifacts
              pathToPublish: '$(Build.ArtifactStagingDirectory)/artifacts'
              publishLocation: Container
              artifactName: ${{ coalesce(parameters.artifacts.publish.artifacts.name , 'Artifacts_$(Agent.Os)_$(_BuildConfig)') }}
              continueOnError: true
              condition: always()
              retryCountOnTaskFailure: 10 # for any logs being locked
      - ${{ if and(ne(parameters.artifacts.publish.logs, 'false'), ne(parameters.artifacts.publish.logs, '')) }}:
        - template: /eng/common/core-templates/steps/publish-pipeline-artifacts.yml
          parameters:
            is1ESPipeline: false
            args:
              targetPath: '$(Build.ArtifactStagingDirectory)/artifacts/log'
              artifactName: ${{ coalesce(parameters.artifacts.publish.logs.name, 'Logs_Build_$(Agent.Os)_$(_BuildConfig)') }}
              displayName: 'Publish logs'
              continueOnError: true
              condition: always()
              retryCountOnTaskFailure: 10 # for any logs being locked
              sbomEnabled: false  # we don't need SBOM for logs

MichaelSimons avatar Jul 24 '25 14:07 MichaelSimons