【问题标题】:Use an Expression as Part of the Cache Key in an Azure yml Pipeline在 Azure yml 管道中使用表达式作为缓存键的一部分
【发布时间】:2021-08-01 14:32:56
【问题描述】:

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

# 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) 一起使用,这也不起作用。

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

【问题讨论】:

    标签: azure azure-devops azure-pipelines azure-yaml-pipelines


    【解决方案1】:

    我不得不做类似的事情。对我有用的是在 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 脚本中执行你的表达式,然后将结果分配给一个变量。

    【讨论】:

    • 谢谢,但这并不是我想要的。我需要一个不固定的表达式,但会根据日期而变化。
    • 好的。我的建议是使用 Powershell 任务来执行此操作,然后将其保存在变量中。
    • 是的,我明白了,但我怀疑缓存步骤会看到您分配的变量的实际内容。我认为它会看到一个空字符串。你真的确定它有效吗?
    猜你喜欢
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-15
    • 1970-01-01
    相关资源
    最近更新 更多