【问题标题】:Caching NPM dependencies in Azure pipeline for in-built windows-latest image在 Azure 管道中为内置的 windows-latest 映像缓存 NPM 依赖项
【发布时间】:2020-04-16 15:33:08
【问题描述】:

我正在尝试在管道中缓存 npm 依赖项,下面是 yaml 代码

jobs:
- job: Cypress_e2e_tests
  pool:
    vmImage: 'windows-latest'
  variables:
     npm_config_cache: C:\Users\VssAdministrator\AppData\Local\npm-cache  


  steps:
    - task: NodeTool@0
      inputs:
        versionSpec: '10.x'
    - task: CacheBeta@1
      inputs:
        key: npm | $(Agent.OS) | package-lock.json
        path: $(npm_config_cache)
        restoreKeys: npm | $(Agent.OS) | package-lock.json
      displayName: Cache NPM packages  

- task: CacheBeta@1
  inputs:
    key: 'cypress | $(Agent.OS) | package-lock.json'
    path: 'C:\Users\VssAdministrator\AppData\Local\Cypress'
    restoreKeys: 'cypress | $(Agent.OS) | package-lock.json'
  displayName: Cache cypress binary

- script: npm cache verify
  displayName: 'NPM verify'

- script: npm ci
  displayName: 'Install NPM dependencies'

- script: npm run cy:verify
  displayName: 'Cypress verify'

- script: |
    npx cypress run --browser chrome
  displayName: 'Run Cypress tests' 
  workingDirectory: $(System.DefaultWorkingDirectory)


- task: PublishPipelineArtifact@0
  displayName: 'Publish Screenshots (Cypress)'
  condition: failed()
  inputs:
      artifactName: 'screenshots'
      targetPath: '$(Build.SourcesDirectory)/cypress/screenshots'

- task: PublishPipelineArtifact@0
  displayName: 'Publish Videos (Cypress)'
  condition: failed()
  inputs:
      artifactName: 'videos'
      targetPath: '$(Build.SourcesDirectory)/cypress/videos'


- task: PublishTestResults@2
  inputs:
    testResultsFormat: 'JUnit'
    testResultsFiles: '*.xml'
    failTaskOnFailedTests: true
    testRunTitle: 'Cypress Test Results'
    publishRunAttachments: true
  condition: succeededOrFailed()  

但是在第二次运行中,我得到了以下信息,并且缓存似乎没有按预期工作,

信息,缓存未命中。

【问题讨论】:

  • 这 2 个构建是否建立在 2 个不同的分支上?还是同一个分支?对我来说,如果它基于同一个分支,一切都很好。你能更新完整的缓存日志吗?
  • 是的,这是针对同一个分支的。你认为我们可以在 YAML 中指向窗口的 AppData 而不使用上面的硬编码值吗?
  • 不。如果您用绝对值对其进行硬编码,那一切都很好。但我更建议您使用动态值。你比较了这两个版本的关键值吗?它们是一样的吗?
  • 只是想在周末后检查一下这个问题的状态是什么?下面的解释能解决你的困惑吗?
  • 现在似乎工作正常。但在这两者之间,我看到两次运行使用相同的指纹,但仍然显示缓存未命中。但我今天检查了一下,它现在正在工作并恢复缓存文件,而不是从头开始下载所有内容。感谢您的回答,如果我再次遇到相同的情况,即恢复操作显示缓存未命中,即使它们使用相同的指纹,我也会回复您。

标签: npm azure-devops azure-pipelines cypress npm-cache


【解决方案1】:

信息,缓存未命中。

按照设计,缓存完成,同时在你第一次构建Cache后,也会为这个缓存生成对应的Key(fingerprint)

这个key是一个唯一根据文件内容的标识:Hash通过文件路径/文件模式标识的文件内容,然后产生相应的密钥。

由文件路径或文件模式标识的任何文件的内容是 散列以产生动态缓存键。当您的 项目具有唯一标识正在缓存的内容的文件。

因此,根据消息There is a cache miss,第二次构建不应使用第一次构建生成的指纹


如果这两个构建都是基于同一个分支构建的,那么唯一可能的情况是,文件模式标识的文件发生了一些变化。

例如,如果这个识别的文件是package-lock.json,我在第一次构建完成后对其进行了一些修改。

此时YAML管道会自动触发(二次构建) -> recache -> 为它重新生成一个新的key:因为文件的hash已经重新计算过了 因为文件内容已更新。

正常情况下,在这种情况下,您会发现缓存的指纹不是同一个。

因此,由于第二次构建的指纹不同,There is a cache miss 的消息是预期的操作。这是设计使然,因为我们使用hash 来表示缓存的内容,它对内容来说是唯一的,不受任何影响。

你可以加入这 2 期讨论:#1#2

【讨论】:

    猜你喜欢
    • 2018-04-02
    • 2021-02-26
    • 2019-03-16
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 2023-03-14
    • 2021-11-18
    • 1970-01-01
    相关资源
    最近更新 更多