Publish and download pipeline artifacts

Azure DevOps Services

Using Azure Pipelines, you can download artifacts from earlier stages in your pipeline or from another pipeline. You can also publish your artifact to a file share or make it available as a pipeline artifact.

Publish artifacts

You can publish your artifacts using YAML, the classic editor, or Azure CLI:

Note

Publishing pipeline artifacts is not supported in release pipelines.

steps:
- publish: $(System.DefaultWorkingDirectory)/bin/WebApp
  artifact: WebApp

Note

The publish keyword is a shortcut for the Publish Pipeline Artifact task .

Although the artifact's name is optional, it is a good practice to specify a name that accurately reflects the contents of your artifact. If you plan to consume the artifact from a job running on a different OS, you must ensure all the file paths are valid for the target environment. For example, a file name containing the character \ or * will fail to download on Windows.

The path of the file/folder that you want to publish is required. This can be an absolute or a relative path to $(System.DefaultWorkingDirectory).

Packages in Azure Artifacts are immutable. Once you publish a package, its version will be permanently reserved. rerunning failed jobs will fail if the package has been published. A good way to approach this if you want to be able to rerun failed jobs without facing an error package already exists, is to use Conditions to only run if the previous job succeeded.

  jobs:
  - job: Job1
    steps:
      - script: echo Hello Job1!

  - job: Job2
    steps:
      - script: echo Hello Job2!
    dependsOn: Job1

Note

You will not be billed for storing Pipeline Artifacts. Pipeline Caching is also exempt from storage billing. See Which artifacts count toward my total billed storage.

Caution

Deleting a pipeline run will result in the deletion of all Artifacts associated with that run.

Use .artifactignore

.artifactignore uses a similar syntax to .gitignore (with few limitations) to specify which files should be ignored when publishing artifacts. Make sure that the .artifactignore file is located within the directory specified by the targetPath argument of your Publish Pipeline Artifacts task.

Note

The plus sign character + is not supported in URL paths and some builds metadata for package types such as Maven.

Example: ignore all files except .exe files:

**/*
!*.exe

Important

Azure Artifacts automatically ignore the .git folder path when you don't have a .artifactignore file. You can bypass this by creating an empty .artifactignore file.

Download artifacts

You can download artifacts using YAML, the classic editor, or Azure CLI.

steps:
- download: current
  artifact: WebApp
  • current: download artifacts produced by the current pipeline run. Options: current, specific.

Note

List of published artifacts will be available only in following dependant jobs. Therefore, use current option only in separate jobs, that has dependency on jobs with publish artifacts tasks.

Tip

You can use Pipeline resources to define your source in one place and use it anywhere in your pipeline.

Note

The download keyword downloads artifacts. For more information, see steps.download.

To download a pipeline artifact from a different project within your organization, make sure that you have the appropriate permissions configured for both your downstream project and downstream pipeline. By default, files are downloaded to $(Pipeline.Workspace). If an artifact name was not specified, a subdirectory will be created for each downloaded artifact. You can use matching patterns to limit which files get downloaded. See File matching patterns for more details.

steps:
- download: current
  artifact: WebApp
  patterns: |
    **/*.js
    **/*.zip

Artifacts selection

A single download step can download one or more artifacts. To download multiple artifacts, leave the artifact name field empty and use file matching patterns to limit which files will be downloaded. ** is the default file matching pattern (all files in all artifacts).

Single artifact

When an artifact name is specified:

  1. Only files for that specific artifact are downloaded. If the artifact does not exist, the task will fail.

  2. File matching patterns are evaluated relative to the root of the artifact. For example, the pattern *.jar matches all files with a .jar extension at the root of the artifact.

The following example illustrates how to download all *.js from an artifact WebApp:

steps:
- download: current
  artifact: WebApp
  patterns: '**/*.js'

Multiple artifacts

When no artifact name is specified:

  1. Multiple artifacts can be downloaded and the task does not fail if no files are found.

  2. A subdirectory is created for each artifact.

  3. File matching patterns should assume the first segment of the pattern is (or matches) an artifact name. For example, WebApp/** matches all files from the WebApp artifact. The pattern */*.dll matches all files with a .dll extension at the root of each artifact.

The following example illustrates how to download all .zip files from all artifacts:

