android环境使用docker和bitbucket管道

Jav*_*ins 24 continuous-integration android continuous-deployment bitbucket-pipelines

我是Bitbucket管道(Beta)和docker的新手.没有以前的CI集成经验

我跟着这个问题,但对初学者没有明确的描述

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

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

我遵循的步骤

第1步.已安装的Docker软件工具.成功安装.

第2步.成功创建虚拟机

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

成功的Docker已满

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

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

$ docker build -t uber/android-build-environment .
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

第5步.改变直接工作到android项目

步骤6.运行此命令时出现问题

docker run -i -v $PWD:/project -t uber/android-build-environment /bin/bash /project/ci/build.sh
Run Code Online (Sandbox Code Playgroud)

错误来了:

/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
Run Code Online (Sandbox Code Playgroud)

Docker服务

docker service ls
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

Tra*_*vis 22

如果我正确理解你的问题:你在技术上甚至不需要在你的本地机器上安装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
Run Code Online (Sandbox Code Playgroud)

我喜欢在它自己的ash脚本文件(build.sh)中组织我的构建过程,但这是可选的(你可以在指令下的yaml文件中放置多个项目符号script).bitbucket-pipelines.yml可以在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
Run Code Online (Sandbox Code Playgroud)

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

为了更好地衡量,请相应地设置构建脚本的权限:

git update-index --chmod=+x build.sh
Run Code Online (Sandbox Code Playgroud)

确保您已启用Bitbucket管道(来自您的仓库页面:Settings- > Pipelines: Settings- > Enable Pipelines).

然后,只需提交bitbucket-pipelines.ymlbuild.sh推到你的到位桶回购.为您的项目构建的Bitbucket管道应该在推送后不久开始.Bitbucket Pipelines uber/android-build-environment将从Docker Hub 下载Docker并检查您的项目并build.sh在Docker中运行脚本.


如果您的Bitbucket管道构建失败并且您希望在本地计算机上运行相同的环境,那么您在本地计算机上设置Docker的过程可能非常有用,因此您可以先尝试使用它并测试build.sh脚本的更改实际上承诺并推送你的回购.

如果你跑(本地)可能也会有用:

docker run -it uber/android-build-environment
Run Code Online (Sandbox Code Playgroud)

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

还要注意Bitbucket Pipelines在Docker中克隆你的repo作为构建过程的一部分(据我所知),你没有在本地机器上运行的Docker上做过,这可能会引起你的一些混乱你的build.sh剧本没有出现.

如果您希望本地计算机上的目录存在于Docker中(您在本地计算机上运行,​​可能是为了测试在您想要使用的Docker中的本地计算机上构建项目),可以使用以下命令进行安装您当前正在/project运行的Docker中的当前工作目录:

docker run -v `pwd`:/project -it uber/android-build-environment
Run Code Online (Sandbox Code Playgroud)

可以在将主机目录挂载为数据卷时找到更多详细信息.

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


Min*_*g C 15

uber的图像是为他们的CI环境而构建的,我创建了一个典型的docker镜像,只包含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
Run Code Online (Sandbox Code Playgroud)

它包括以下组件:

  • Ubuntu 17.10
  • Android SDK 16 17 18 19 20 21 22 23 24 25 26 27 28
  • Android构建工具17.0.0 18.1.1 19.1.0 20.0.0 21.1.2 22.0.1 23.0.1 23.0.2 23.0.3 24.0.0 24.0.1 24.0.2 24.0.3 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
  • Android NDK r18b
  • 超Android的m2repository
  • 超谷歌,m2repository
  • 超谷歌,google_play_services
  • Google API插件
  • Android模拟器
  • 约束布局
  • TestNG的
  • Python 2,Python 3
  • Node.js,npm,React Native
  • Ruby,RubyGems
  • 快车道
  • 科特林1.3

您还可以使用此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'
Run Code Online (Sandbox Code Playgroud)


mic*_*doo 1

您的命令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