使用 docker 和 bitbucket 管道的 android 环境

Posted

技术标签:

【中文标题】使用 docker 和 bitbucket 管道的 android 环境【英文标题】:android environment using docker and bitbucket pipelines 【发布时间】:2017-02-09 21:38:59 【问题描述】:

我对 Bitbucket 管道 (Beta) 和 docker 非常陌生。之前没有 CI 集成方面的经验

我关注了this的问题,但是对初学者没有明确的描述

我正在尝试使用 docker container 在 android 项目的 Bitbucket 管道中设置持续集成 (CI)

我想在这个容器中使用我以前的 android 项目

我遵循的步骤

第 1 步。安装了 Docker 软件工具。安装成功。

第 2 步。成功创建虚拟机

第 3 步。从 Kitematic (Beta) Uber/Android-Build-Environment创建容器

第 4 步。使用成功构建项目

$ eval "$(docker-machine env default)"

$ docker build -t uber/android-build-environment .

第 5 步。直接将工作改为android项目

第 6 步。运行此命令时,此步骤出现问题

docker run -i -v $PWD:/project -t uber/android-build-environment /bin/bash /project/ci/build.sh

错误来了

/bin/bash: /project/ci/build.sh: No such file or directory

Docker 机器详细信息

docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER    ERRORS
default   -        virtualbox   Running   tcp://192.168.99.100:2376           v1.12.1

Docker 服务

docker service ls

Docker Machine ENV

export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.XX.XXX:XXXX"
export DOCKER_CERT_PATH="/Users/gaurav/.docker/machine/machines/default"
export DOCKER_MACHINE_NAME="default"
# Run this command to configure your shell: 
# eval $(docker-machine env)

【问题讨论】:

【参考方案1】:

uber 的镜像是为他们的 CI 环境构建的,我创建了 a typical docker image only include Android build env。它包括最新的 SDK 和 NDK。您可以将以下示例用作您的 bitbucket-pipelines.yml

image: mingc/android-build-box:latest

pipelines:
  default:
    - step:
        caches:
          - gradle
        script:
          - chmod +x gradlew
          - ./gradlew assemble

你也可以通过特定的container在GitHub Actions中使用:

    runs-on: ubuntu-18.04
    container: mingc/android-build-box:latest

它包括以下组件:

Ubuntu 18.04 Android SDK 25 26 27 28 29 30 Android 构建工具: 25.0.0 25.0.1 25.0.2 25.0.3 26.0.0 26.0.1 26.0.2 27.0.1 27.0.2 27.0.3 28.0.1 28.0.2 28.0.3 29.0.2 29.0.3 30.0.0 Android NDK r21 Android 模拟器 测试NG Python 2、Python 3 Node.js、npm、React Native Ruby、RubyGems 快车道 科特林 颤动

您还可以使用此 docker 映像通过单个 docker run 命令构建您的 Android 项目:

cd <android project directory>  # change working directory to your project root directory.
docker run --rm -v `pwd`:/project mingc/android-build-box bash -c 'cd /project; ./gradlew build'

【讨论】:

我遇到了这个问题Error: Could not find or load main class org.gradle.wrapper.GradleWrapperMain你能给我任何线索吗? 你用的是哪个版本的gradle?你可以在本地环境中构建吗? 我使用最新的构建工具版本'com.android.tools.build:gradle:2.3.0'。 Gradle 版本是 3.3。它可以用我的 Android Studio 构建。您是否有与管道成功集成的示例应用程序的示例存储库? 是的,@thuanle,我已经成功集成到管道,配置和这里完全一样。 很抱歉这是一个私人仓库。您可以尝试通过 docker pull 映像在本地构建并运行命令来帮助您调试项目设置: docker run --rm -v pwd:/project mingc/android-build-box bash -c 'cd /项目; ./gradlew build'【参考方案2】:

您可以使用本指南:

https://github.com/danylovolokh/Setup-Free-Bitbucket-Cloud-CI

它非常详尽,它展示了如何:

    更新内部版本号、内部版本名称等... 更新 build.gradle 提交更改并将其推送到存储库 收集变更日志 构建应用程序

其他步骤:

    使用“发布”签名密钥对应用程序进行签名。 将 apk 文件上传到存储以供将来使用。 将版本上传到 Fabric Beta 以进行测试。

【讨论】:

【参考方案3】:

如果我正确理解您的问题:从技术上讲,您甚至不需要在本地计算机上安装 Docker 即可在您的 Bitbucket 管道中使用它(尽管它对调试很有帮助)。

Bitbucket Pipelines 可以配置为使用来自 Docker Hub 的 Docker,而您提到的那个 (uber/android-build-environment) 对我来说效果很好。

只需将bitbucket-pipelines.yml 添加到项目的根目录,例如:

image: uber/android-build-environment:latest

pipelines:
  default:
    - step:
        script:
          - build.sh

我喜欢在它自己的 ash 脚本文件 (build.sh) 中组织我的构建过程,但这是可选(您可以将多个项目符号命令放在 yaml 文件中的 @987654335 下@ 指令)。 bitbucket-pipelines.yml 文件的示例(以及更多详细信息)可以在 Language guides for Bitbucket Pipelines 页面上找到。

