我是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)
如果我正确理解你的问题:你在技术上甚至不需要在你的本地机器上安装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
)中组织我的构建过程,但这是可选的(你可以在yaml指令下的script
文件中放置多个项目符号)。有关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.yml
和build.sh
并推送到你的BitBucket回购。为您的项目构建的Bitbucket管道应该在推送后不久开始。 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图像可用;当然值得浏览,看看你是否能找到最适合你需求的图像。
优步的形象是为他们的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
它包括以下组件:
您还可以使用此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'
你的命令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
来确保这一点。
您可以使用本指南:
https://github.com/danylovolokh/Setup-Free-Bitbucket-Cloud-CI
它非常详尽,它显示了如何:
附加步骤: