azure - 在 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)
也不起作用的东西。
如何将这样的表达式放入缓存键中?有可能吗?
解决方案
我不得不做类似的事情。对我有用的是在 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 脚本中执行你的表达式,然后将结果分配给一个变量。
推荐阅读
- c++ - c++字符串使用assign函数和直接使用'='改变值的区别
- java - 如何在 Java 中使用来自 Kafka 的消息,从特定偏移量开始
- javascript - 仅当数组未定义时,我如何连接数组
- python - 如何根据数据中列的 Log10 为折线图着色?
- jpa - @Inject - UserTransaction 抛出焊接错误
- javascript - Puppeteer 和动态添加的 iFrame(元素)
- r - “无法分配大小为 xxx mb 的向量”错误,似乎无法修复
- amazon-web-services - 调用 CreatePolicy 操作时出现 MalformedPolicyDocument - AWS
- angular - 将 Angular EventEmitter.emit() 作为回调传递
- python - 如何在特殊情况下省略自定义日志记录处理程序?