alwaystest / Blog

24 stars 2 forks source link

GitLab CI与Docker,License更新问题 #50

Open alwaystest opened 7 years ago

alwaystest commented 7 years ago

GitLab CI与Docker,License更新问题

标签(空格分隔): CI 持续集成 Android License


之前一直正常使用的CI环境突然报错,提示如下:

You have not accepted the license agreements of the following SDK components [Android Support Repository].

很奇怪,之前项目中也引用了Support包,一直没有报错,怎么突然就报错了。

检查之后发现,项目新加的一个第三方依赖依赖了SupportXXX:25.0.0,而项目中之前依赖的是SupportXXX:24.X.X,而构建Docker镜像的时候Support25包还没有出来,容器中使用的是24的版本,根据这里说Gradle会尝试下载依赖,但是License是Gradle没有解决掉的。所以这里就报错说没有接受SDK的License。

Android官方没有对命令行使用SDK管理工具进行详细的说明,查到有一个网页文档是过期了的,自动跳转到了最新的文档中,只说明了使用GUI更新SDK。

StackOverflow上说更新Support库的命令是

echo y | android update sdk --no-ui --all --filter extra-android-m2repository

很奇怪,没有版本,不像更新SDK的命令android-24这样子的。我猜想是默认extra-android-m2repository:latest这样子的。

把之前的Docker image删掉,重新生成一次镜像即可更新。此处注意Docker生成镜像的时候有缓存机制,要确保不要使用缓存来build镜像。

还有一个值得注意的地方是

The sdkmanager tool is provided in the Android SDK Tools package (25.2.3 and higher)

还没有看sdkmanagerandroid命令有什么区别。

alwaystest commented 7 years ago

由于sdkmanager是最新提供的 SDK管理工具,所以研究了一下。

感觉上使用sdkmanager更好用一些。

因为上文写到android工具后面的--filter参数我没有找到是怎么确定的,更新的话,--filter的参数不好找。而sdkmanager的用法就清晰多了。

使用sdkmanager --help命令就可以很方便的查看用法。

根据用户指南(SDK 的installupdate方法都可以参考这里):

The packages argument is an SDK-style path as shown with the --list command, wrapped in quotes (for example, "build-tools;25.0.0" or "platforms;android-25"). You can pass multiple package paths, separated with a space, but they must each be wrapped in their own set of quotes.

这下子就知道命令行如何安装和更新SDK了。

Docker镜像使用注意

sdkmanager这个工具是Android SDK Tools 25.2.3以上才提供的,使用别人提供的Docker镜像的时候注意看一下。

比如我使用的是snowdream(Github)提供的镜像,Dockerfile里面是这么写的:

# Download and untar Android SDK
ENV ANDROID_SDK_URL http://dl.google.com/android/android-sdk_r24.4.1-linux.tgz
RUN curl -sSL "${ANDROID_SDK_URL}" | tar --no-same-owner -xz -C ${SDK_HOME}

这个是使用sdk 24.4.1的基础包来下载SDK的,这个包没有sdkmanager