发布和下载管道工件
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
工件选择
一个下载步骤可以下载一个或多个工件。 若要下载多个工件,请将“工件名称”字段留空,并使用文件匹配模式来限制要下载的文件。 **
是默认的文件匹配模式(所有工件中的所有文件)。
单个工件
指定了工件名称后:
仅下载该特定工件的文件。 如果项目不存在,则任务将失败。
文件匹配模式是相对于工件的根目录进行评估的。 例如,模式
*.jar
匹配工件根目录中带.jar
扩展名的所有文件。
下面的示例演示了如何从 WebApp
工件下载所有 *.js
:
多个工件
如果未指定工件名称:
可以下载多个工件,如果没有找到文件,任务也不会失败。
为每个工件创建一个子目录。
文件匹配模式应假定模式的第一段为(或匹配)工件名称。 例如,
WebApp/**
匹配WebApp
工件中的所有文件。 模式*/*.dll
匹配每个工件根目录中带.dll
扩展名的所有文件。
下面的示例演示了如何从所有工件下载所有 .zip
文件:
下载特定工件
以下示例演示如何从特定运行生成的特定生成版本下载管道项目:
resources:
pipelines:
- pipeline: myPipeline
project: 'xxxxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx'
source: '79'
version: '597'
steps:
- download: myPipeline
artifact: drop
patterns: '**'
displayName: 'Download Pipeline Artifact'
发布和部署作业中的工件
工件只有在部署作业中才会自动下载。 默认情况下,工件会下载到 $(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'
从生成工件迁移
管道工件是下一代生成工件,是推荐的处理工件的方式。 使用“发布生成工件”任务发布的工件仍可使用下载生成工件进行下载,但建议改用最新的“下载管道工件”任务。
从生成工件迁移到管道工件时:
默认情况下,“下载管道工件”任务会将文件下载到
$(Pipeline.Workspace)
。 这是所有类型的工件的默认推荐路径。“下载生成工件”任务的文件匹配模式应以工件名称开始(或与之匹配),不管是否指定了具体工件。 在“下载管道工件”任务中,如果已经指定了工件名称,模式就不应包括工件名称。 有关详细信息,请参阅单个工件选择。
示例
- 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 中存储工件,或者是否将其复制到必须可从管道代理访问的文件共享中。 选项:
pipeline
、filepath
。 默认:管道。工件:(可选)要发布的工件的名称。 如果未设置,则默认为作业范围内的唯一 ID。
查看已发布的工件
管道运行完成后,请按照以下步骤查看或下载已发布的项目:
登录到 Azure DevOps 组织,并导航到你的项目。
选择管道,选择你的管道运行,然后选择摘要选项卡。
在相关部分中,选择已发布的项目。
展开放置文件夹并找到项目。 然后,可以下载项目并浏览其内容。
常见问题解答
问:什么是生成工件?
答:生成工件是由生成产生的文件。 请参阅生成工件,详细了解如何发布和使用生成工件。
问:重新运行失败的作业时,是否可以删除管道工件?
答:管道工件不可被删除或替代。 如果要在重新运行失败的作业时重新生成工件,可以将作业 ID 包含在工件名称中。 $(system.JobId)
是可实现此目的的适当变量。 请参阅系统变量,详细了解预定义变量。
问:如何访问防火墙后面的工件源?
问:如果你的组织使用防火墙或代理服务器,请确保允许 Azure Artifacts 域 URL 和 IP 地址。