发布和下载管道工件

Azure DevOps Services

使用 Azure Pipelines,可以从管道中的早期阶段或从另一个管道下载工件。 还可以将工件发布到文件共享,或将其作为管道工件提供。

发布工件

可以使用 YAML、经典编辑器或 Azure CLI 发布工件:

注意

在发布管道中不支持发布管道工件。

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

注意

publish 关键字是“发布管道工件”任务的快捷方式。

尽管工件的名称是可选的,但最好指定一个能够准确反映工件内容的名称。 如果打算使用在不同 OS 上运行的作业中的工件,必须确保所有文件路径对目标环境都有效。 例如,包含字符 \* 的文件名就不能在 Windows 上下载。

要发布的文件/文件夹的路径是必需的。 这可以是指向 $(System.DefaultWorkingDirectory) 的绝对路径或相对路径。

Azure Artifacts 中的包是不可变的。 一旦发布了包,将永久保留其版本。 如果包已发布,重新运行失败的作业将会失败。 如果希望能够重新运行失败的作业而不会遇到“包已存在”的错误,一个好的方法是使用条件,只在前一个作业成功的情况下运行。

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

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

注意

存储管道工件无需付费。 管道缓存的存储也无需付费。 请参阅哪些工件计入我的总计费存储

注意

删除管道运行将导致删除与该运行关联的所有工件。

使用 .artifactignore

.artifactignore 使用与 .gitignore 类似的语法(有一些限制)指定发布工件时应忽略哪些文件。 确保 .artifactignore 文件位于由发布管道工件任务的 targetPath 参数指定的目录中。

注意

URL 路径和 Maven 等包类型的一些生成元数据不支持加号字符 +

示例:忽略除 .exe 文件之外的所有文件:

**/*
!*.exe

重要

如果没有 .artifactignore 文件,Azure Artifacts 会自动忽略 .git 文件夹路径。 可以通过创建一个空的 .artifactignore 文件来绕过此操作。

下载工件

可以使用 YAML、经典编辑器或 Azure CLI 下载工件。

steps:
- download: current
  artifact: WebApp
  • current:下载当前管道运行生成的工件。 选项:当前、特定。

注意

已发布工件的列表只在以下从属作业中提供。 因此,只能在依赖于具有发布工件任务的作业的单独作业中使用 current 选项。

提示

可以使用管道资源在一个位置定义源,并在管道中的任何位置使用它。

注意

download 关键字会下载项目。 有关详细信息,请参阅 steps.download

若要从组织内的其他项目下载管道工件,请确保为下游项目和下游管道配置了适当的权限。 默认情况下,文件会下载到 $(Pipeline.Workspace) 中。 如果未指定工件名称,将为每个下载的工件创建一个子目录。 可以使用匹配模式来限制下载的文件。 有关更多详细信息,请参阅文件匹配模式

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

工件选择

一个下载步骤可以下载一个或多个工件。 若要下载多个工件,请将“工件名称”字段留空,并使用文件匹配模式来限制要下载的文件。 ** 是默认的文件匹配模式(所有工件中的所有文件)。

单个工件

指定了工件名称后:

  1. 仅下载该特定工件的文件。 如果工件不存在,任务将失败。

  2. 文件匹配模式是相对于工件的根目录进行评估的。 例如,模式 *.jar 匹配工件根目录中带 .jar 扩展名的所有文件。

下面的示例演示了如何从 WebApp 工件下载所有 *.js

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

多个工件

如果未指定工件名称:

  1. 可以下载多个工件,如果没有找到文件,任务也不会失败。

  2. 为每个工件创建一个子目录。

  3. 文件匹配模式应假定模式的第一段为(或匹配)工件名称。 例如,WebApp/** 匹配 WebApp 工件中的所有文件。 模式 */*.dll 匹配每个工件根目录中带 .dll 扩展名的所有文件。

下面的示例演示了如何从所有工件下载所有 .zip 文件:

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

发布和部署作业中的工件

工件只有在部署作业中才会自动下载。 默认情况下,工件会下载到 $(Pipeline.Workspace)。 只有在部署中使用 deploy 生命周期挂钩时,才会自动注入下载工件任务。 若要停止自动下载工件,请添加一个 download 步骤,并将其值设置为“无”。 在常规生成作业中,需要显式使用 download 步骤关键字或“下载管道工件”任务。 请参阅生命周期挂钩,详细了解其他类型的挂钩。

steps:
- download: none

跨阶段使用工件

如果希望能够在管道中跨不同阶段访问工件,你现在可以在一个阶段发布工件,然后在下一阶段利用依赖项下载它。 有关更多详细信息,请参阅阶段到阶段依赖项

示例

在以下示例中,我们将脚本文件夹从存储库复制并发布到 $(Build.ArtifactStagingDirectory)。 在第二个阶段,我们将下载并运行脚本。

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

从生成工件迁移

管道工件是下一代生成工件,是推荐的处理工件的方式。 使用“发布生成工件”任务发布的工件仍可使用下载生成工件进行下载,但建议改用最新的“下载管道工件”任务。

从生成工件迁移到管道工件时:

  1. 默认情况下,“下载管道工件”任务会将文件下载到 $(Pipeline.Workspace)。 这是所有类型的工件的默认推荐路径。

  2. “下载生成工件”任务的文件匹配模式应以工件名称开始(或与之匹配),不管是否指定了具体工件。 在“下载管道工件”任务中,如果已经指定了工件名称,模式就不应包括工件名称。 有关详细信息,请参阅单个工件选择

示例

- 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:(必需)要发布的文件或目录的路径。 可以是绝对路径,也可以是相对于默认工作目录的路径。 可以包含变量,但不支持使用通配符。 默认:$ (Pipeline.Workspace)。

  • publishLocation:(必需)工件发布位置。 选择是否在 Azure Pipelines 中存储工件,或者是否将其复制到必须可从管道代理访问的文件共享中。 选项:pipelinefilepath。 默认:管道。

  • 工件:(可选)要发布的工件的名称。 如果未设置,则默认为作业范围内的唯一 ID。

常见问题解答

问:什么是生成工件?

答:生成工件是由生成产生的文件。 请参阅生成工件,详细了解如何发布和使用生成工件。

问:重新运行失败的作业时,是否可以删除管道工件?

答:管道工件不可被删除或替代。 如果要在重新运行失败的作业时重新生成工件,可以将作业 ID 包含在工件名称中。 $(system.JobId) 是可实现此目的的适当变量。 请参阅系统变量,详细了解预定义变量。

问:如何访问防火墙后面的工件源?

问:如果你的组织使用防火墙或代理服务器,请确保允许 Azure Artifacts 域 URL 和 IP 地址