使用 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.yml
和 build.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 管道因内存不足而失败,同时在 docker (Scala) 中使用 cassandra 进行测试