Cache@2 Azure DevOps 管道任务失败

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

我正在尝试使用 Cache@2 任务来缓存我的 nuget 包。按照文档,我设置了以下任务:

variables:
  nugetPackages: $(Pipeline.Workspace)/.nuget/packages
  
stages:
  - stage: CI
    displayName: 'Continuous Integration'
    jobs:
      - job: 'CI'
        pool:
          vmImage: ubuntu-latest
        steps:
          - task: NuGetToolInstaller@1
            displayName: 'NuGet tool installer'

          - task: Cache@2
            inputs:
              key: 'nuget | "$(Agent.OS)" | **/packages.lock.json,!**/bin/**,!**/obj/**'
              restoreKeys: |
                nuget | "$(Agent.OS)"
                nuget
              path: $(nugetPackages)
            displayName: Cache NuGet packages

      - task: DotNetCoreCLI@2
        displayName: 'Restore Packages'
        inputs:
          command: 'restore'
          feedsToUse: 'select'
          vstsFeed: '<DevOpsArtifactFeedId>'
          projects: 'Solution.sln'

但是在作业后任务中,它失败了:

tar: /home/vsts/work/1/.nuget/packages: Cannot open: No such file or directory

看起来 nugetPackages 路径可能不正确,但我不确定它应该是什么。尽管查看 nuget 恢复任务,我可以看到诸如以下的日志条目:

Installed System.Text.Json 7.0.0 from https://api.nuget.org/v3/index.json to /home/vsts/.nuget/packages/system.text.json/7.0.0

没有

/work/1/
路径。我尝试使用
$(Agent.HomeDirectory)
而不是
$(Pipeline.Workspace)
,但这也不起作用。

如果我将

nugetPackages
变量硬编码为
'/home/vsts/.nuget/packages'
那么它就可以工作 - 但这感觉很脏,我宁愿使用适当的 DevOps 变量,以防路径名发生变化

.net azure-devops azure-pipelines nuget azure-pipelines-yaml
1个回答
0
投票

我同意@Zdeněk Jelínek 的评论,将变量名称

nugetPackages
更改为
$(NUGET_PACKAGES)
。您还需要将恢复任务从
DotNetCoreCLI@2
更改为
NuGetCommand@2

根据管道缓存文档,

如果您使用

PackageReferences
直接在项目文件中管理 NuGet 依赖项并拥有
packages.lock.json
文件,则可以通过将
NUGET_PACKAGES
环境变量设置为 $(UserProfile) 下的路径并缓存此目录来启用缓存。

所以,

NUGET_PACKAGES
是一个环境变量。

当我在管道中测试与您相同的 yaml 时,我可以在作业后任务中重现相同的错误。

然后我改用官方文档示例,Post-job任务就可以了。

但是,当我仅将 yaml 中的变量名称

nugetPackages
更改为
$(NUGET_PACKAGES)
时,管道仍然无法工作。区别在于恢复任务。所以,我将恢复任务更改为
NuGetCommand@2
恢复 。这次成功了。

更改后的yaml:

variables:
  NUGET_PACKAGES: $(Pipeline.Workspace)/.nuget/packages
  
stages:
  - stage: CI
    displayName: 'Continuous Integration'
    jobs:
      - job: 'CI'
        pool:
          vmImage: ubuntu-latest
        steps:
          - task: NuGetToolInstaller@1
            displayName: 'NuGet tool installer'

          - task: Cache@2
            inputs:
              key: 'nuget | "$(Agent.OS)" | **/packages.lock.json,!**/bin/**,!**/obj/**'
              restoreKeys: |
                nuget | "$(Agent.OS)"
                nuget
              path: $(NUGET_PACKAGES)
            displayName: Cache NuGet packages
          - task: NuGetCommand@2
            displayName: 'NuGet restore'
            inputs:
              command: 'restore'
              restoreSolution: '**/*.sln'
              feedsToUse: 'select'
              vstsFeed: 'feedID'

© www.soinside.com 2019 - 2024. All rights reserved.