在 VSTS 中为 .Net core API 构建 CI 管道。但是在构建时出现以下错误。
Publishing build artifacts failed with an error: Not found PathtoPublish: D:\a\1\s\$(buildStagingDirectory)
这是我的构建定义看起来像
我提到 PathToPublish 为
$(buildStagingDirectory)
如何消除这个错误??
PublishPipelineArtifact@0
任务,而不是已弃用的 PublishBuildArtifacts@1
。因此,在 YAML 中,我将替换:
- task: PublishBuildArtifacts@1
displayName: 'PublishBuildArtifacts'
inputs:
pathtoPublish: '$(Build.ArtifactStagingDirectory)'
artifactName: 'drop'
对于:
- task: PublishPipelineArtifact@0
displayName: 'Publish pipeline artifact'
inputs:
artifactName: 'drop'
targetPath: '$(Build.ArtifactStagingDirectory)'
如果继续出现此错误,那么我会将管道变量
system.debug
设置为 true
,再次触发管道,并观察生成我要发布的工件的任务中的日志。该路径应该位于这些日志中的某个位置
我刚刚遇到了完全相同的错误。
原因
将
system.debug
变量设置为 true
后,它显示发布任务实际上执行了输出文件夹(默认情况下为 $(build.artifactstagingdirectory)
)的 zip 操作,并将其置于目录结构中的更高一级。然后继续删除实际文件夹本身!我不确定这到底是有意为之还是一个错误。
解决方法
观察上述情况后,我只是将发布任务的输出写入
$(build.artifactstagingdirectory)\artifact
,然后生成的 Publish Artifact
任务很高兴地获取 zip 文件,因为它仍然指向 $(build.artifactstagingdirectory)
默认发布任务输出失败
2018-06-07T02:24:17.8506434Z ##[debug]Zip Source: D:\a\1\a
2018-06-07T02:24:17.8508216Z ##[debug]Zip arguments: Source: D:\a\1\a , target: D:\a\1\a.zip
2018-06-07T02:24:18.0627499Z ##[debug]Successfully created archive D:\a\1\a.zip
2018-06-07T02:24:18.0628200Z ##[debug]rm -rf D:\a\1\a
2018-06-07T02:24:18.0629858Z ##[debug]removing directory
...
...
2018-06-07T02:24:18.3052522Z ##[error]Publishing build artifacts failed with an error: Not found PathtoPublish: D:\a\1\a
添加额外目录后修改输出
2018-06-07T02:38:59.8138062Z ##[debug]Zip Source: D:\a\1\a\artifact
2018-06-07T02:38:59.8139294Z ##[debug]Zip arguments: Source: D:\a\1\a\artifact , target: D:\a\1\a\artifact.zip
2018-06-07T02:39:00.0331460Z ##[debug]Successfully created archive D:\a\1\a\artifact.zip
2018-06-07T02:39:00.0334435Z ##[debug]rm -rf D:\a\1\a\artifact
2018-06-07T02:39:00.0336336Z ##[debug]removing directory
...
...
2018-06-07T02:39:00.4157615Z Uploading 1 files
2018-06-07T02:39:01.9425586Z ##[debug]File: 'D:\a\1\a\artifact.zip' took 1504 milliseconds to finish upload
没有具有该名称的内置变量,您是否在寻找:
$(Build.ArtifactStagingDirectory)
请参阅:https://learn.microsoft.com/en-us/vsts/pipelines/build/variables?view=vsts&tabs=batch
这对我有用
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: $(System.DefaultWorkingDirectory)/bin/Any CPU/Release/netcoreapp3.1
ArtifactName: 'drop'
publishLocation: 'Container'
获得构建文件夹后,需要将文件内容复制到 Build.ArtifactStagingDirectory 中。
- task: CopyFiles@2
inputs:
contents: '/home/vsts/work/1/s/api-project/bin/Debug/net6.0/publish/**'
targetFolder: $(Build.ArtifactStagingDirectory)
然后您可以发布工件
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'drop'
publishLocation: 'Container'
然后您可以在发布管道中使用该工件。 我希望这会有所帮助,我在这个问题上挣扎了一段时间,我在此链接上找到了有关此问题的帮助https://learn.microsoft.com/en-us/azure/devops/pipelines/tasks/utility/publish-build-工件?view=azure-devops
这是我的整个 YAML 文件的源代码以供参考,这是 Monorepo 的管道。
# ASP.NET Core
# Build and test ASP.NET Core projects targeting .NET Core.
# Add steps that run tests, create a NuGet package, deploy, and more:
# https://learn.microsoft.com/azure/devops/pipelines/languages/dotnet-core
trigger:
branches:
include:
- main
paths:
include:
- api-project/*
pool:
vmImage: ubuntu-latest
variables:
buildConfiguration: 'Release'
steps:
- script: |
dotnet build --configuration $(buildConfiguration)
dotnet publish
displayName: 'dotnet build and publish'
workingDirectory: './api-project'
- task: CopyFiles@2
inputs:
contents: '/home/vsts/work/1/s/api-project/bin/Debug/net6.0/publish/**'
targetFolder: $(Build.ArtifactStagingDirectory)
- script: |
ls
displayName: check location
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'drop'
publishLocation: 'Container'
正如已经指出的那样,你的意思可能是
$(build.StagingDirectory)
所以用点。但我认为这是一个简单的错字,因为我遇到了同样的问题。
答案是,当发布时,构建变量似乎不可用(尽管它在工具提示中显示为示例)。您可能想要的是
$(System.ArtifactsDirectory)
。这对我有用。
我在创建 CI 管道时遇到了同样的问题。最后发现文件是在
$(System.DefaultWorkingDirectory)
中创建的。因此,在发布构建工件任务之前,我们需要先将文件复制到$(build.artifactstagingdirectory)
。因此,我添加了 Copy Files
任务,其中源文件夹为 $(System.DefaultWorkingDirectory)
,目标文件夹为 $(Build.ArtifactStagingDirectory)
,并解决了该问题。
尝试在
publish
之间添加 build
步骤并推送到工件存储库。通过发布,它将删除所有不必要的项目,从而使拉链变小。
YAML 的摘录如下所示。
# ...
# Build the project
- task: DotNetCoreCLI@2
displayName: "Build the solution"
inputs:
command: 'build'
projects: $(solution)
arguments: '--configuration $(BuildConfiguration) --no-restore'
# Publish the build
- task: DotNetCoreCLI@2
displayName: 'Publish the build'
inputs:
command: publish
publishWebProjects: True
projects: $(BuildParameters.RestoreBuildProjects)
arguments: --configuration $(BuildConfiguration) --output $(Build.ArtifactStagingDirectory)
zipAfterPublish: True
# Copy Publish to artifacts storage
- task: PublishBuildArtifacts@1
displayName: 'Copy Publish to artifacts'
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'drop'
publishLocation: 'Container'
# ...