首页 文章

android环境使用docker和bitbucket管道

提问于
浏览
22

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

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

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

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

我遵循的步骤

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

Step 2 . 成功创建虚拟机

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

Successfully Docker full

Step 4 . 使用成功构建项目

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

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

enter image description here

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

Step 6. Problem is in this step while running this command

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

Error come

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

Error Image

Docker-machine details

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

Docker Service

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)

3 回答

  • 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
    

    我喜欢在它自己的灰脚本文件( build.sh )中组织我的构建过程,但这是可选的(您可以在 script 指令下的yaml文件中放置多个项目符号) . 有关 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管道(来自您的仓库页面: 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管道构建失败并且您希望在本地计算机上运行相同的环境,那么您在本地计算机上设置Docker的过程非常有用,这样您就可以对其进行试验并测试对 build.sh 脚本的更改在实际提交并推送到您的回购之前 .

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

    docker run -it uber/android-build-environment
    

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

    还要注意Bitbucket Pipelines在Docker中克隆你的repo作为构建过程的一部分(据我所知),你没有在你的本地机器上运行的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镜像可用;当然值得浏览,看看你是否能找到最适合你需求的图像 .

  • 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
    

    它包括以下组件:

    • 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

    • extra-android-m2repository

    • extra-google-m2repository

    • extra-google-google_play_services

    • Google API插件

    • Android模拟器

    • 约束布局

    • TestNG

    • Python 2,Python 3

    • Node.js,npm,React Native

    • Ruby,RubyGems

    • fastlane

    • Kotlin 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'
    
  • 12

    您的命令 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 来确保这一点 .

相关问题