发布构建工件失败并出现错误:未找到 PathtoPublish: D: \s\$(buildStagingDirectory)

问题描述 投票:0回答:8

在 VSTS 中为 .Net core API 构建 CI 管道。但是在构建时出现以下错误。

Publishing build artifacts failed with an error: Not found PathtoPublish: D:\a\1\s\$(buildStagingDirectory)

这是我的构建定义看起来像

我提到 PathToPublish 为

$(buildStagingDirectory)

如何消除这个错误??

continuous-integration azure-devops asp.net-core-webapi azure-pipelines azure-devops-rest-api
8个回答
12
投票

我通常解决这个问题的方法是,首先使用

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
,再次触发管道,并观察生成我要发布的工件的任务中的日志。该路径应该位于这些日志中的某个位置


8
投票

我刚刚遇到了完全相同的错误。

原因

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

3
投票

没有具有该名称的内置变量,您是否在寻找:

$(Build.ArtifactStagingDirectory)

请参阅:https://learn.microsoft.com/en-us/vsts/pipelines/build/variables?view=vsts&tabs=batch


2
投票

这对我有用

- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: $(System.DefaultWorkingDirectory)/bin/Any CPU/Release/netcoreapp3.1
    ArtifactName: 'drop'
    publishLocation: 'Container'

2
投票

获得构建文件夹后,需要将文件内容复制到 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'

0
投票

正如已经指出的那样,你的意思可能是

$(build.StagingDirectory)
所以用点。但我认为这是一个简单的错字,因为我遇到了同样的问题。

答案是,当发布时,构建变量似乎不可用(尽管它在工具提示中显示为示例)。您可能想要的是

$(System.ArtifactsDirectory)
。这对我有用。


0
投票

我在创建 CI 管道时遇到了同样的问题。最后发现文件是在

$(System.DefaultWorkingDirectory)
中创建的。因此,在发布构建工件任务之前,我们需要先将文件复制到
$(build.artifactstagingdirectory)
。因此,我添加了
Copy Files
任务,其中源文件夹为
$(System.DefaultWorkingDirectory)
,目标文件夹为
$(Build.ArtifactStagingDirectory)
,并解决了该问题。


0
投票

尝试在

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'
# ...
© www.soinside.com 2019 - 2024. All rights reserved.