【问题标题】:android environment using docker and bitbucket pipelines使用 docker 和 bitbucket 管道的 android 环境
【发布时间】: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)

【问题讨论】:

    标签: android continuous-integration continuous-deployment bitbucket-pipelines


    【解决方案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

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

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

    其他步骤:

    1. 使用“发布”签名密钥对应用程序进行签名。
    2. 将 apk 文件上传到存储以供将来使用。
    3. 将版本上传到 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 来确保这一点。

      【讨论】:

        猜你喜欢
        • 2019-12-30
        • 2020-09-05
        • 2021-12-10
        • 2021-08-15
        • 2021-06-16
        • 2017-09-30
        • 1970-01-01
        • 1970-01-01
        • 2021-06-02
        相关资源
        最近更新 更多