我的build.sh 脚本(也在项目的根目录中,但可以放在子目录中,只要您在bitbucket-pipelines.yml 中这样引用它,例如scripts/build.sh):

#!/bin/sh

mkdir "$ANDROID_HOME/licenses" || true
echo "8933bad161af4178b1185d1a37fbf41ea5269c55" > "$ANDROID_HOME/licenses/android-sdk-license"

./gradlew assembleDebug

许可证部分允许 Android Gradle 进程自动为您下载 Android 依赖项,如 answer 中所述。

为了更好的衡量,set the permissions on the build script 相应地:

git update-index --chmod=+x build.sh

确保您已启用 Bitbucket Pipelines(来自您的回购页面:Settings -> Pipelines: Settings -> Enable Pipelines)。

然后只需提交 bitbucket-pipelines.ymlbuild.sh 并推送到您的 BitBucket 存储库。为您的项目构建的 Bitbucket Pipelines 应该在您推送后不久开始。 Bitbucket Pipelines 将从 Docker Hub 下载 uber/android-build-environment Docker 并检查您的项目并在 Docker 中运行 build.sh 脚本。


如果您的 Bitbucket Pipelines 构建失败并且您希望在本地计算机上运行相同的环境,那么您所描述的在本地计算机上设置 Docker 的过程会非常有用,以便您可以对其进行试验并测试对build.sh 脚本在实际提交并推送到您的存储库之前。

如果您(在本地)运行,也可能会有所帮助:

docker run -it uber/android-build-environment

它将启动 Docker(在您的本地计算机上)并将您置于交互式 shell 中,以便您可以浏览并更好地了解 Docker 环境。

另外请注意,Bitbucket Pipelines 在 Docker 中克隆您的存储库,作为构建过程的一部分(据我所知),您没有在本地机器上运行的 Docker 上完成,这可能导致了一些您对您的 build.sh 脚本不存在感到困惑。

如果您希望本地机器上的目录存在于 Docker 中(您正在本地机器上运行,也许是为了在您想要使用的 Docker 中测试在本地机器上构建项目),您可以使用以下命令在本地运行的 Docker 中将当前工作目录挂载到 /project 的命令:

docker run -v `pwd`:/project -it uber/android-build-environment

更多详情请访问Mount a host directory as a data volume。

正如@ming-c 在他们的answer 中指出的那样,Docker Hub 上还有许多其他可用的 Docker 镜像;当然值得四处浏览,看看是否能找到最适合您需求的图片。

【讨论】:

感谢您提供非常好的解释答案,我会试试这个并确认它是否有效。 chmod +x build.sh - 这应该在构建器内部还是在我的本地机器上执行?我会假设在构建环境中,但是我得到一个Operation not permitted 如果我必须在我的本地机器上设置,我如何在 Windows 上执行 chmod? @morpheus05 我更新了答案以使用应该适用于所有平台的命令。该命令应该在您的本地机器上执行,基本上是告诉 git 存储 build.sh 应该是可执行的事实(因此,当项目被 Bitbucket Pipelines 为 Docker 克隆时,build.sh 将是可执行的)。 我遵循了这个但不能让它工作,它失败说:'你没有接受以下SDK组件的许可协议:[Android SDK Build-Tools 26.0.1,Android SDK Platform 25]。以前我需要修改 yml,特别是在 build.sh 行中:'bash ./build.sh',否则它说权限被拒绝。与 ./gradlew assembleDebug 相同,我修改为 'bash ./gradlew assembleDebug'。对可能发生的事情有任何想法吗? 错误日志以:FAILURE: Build failed with an exception结尾。 * 出了什么问题:配置项目 ':app' 时出现问题。 > 您尚未接受以下SDK组件的许可协议:[Android SDK Build-Tools 26.0.1, Android SDK Platform 25]。在构建您的项目之前,您需要接受许可协议并完成缺少的组件的安装使用 Android Studio SDK 管理器。或者,要了解如何将许可协议从一个工作站转移到另一个工作站,请访问 d.android.com/r/studio-ui/export-licenses.html【参考方案4】:

您的命令docker run -i -v $PWD:/project -t uber/android-build-environment /bin/bash /project/ci/build.sh 假定文件/project/ci/build.sh 在容器上。你确定你是从包含它的目录运行这个 docker 命令吗?

如果你不确定我会尝试(从你的项目目录)

docker run -it -v $PWD:/project uber/android-build-environment /bin/bash

然后在您登录到容器时检查ls -a /project 的结果。

要确保的另一件事是允许执行build.sh,通过在其上运行chmod +x build.sh 来确保这一点。

【讨论】:

以上是关于使用 docker 和 bitbucket 管道的 android 环境的主要内容,如果未能解决你的问题,请参考以下文章

来自 Docker 映像的 Bitbucket 管道缺少 NPM 模块

没有容器的 Bitbucket 管道

Bitbucket 管道因内存不足而失败,同时在 docker (Scala) 中使用 cassandra 进行测试

Docker 与 BitBucket

Docker BitBucket管道中缺少区域设置nl_NL

使用 bitbucket 管道进行量角器 e2e 测试