以前写过一篇 jenkins+android打包实践, 但依赖主机系统,有时候不太方便;html
好比同事是windows,相关shell代码要改写成bat才成,android sdk也要从新安装和配置等;java
因此就想考虑使用dockerfile,一次编写处处使用,网上搜索了下没有找到满意的,就手撸一个;linux
整体使用下来, 感受是简便了不少,可是相比直接运行jenkins war包, 慢了不少,不晓得是我配置有问题仍是你们都这样?android
环境: macOS:10.13/Docker desktop:2.0.0.3git
jenkins_android_dockerfilegithub
# 使用docker命令前先启动docker服务: docker.app # 搜索镜像 docker search image_name # 下载镜像 docker pull image_name # 基于某镜像建立并运行容器,参考: http://www.runoob.com/docker/docker-run-command.html docker run -i -t ubuntu:15.10 /bin/bash # -i 容许你对容器内的标准输入 (STDIN) 进行交互 # -t 在新容器内指定一个伪终端或终端 # -d 后台运行 # -p 端口映射,格式为: 宿主主机端口:容器端口 # --name 为容器指定一个名称,如 --name="hello_container" # --dns 为容器指定dns服务器,默认和宿主一致,如 --dns 8.8.8.8 # -v /etc/localtime:/etc/localtime 让容器使用和服务器一样的时间设置 # 显示本地镜像列表 docker iamges # 删除某个镜像,假设存在某个image docker rmi [image_name | image_id] # 从新启动某个已中止的容器 docker start container_info -i docker start [container_name | container_id] [-option] docker restart [container_name | container_id] # 中止某个正在运行的容器 docker stop [container_name | container_id] # 显示运行中的容器 docker ps # 显示全部容器(包括已中止运行的) docker ps -a # 删除多个容器 docker rm container_id1 container_id2 # 批量删除全部退出的容器 sudo docker rm $(sudo docker ps -qf status=exited) # 查看指定容器内的日志 # -f 实时跟踪日志 docker logs [-f] container_name # 保存修改到容器,并在本地生成一个新的iamge docker commit [-m "msg"] [-a "author_name"] [container_name | container_id] new_image_name # 进入已运行的容器控制台 docker exec -it [-u root] [container_name | container_id] /bin/bash # 经过-u指定登陆帐号 docker attach [container_name | container_id] # 貌似ctrl+c后会把容器也一并中止掉 ==! # 在宿主主机和容器之间复制文件 docker cp [host_file_path] [container_id:target_path_on_container] # 复制主机文件/目录到容器指定路径下 docker cp [container_id:target_path_on_container] [host_file_path] # 复制容器中的指定文件到主机指定路径下 # 根据当前目录下的 Dockerfile 文件建立镜像 # 默认会使用缓存,经过 --no-cache = true 来禁用 docker build [--no-cache=true] -t [image_name] . # 使用默认的dockerfile文件名: Dockerfile docker build -t [image_name] -f ./dockerfile_name . # 查看容器中的环境变量 docker exec -it [container_name | container_id] env docker inspect [container_name | container_id] 复制代码
到jenkins官网 下载列表中,点击docker版本,会跳到 docker hub,根听说明就知道其镜像名称为: jenkins/jenkins
;docker
另外, jenkins是用java开发的, 其镜像中应该也已有了基础系统和jdk环境, 后续咱们能够不用另外安装;shell
同时, jenkins插件和全局工具配置选项中,能够直接安装gradle/jdk/git等工具,所以只有 android sdk须要在建立镜像时进行安装;ubuntu
官网如今没有直接提供完整的sdk压缩包,而是提供的sdkmanager工具,使用它来下载所需的其余组件;windows
sdkmanager --list # 列出可用的packages
sdkmanager "platform-tools" "platforms;android-28" # 安装指定的package,会自动下载到 sdkmanager所在 tools/ 同级目录下
复制代码
DockerFile 命令 ADD
能够将宿主主机上的某个文件复制到容器内,所以能够提早在宿主主机上下载好 android sdk, 而后使用该命令复制便可;
# 基于已有的镜像 jenkins/jenkins 来构建新镜像 FROM jenkins/jenkins # 设置变量 ENV USR_LOCAL="/usr/local" \ ANDROID_HOME="${USR_LOCAL}/AndroidSdk" \ SDK_TOOL_URL="https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip" # 建立android sdk目录,并下载 sdkmanager RUN mkdir -p ${ANDROID_HOME} \ && cd $ANDROID_HOME \ && curl -o sdk.zip $SDK_TOOL_URL \ && unzip sdk.zip \ && rm sdk.zip # 安装android sdk其余package, 输入y是由于此处会有一个licence,须要用户赞成后才会安装 RUN echo y | ${ANDROID_HOME}/tools/bin/sdkmanager "platform-tools" "platforms;android-28" "build-tools;28.0.3" # 设置环境变量: 把 android sdk 路径加入到 PATH 中 ENV PATH ${ANDROID_HOME}/tools:${ANDROID_HOME}/tools/bin:${ANDROID_HOME}/platform-tools:${PATH} 复制代码
建立好dockerfile后执行:
# 假设dockerfile文件名为: jenkins_android_dockerfile, 则会建立 my_jenkins 镜像 docker build -t my_jenkins -f ./jenkins_android_dockerfile . # 查看 my_jenkins 镜像是否建立 docker images | grep my_jenkins # 基于刚才建立的镜像(my_jenkins)构建新容器(container_name_jenkins_android),并运行 # -p 端口映射,格式为: 宿主主机端口:容器端口 # --name 为容器指定一个名称 # -v 目录挂载, 格式为: 宿主主机目录路径:容器内挂载路径 docker run -itd -p 8080:8080 -p 50000:50000 --name container_name_jenkins_android --privileged=true -v /Users/lynxz/host_path:/var/jenkins_home my_jenkins # 最后经过浏览器打开网址: http://localhost:8080 就可使用jenkins了 复制代码
看了下
/var/jenkins_home
目录(具体路径可经过查看环境变量JENKINS_HOME
得到), 整个jenkins插件/job等配置都在里面,须要迁移的时候应该能够直接复制, 我测试了下jobs/
是ok的;