如何在CircleCI 2.0上处理Gradle缓存?

5
我们正试图为Android的build作业缓存所有Gradle依赖项。
这是目前失败的方法:
- restore_cache:
    key: android-build-{{ checksum "android/build.gradle" }}-{{ checksum  "android/app/build.gradle" }}
- save_cache:
    paths:
      - ~/.gradle
    key: android-build-{{ checksum "android/build.gradle" }}-{{ checksum  "android/app/build.gradle" }}

1
定义“失败”。 - Abhijit Sarkar
它没有保存缓存,而是一遍又一遍地创建。 - Sibelius Seraphini
缓存对我来说使用静态键运行良好,我保存了 .gradle.m2。你真的需要一个动态键吗?CircleCI没有解释缓存如何工作,但在 .gradle 中似乎没有任何动态内容需要生成动态键。如果Gradle包装器版本发生更改,则不会在 restore_cache 步骤中找到它,将被下载,并且缓存将在 save_cache 步骤中更新。 - Abhijit Sarkar
2个回答

2

这里有一个由Circle CI自己提供的Android配置示例以及属性的逐步演示。

version: 2
jobs:
  build:
    working_directory: ~/code
    docker:
      - image: circleci/android:api-25-alpha
    environment:
      JVM_OPTS: -Xmx3200m
    steps:
      - checkout
      - restore_cache:
          key: jars-{{ checksum "build.gradle" }}-{{ checksum  "app/build.gradle" }}
#      - run:
#         name: Chmod permissions #if permission for Gradlew Dependencies fail, use this. 
#         command: sudo chmod +x ./gradlew
      - run:
          name: Download Dependencies
          command: ./gradlew androidDependencies
      - save_cache:
          paths:
            - ~/.gradle
          key: jars-{{ checksum "build.gradle" }}-{{ checksum  "app/build.gradle" }}
      - run:
          name: Run Tests
          command: ./gradlew lint test
      - store_artifacts:
          path: app/build/reports
          destination: reports
      - store_test_results:
          path: app/build/test-results

值得注意的是,由于子模块的原因,我们在使用缓存时遇到了一些问题,但对于更简单的存储库,上述方法应该是可行的。

1

将构建步骤放置在restore_cachesave_cache之间。

如果您的项目是多模块/层级的,则哈希所有构建脚本并将其用作正确捕获依赖项的键:

  - run:
      name: Hash dependency info
      command: |
        mkdir -p build
        md5sum gradle.properties settings.gradle build.gradle **/build.gradle >build/deps.md5
  - restore_cache:
      key: gradle-{{ checksum "build/deps.md5" }}
  - run:
      name: Build and deploy
      command: >
        bash ./gradlew
        build artifactoryPublish
  - save_cache:
      key: gradle-{{ checksum "build/deps.md5" }}
      paths:
        - ~/.gradle/caches
        - ~/.gradle/wrapper

它不能正常工作,checksum "build/deps.md5" 在不同的CircleCI Jobs上每次返回不同的密钥。它是否检查创建/修改文件日期? 否则,我不明白为什么它会为相同的文件内容返回不同的密钥。 - Jc Miñarro
1
@JcMiñarro 这意味着文件的顺序不稳定,或者您每次构建时都更改构建文件(例如增加版本号)。 - gavenkoa
2
感谢 @gavenkoa 我已经查看了我的 deps.md5 输出,是的,它以不同的顺序存储了 md5 校验和。 我之前执行的命令是: find . -name "*.gradle" -type f | xargs md5sum > build/deps.md5 但是每次作业返回的文件顺序都不同,所以我使用以下命令对 find 的输出进行排序: find . -name "*.gradle" -type f | sort | xargs md5sum > build/deps.md5感谢您的帮助。 - Jc Miñarro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接