首页 > 解决方案 > 在 Azure yml 管道中使用表达式作为缓存键的一部分

问题描述

我想从位于步骤模板中的缓存步骤中的表达式创建一个缓存键。由于缓存是不可变的,我想每周或每月从一个干净的缓存开始。我的模板文件如下所示:

# steps-tpl.yml
steps:
- task: Cache@2
  inputs:
    key: compiler-cache | "<expression>" | "$(Agent.JobName)" | "$(Build.SourceBranch)" | "$(Build.SourceVersion)"
    restoreKeys: |
      compiler-cache | "<expression>" | "$(Agent.OS)" | "$(Agent.JobName)" | "$(Build.SourceBranch)" |  "$(Build.SourceVersion)"
      compiler-cache | "<expression>" | "$(Agent.OS)" | "$(Agent.JobName)" | "$(Build.SourceBranch)"
      compiler-cache | "<expression>" | "$(Agent.OS)" | "$(Agent.JobName)" | "refs/heads/master"
    path: $(Pipeline.Workspace)/ccache
  displayName: 'ccache/clcache: Warm up cache'

该表达式应该在一年中的每个星期给我一个不同的值,或者为简单起见,给我当前月份的数字。

我尝试了不同的表达方式,但都没有奏效。首先,我尝试将表达式放入无效的参数默认值中。然后我尝试像这样直接将表达式放在适当的位置:

"${{ format('{0:MM}', pipeline.startTime) }}"

这也不起作用。这也不是:

"$[format('{0:MM}', pipeline.startTime)]"

我猜运行时表达式在脚本上下文之外不可用。

我什至尝试在缓存之前的一步中设置环境变量:

    echo '##vso[task.setvariable variable=COMPILER_CACHE_KEY_PREFIX,isOutput=true]$[ counter(format("{0:yyyMMdd}", pipeline.startTime), 7) ]'

并使用那些$(previousStep.COMPILER_CACHE_KEY_PREFIX)也不起作用的东西。

如何将这样的表达式放入缓存键中?有可能吗?

标签: azureazure-devopsazure-pipelinesazure-yaml-pipelines

解决方案


我不得不做类似的事情。对我有用的是在 Powershell 任务中设置一个变量,然后将它与在运行时扩展的语法一起使用:

variables:        
    - name: projectFolder
      value: ''


 # assign temporary variable resultfolder to variable projectFolder
 - powershell: |
        Write-Host "##vso[task.setvariable variable=projectFolder]$(resultfolder)"
   displayName: Save project folder path

 # refer to projectFolder, not the temporary variable resultfolder
 - task: Cache@2
   inputs:
     key: 'nuget | "$(Agent.OS)" | $(projectFolder)/packages.lock.json'
     restoreKeys: |
      nuget | "$(Agent.OS)"
     path: $(NUGET_PACKAGES)
   displayName: Cache NuGet packages

缓存任务输出以下内容:

Resolving key:
 - nuget                                 [string]
 - "Windows_NT"                          [string]
 - D:\a\1\s\PTS_Tasks/packages.lock.json [file] --> 811E162D4016AFBA61F7850XXXXXXXXXXXXX366DFAC37C757FC4D4F49992
Resolved to: nuget|"Windows_NT"|/9Pr8Jh9L66tny00XXXXXXXXXXnL23DoLKFCDGhG8=

显示变量projectFolder已正确展开。

所以也许在 Powershell 脚本中执行你的表达式,然后将结果分配给一个变量。


推荐阅读