steps:
- download: current
  patterns: '**/*.zip'

Artifacts in release and deployment jobs

Artifacts are only downloaded automatically in deployment jobs. By default, artifacts are downloaded to $(Pipeline.Workspace). The download artifact task will be auto injected only when using the deploy lifecycle hook in your deployment. To stop artifacts from being downloaded automatically, add a download step and set its value to none. In a regular build job, you need to explicitly use the download step keyword or the Download Pipeline Artifact task. See lifecycle hooks to learn more about the other types of hooks.

steps:
- download: none

Use Artifacts across stages

If you want to be able to access your artifact across different stages in your pipeline, you can now publish your artifact in one stage and then download it in the next stage leveraging dependencies. See Stage to stage dependencies for more details.

Example

In the following example, we will copy and publish a script folder from our repo to the $(Build.ArtifactStagingDirectory). In the second stage, we will download and run our script.

trigger:
- main
stages:
- stage: build
  jobs:
  - job: run_build
    pool:
      vmImage: 'windows-latest'
    steps:
    - task: VSBuild@1
      inputs:
        solution: '**/*.sln'
        msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:DesktopBuildPackageLocation="$(build.artifactStagingDirectory)\WebApp.zip" /p:DeployIisAppPath="Default Web Site"'
        platform: 'Any CPU'
        configuration: 'Release'

    - task: CopyFiles@2
      displayName: 'Copy scripts'
      inputs:
        contents: 'scripts/**'
        targetFolder: '$(Build.ArtifactStagingDirectory)'

    - publish: '$(Build.ArtifactStagingDirectory)/scripts'
      displayName: 'Publish script'
      artifact: drop

- stage: test
  dependsOn: build
  jobs:
  - job: run_test
    pool:
      vmImage: 'windows-latest'
    steps:
    - download: current
      artifact: drop
    - task: PowerShell@2
      inputs:
        filePath: '$(Pipeline.Workspace)\drop\test.ps1'

Screenshot showing the PowerShell task output

Migrate from build artifacts

Pipeline artifacts are the next generation of build artifacts and are the recommended way to work with artifacts. Artifacts published using the Publish Build Artifacts task can still be downloaded using Download Build Artifacts, but we recommend using the latest Download Pipeline Artifact task instead.

When migrating from build artifacts to pipeline artifacts:

  1. By default, the Download Pipeline Artifact task downloads files to $(Pipeline.Workspace). This is the default and recommended path for all types of artifacts.

  2. File matching patterns for the Download Build Artifacts task are expected to start with (or match) the artifact name, regardless if a specific artifact was specified or not. In the Download Pipeline Artifact task, patterns should not include the artifact name when an artifact name has already been specified. For more information, see single artifact selection.

Example

- task: PublishPipelineArtifact@1
  displayName: 'Publish pipeline artifact'
  inputs:
    targetPath: '$(Pipeline.Workspace)'
    ${{ if eq(variables['Build.SourceBranchName'], 'main') }}:
        artifact: 'prod'
    ${{ else }}:
        artifact: 'dev'
    publishLocation: 'pipeline'
  • targetPath: (Required) The path of the file or directory to publish. Can be absolute or relative to the default working directory. Can include variables, but wildcards are not supported. Default: $(Pipeline.Workspace).

  • publishLocation: (Required) Artifacts publish location. Choose whether to store the artifact in Azure Pipelines, or to copy it to a file share that must be accessible from the pipeline agent. Options: pipeline, filepath. Default: pipeline.

  • artifact: (Optional) Name of the artifact to publish. If not set, defaults to a unique ID scoped to the job.

FAQ

Q: What are build artifacts?

A: Build artifacts are the files generated by your build. See Build Artifacts to learn more about how to publish and consume your build artifacts.

Q: Can I delete pipeline artifacts when re-running failed jobs?

A: Pipeline artifacts are not deletable or overwritable. If you want to regenerate artifacts when you re-run a failed job, you can include the job ID in the artifact name. $(system.JobId) is the appropriate variable for this purpose. See System variables to learn more about predefined variables.

Q: How can I access Artifacts feeds behind a firewall?

A: If your organization is using a firewall or a proxy server, make sure you allow Azure Artifacts Domain URLs and IP addresses.