【问题标题】:CircleCI for iOS - caching cocoapods dependenciesCircleCI for iOS - 缓存 cocoapods 依赖项
【发布时间】:2019-06-17 16:51:18
【问题描述】:

我正在尝试使用 fastlane scan 在 CircleCI 中运行我的 iOS 测试套件。运行测试效果很好,但是通过安装来自 cocoapods 的依赖项,总时间增加了很多。

我尝试通过执行以下操作来缓存 Pods 目录,但是,校验和在 restore_cache 步骤和 save_cache 步骤之间发生变化:

- restore_cache:
    key: 1-pods-{{ checksum "Podfile.lock" }}
- run:
    name: Install Pods
    command: pod install
- save_cache:
    key: 1-pods-{{ checksum "Podfile.lock" }}
    paths:
      - ./Pods

本质上,pod install 会导致校验和发生变化,即使没有任何 pod 发生变化。因此,它保存在缓存中的键永远不会与试图从缓存中恢复的内容对齐。

有没有更好的方法来做到这一点?

【问题讨论】:

  • 也许你提交的 Podfile.lock 不是最新的? pod install 只会在您的 podfile 发生一些更改时更改 Podfile.lock。我有完全相同的方式来恢复和保存,而且效果很好
  • 有同样的问题。你能让事情顺利进行吗?我尝试了密钥前缀解决方案,但导致沙箱不同步错误。
  • 我实际上看到了问题所在。我使用catpod_install 之前和之后打印出我的Podfile.lock。签入的内容和生成的内容之间的区别在于我有一个私人回购源。在生成的版本中,锁定文件将 .git 放在 repo 名称的末尾。在我的签入版本中它没有。奇怪的是,两个版本的 cocoapods 是一样的。

标签: ios continuous-integration cocoapods circleci


【解决方案1】:

是的,有一种方法可以实现这一点。 restore_cache 接受键前缀 (https://circleci.com/docs/2.0/configuration-reference/#restore_cache)。因此,要回退到较早的缓存,您可以使用以下内容:

- restore_cache:
    keys:
      - 1-pods-{{ checksum "Podfile.lock" }}
      - 1-pods-

这里有一些更具体的指南:https://circleci.com/docs/2.0/ios-migrating-from-1-2/#installing-cocoapods

【讨论】:

    【解决方案2】:

    这些是完整的步骤。

      - restore_cache:
          key: 1-pods-{{ checksum "Podfile.lock" }}
      - run:
          name: Install CocoaPods
          command: |
            if [ ! -d "Pods" ]
            then
               curl https://cocoapods-specs.circleci.com/fetch-cocoapods-repo-from-s3.sh | bash -s cf
              bundle exec pod install
            fi
      - save_cache:
          key: 1-pods-{{ checksum "Podfile.lock" }}
          paths:
            - ./Pods
    

    第一步是恢复缓存。

    第二步,如果没有找到缓存,从 circleci 镜像更新 pods repo 并安装 pods。此步骤大约需要 5 分钟,因此如果不需要,您最好跳过它。

    第三步,如果key还没有被占用则保存缓存

    来源:https://medium.com/wandercodes/how-to-save-time-in-circleci-when-using-pods-4e00cd419ad8

    【讨论】:

      【解决方案3】:

      好的,在遇到这个确切的问题后,我自己解决了。我会在这里留下解决方案,以防其他人也一样。

      什么?

      当尝试在circleci上缓存和恢复cocoapod依赖项时,与保存相比,用于我的缓存键的校验和在恢复时是不同的;导致永远找不到缓存键匹配。

      为什么?

      当 circleci 将我的存储库添加为源时,它在我的存储库中包含了 .git 扩展名。但是,当我将 repo 添加到我自己的机器时(即,pod repo add <name> <url> 我确实包含扩展名。所以,当我在本地机器上运行pod install 我的Podfile.lock 时列出我的私人仓库,不带.git,这当然会影响校验和的生成。然后在circleci上,它会经历相同的过程,但会生成一个Podfile.lock,其中确实包括.git 扩展,进而导致不同的校验和,最终导致不同的缓存键。

      解决方案

      从我的本地计算机(即pod repo remove <name>)中删除私有存储库并重新添加它,确保将.git 扩展作为URL 的一部分(即pod repo add <name> https://my-vcs.com/path-to/repo.git)。

      关于使用上述后备方法的注意事项。这实际上导致了 Sandbox out of sync 错误,因为旧缓存包含不再与应用程序的当前状态对齐的 pod。所以我可能会避免使用这种技术。

      【讨论】:

        猜你喜欢
        • 2021-03-26
        • 1970-01-01
        • 2018-06-20
        • 1970-01-01
        • 1970-01-01
        • 2014-11-10
        • 2022-12-18
        • 1970-01-01
        • 2015-09-30
        相关资源
        最近更新 更多