如何在 Azure devops 管道中缓存 Android NDK?

How to cache Android NDK in Azure devops pipeline?

在 Azure devops 管道中创建任务时,我需要缓存 NDK 以减少构建时间。因此,我正在尝试为此编写一个任务。

例如,这是我用来缓存 gradle 和 konan 存储库的内容

variables:
  GRADLE_USER_HOME: $(Pipeline.Workspace)/.gradle
  KONAN_USER_HOME: /Users/runner/.konan

steps:
  - bash: env
    displayName: env vars

  - task: Cache@2
    inputs:
      key: 'gradle | "$(Agent.OS)"'
      restoreKeys: gradle
      path: $(GRADLE_USER_HOME)
    displayName: Gradle build cache

  - task: Cache@2
    inputs:
      key: 'konan | "$(Agent.OS)" | cache'
      restoreKeys: konan
      path: $(KONAN_USER_HOME)
    displayName: Konan build cache

他们工作得很好!

但是对于 NDK,我如何知道 我的 NDK 的相对存储库路径并缓存它,假设任务是这样的

  - task: Cache@2
    inputs:
      key: 'ndk | "$(Agent.OS)"'
      restoreKeys: ndk
      path: $(NDK_PATH)
    displayName: NDK build cache

这方面的任何帮助都非常有帮助。

How do I know the relative repository path for my NDK?

您可以使用环境变量 ANDROID_NDK_PATH 获取 NDK 的路径。

如果您使用的是 Microsoft hosted agent windows-latest 中预装的 ndk,ANDROID_NDK_PATH 的值为 C:\Program Files (x86)\Android\android-sdk\ndk-bundle

所以,我想通了,忘了在这里 post,这就是我找到的。 1 - 从 devops 设置中获取 android-ndk 的相对路径(我没有这些权限)。 2 - 然后 运行 缓存任务缓存到该路径

1 - 使用此 bash 输出获取相对环境变量。 CREDITS 所以在我写的步骤中:

steps:
  - bash: env
    displayName: env vars

打印所有可用的环境变量example gist with some vars intentionally removed 从那里我选择了与我的使用相关的路径

2021-01-19T16:17:44.4273060Z ANDROID_HOME=/Users/runner/Library/Android/sdk

2021-01-19T16:17:44.4276800Z ANDROID_SDK_ROOT=/Users/runner/Library/Android/sdk

2021-01-19T16:17:44.4320010Z ANDROID_NDK_18R_PATH=/Users/runner/Library/Android/sdk/ndk/18.1.5063045

2021-01-19T16:17:44.4328690Z ANDROID_NDK_HOME=/Users/runner/Library/Android/sdk/ndk-bundle

现在最相关的路径是 ANDROID_SDK_ROOT,因为这很有意义,然后将 /ndk 附加到它。

接下来是我的任务

2缓存任务:

  • 为路径创建变量 NDK_HOME: /Users/runner/Library/Android/sdk/ndk

并添加到完全像这样的缓存任务中

variables:
  GRADLE_USER_HOME: $(Pipeline.Workspace)/.gradle
  KONAN_USER_HOME: /Users/runner/.konan
  NDK_HOME: /Users/runner/Library/Android/sdk/ndk

pool:
  vmImage: 'macos-latest'

name: $(date:yyyy).$(Month)$(rev:.r)

steps:
  - bash: env
    displayName: env vars

  - task: Cache@2
    inputs:
      key: 'gradle | "$(Agent.OS)"'
      restoreKeys: gradle
      path: $(GRADLE_USER_HOME)
    displayName: Gradle build cache

  - task: Cache@2
    inputs:
      key: 'konan | "$(Agent.OS)" | cache'
      restoreKeys: konan
      path: $(KONAN_USER_HOME)
    displayName: Konan build cache

  - task: Cache@2
    inputs:
      key: 'ndk | "$(Agent.OS)"'
      restoreKeys: ndk
      path: $(NDK_HOME)/ndk
    displayName: NDK build cache

很有魅力

另一种方法 动态创建变量 。谢谢 那么我的任务看起来像

steps:
  - bash: env
    displayName: env vars

  - bash: echo "##vso[task.setvariable variable=ANDROID_SDK_ROOT;]$ANDROID_SDK_ROOT"

  - task: Cache@2
    inputs:
      key: 'ndk | "$(Agent.OS)"'
      restoreKeys: ndk
      path: $(ANDROID_SDK_ROOT)/ndk
    displayName: NDK build cache

以同样的方式工作