Android开发如何使用Docker为Jenkins持续集成助力

news2024/9/23 1:23:30

Android开发如何使用Docker为持续集成助力

为什么使用Docker

我为啥要使用到Docker呢?其实也是被动的,因为公司的项目托管在Coding上面,然后Jenkins集成也用的是Coding的,Coding默认提供了Android-29,JDK-8的构建环境,我们的项目之前也是配置的TargetApi=29,所以正好能用;但是最近因为一些不可明说的原因,将gradle升级到了7.4,JDK升级到了11,TargetApi也提到了31,以及一些Google依赖库更新了版本,这样就要求编译环境必须使用JDK 11,所以Coding上提供的默认构建环境就不能使用了。
最后问了下Coding客服,能不能再提供个高版本api的构建环境,得到的答复是自己动手提交合适的Docker镜像。
在这里插入图片描述
既然这样,就只能自己构建需要的环境提交到Coding上使用了
在这里插入图片描述

认识Docker

如果仅仅是为了给我们Jenkins集成提供特定编译环境的镜像,只需要大概了解下Docker是什么就差不多了,毕竟我们的关注点还是Android开发嘛,要把有限的生命投入到… 呃呃,不是,把有限的精力投入到搬砖事业中。

那Docker是什么呢?可以粗浅理解成它就像个里面装了很多东西的盒子,如果其他人要用,那就直接把这个盒子拿走捣鼓捣鼓就可以用了,而不需要自己再重新吭哧吭哧把需要的东西一个个装到盒子里。

再说点正经的,Docker里有几个概念需要先了解下,理解了这几个概念,就理解了 Docker 的整个生命周期。:

  • 镜像(Image)
    Docker的镜像概念类似于虚拟机里的镜像(比如.IOS文件),是一个只读的模板,一个独立的文件系统,包括运行容器所需的数据,可以用来创建新的容器。
    例如:一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了MySQL或用户需要的其它应用程序。
    这里的镜像就如虚拟机创建时候使用的镜像类似。这个镜像便于移动,并且这个镜像我们可以交给任何人使用,其他人使用的时候也很方便,只需要将其实例化即可。

  • 容器(Container)
    Docker容器是由Docker镜像创建的运行实例,类似VM虚拟机,支持启动,停止,删除等。
    每个容器间是相互隔离的,容器中会运行特定的应用,包含特定应用的代码及所需的依赖文件。
    容器就类似与虚拟机中我们创建好的虚拟机系统,之后我们所有的操作都是在容器中进行的,我们的程序也是运行在容器中。

  • 仓库(Repository)
    镜像便于传播,而仓库就是专门用来传播这些镜像的地方,他有点类似与Github,或者你可以把他看成一个存放各种镜像的镜像商店
    Docker官方的仓库: 他的服务器处于国外,所以下载速度较慢,不过我们可以通过换源解决。
    Daocloud国内仓库: 国内也有一些优秀的商店,他和Docker官方的仓库的区别类似与Github和Gitee的区别

Docker使用流程

了解了是什么(What)之后,就需要知道怎么用了(How),想成功构建Android项目,一般是这么几个步骤:

  1. 安装Docker Desktop
  2. 编写dockerfile
  3. 构建docker镜像
  4. 运行Docker容器
  5. 构建Android项目

Docker Desktop

Docker Desktop 是一款适用于 Mac 或 Windows 环境的易于安装的桌面应用程序,使您能够在几分钟内开始编码和容器化。Docker Desktop 包含了从您的机器构建、运行和共享容器化应用程序所需的一切。

Docker Desktop for Mac

Docker 官网下载 Docker Desktop for Mac 可能比较慢,需要的同学可以联系我

成功安装 Docker Desktop 后,打开一个终端,运行 docker --version 来检查机器上安装的 Docker 版本。接下来可以运行如下命令检验下安装结果是否正常

docker run hello-world

hello-world是官方镜像,如果你的终端显示像我这样那就没问题了

mango@mangodeMacBook-Pro ~ % docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

客户端是长这个样子的
在这里插入图片描述
我们一般只用关注前面两个就行了,第一个Containers/Apps是当前环境下存在的容器列表,第二个Images是当前环境里的存在的镜像列表。

Dockerfile

大家是不是对这种命名风格有点熟悉?比如c/c++里的makefile,makefile是干嘛的,它是用来自动化编译 C/C++ 项目,内部描述了 C/C++ 工程的编译规则,只需要一个 make 命令,整个工程就开始自动编译,不再需要手动执行 GCC 命令。其实像我们经常接触的CMakeLists.txt文件功能也是类似的,描述编译步骤。

所以Dockerfile的功能也就出来了,就是用来告诉Docker如何构建一个Docker镜像的文件,里面包含了一条条构建镜像所需的指令和说明。

先把我的内容贴上来

FROM centos:latest

RUN yum update -y
RUN yum install -y curl \
    && yum install -y wget \
    && yum install -y zip \
    && yum install -y unzip \
    && yum install -y tar \
    && yum install -y lsof \
    && yum install -y git
    
WORKDIR /home

RUN yum install -y java-11-openjdk-devel

RUN wget https://services.gradle.org/distributions/gradle-7.4-bin.zip
RUN unzip gradle-7.4-bin.zip
RUN cp -r gradle-7.4 /usr/lib

RUN wget https://dl.google.com/android/repository/commandlinetools-linux-9123335_latest.zip
RUN unzip commandlinetools-linux-9123335_latest.zip
RUN mkdir Android
RUN cp -r cmdline-tools /home/Android/

WORKDIR /home/Android/cmdline-tools
RUN mkdir latest
RUN mv bin/ lib/ NOTICE.txt source.properties -t latest/

WORKDIR /home/Android/cmdline-tools/latest/bin
RUN yes | ./sdkmanager "build-tools;33.0.1" "build-tools;30.0.3" "platforms;android-33" "platform-tools"

接下来对内容做具体说明:

FROM centos:latest

我们构建的镜像一般都是基于已有的镜像,而FROM命令就是表面我们的镜像是基于centos构建的

RUN yum update -y
RUN yum install -y curl \
    && yum install -y wget \
    && yum install -y zip \
    && yum install -y unzip \
    && yum install -y tar \
    && yum install -y lsof \
    && yum install -y git

RUN的作用看名字就知道了,是用来运行后面的命令的,这里的语句是安装一些常用的linux工具

WORKDIR /home

有的时候我们下载工具需要放到指定目录,而WORKDIR的作用就是这个,指定当前的工作目录,如该目录不存在, WORKDIR 会帮你建立目录,接下来的命令都在这个目录执行。

RUN yum install -y java-11-openjdk-devel

这条语句就是用来安装jdk11,因为我的项目是基于AGP 7.X的

RUN wget https://services.gradle.org/distributions/gradle-7.4-bin.zip
RUN unzip gradle-7.4-bin.zip
RUN cp -r gradle-7.4 /usr/lib

这里是下载gradle文件,然后拷贝到指定目录;当然你如果使用gradlew来执行gradle命令,这一步可以省略

RUN wget https://dl.google.com/android/repository/commandlinetools-linux-9123335_latest.zip
RUN unzip commandlinetools-linux-9123335_latest.zip
RUN mkdir Android
RUN cp -r cmdline-tools /home/Android/
WORKDIR /home/Android/cmdline-tools
RUN mkdir latest
RUN mv bin/ lib/ NOTICE.txt source.properties -t latest/
WORKDIR /home/Android/cmdline-tools/latest/bin
RUN yes | ./sdkmanager "build-tools;33.0.1" "build-tools;30.0.3" "platforms;android-33" "platform-tools"

这些语句是下载sdkmanager命令行工具,然后用它来下载Android Sdk

Docker镜像

dockerfile写完了,就可以用它来构建镜像了,这时候需要使用build命令

docker build -t android-build:v1 .

-t是用来指定镜像的name和tag;后面的点号就是根据当前目录的dockerfile来构建镜像,也可以通过-f来指定Dockerfile的完整路径。

构建结束后可以通过docker images命令来查看当前存在的镜像
在这里插入图片描述

Docker容器

镜像只是一个只读类型的文件,而我们的环境不可能只是一个这样的文件,所以我们需要把这个镜像加载成我们的环境,也就是让他变成容器。而创建容器就需要使用到run命令:

docker run [可选参数] 镜像名 [向启动容器中传入的命令]

我这里使用到的完整命令比较简单:

docker run -it --name box -v /Users/mango/Docker/project:/home/project android-build:v1 /bin/bash
  1. –name是指定容器名称。
  2. -v表示目录映射关系,这里是将宿主机的/Users/mango/Docker/project和容器的/home/project建立映射关系,后面就不需要在容器里下载项目等东西了。
  3. 追加/bin/bash,这样在创建容器后就可以进入容器shell命令界面,方便进入后续操作。

容器创建后可以使用docker ps命令来查看当前存在的容器

构建Android项目

运行项目之前需要在容器终端配置下JDk的环境变量

export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.13.0.8-4.el8_5.x86_64
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

然后再 配置下SDK的环境变量

export ANDROID_HOME=/home/Android
export PATH=$ANDROID_HOME/platform-tools:$ANDROID_HOME/cmdline-tools/latest/bin:$PATH

还记得我刚才运行容器做的目录映射吗

/Users/mango/Docker/project:/home/project

那么我只需要在自己电脑的/Users/mango/Docker/project目录上把工程下载好,就可以在容器的/home/project目录看到了,最后就可以通过assembleRelease来进行打包看看环境是否安装成功了

所有准备操作一切就绪,接下来就可以把镜像文件推送到Coding的Docker仓库了,当然了,大家也可以推送到Docker的官方仓库Docker Hub

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/98794.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JAVA进阶】多态,内部类

📃个人主页:个人主页 🔥系列专栏:JAVASE基础 目录 一、多态 1.多态的概述 2.多态的优势 3.类型转换问题 二、内部类 1.内部类概述[了解] 2.静态内部类[了解] 3.成员内部类[了解] 4.匿名内部类概述[重点] 一、多态 1.多态…

树状数组经典例题

目录 1.数星星 2.小朋友排队 3.求逆序对 1.数星星 题目描述 天空中有一些星星,这些星星都是在不同的位置,每个星星都有一个坐标。 如果一个星星的左下方(包含正左和正下)有k颗星星,就说这颗星星是k级的。 例如,上图中星星5是3级的(1,2,4在它的左下),星星2,4是1级的。…

idea中推送本地仓库和远程仓库后代码回退

本地仓库代码提交后回退 提交到本地仓库后 点击提交后会保存在本地仓库 本地仓库的回撤 找到git的提交记录 右键选择撤销还原 撤销还原后会出现提交文件,成功将本地仓库的文件移除,但是本地的错误代码仍然存在 如果想撤销提交到本地仓库的错误文…

SOLID 设计原则 - 这篇最容易消化

面向对象设计原则 SOLID 应该是职业程序员必须掌握的基本原则,每个程序员都应该了然于胸,遵守这 5 个原则可以帮助我们写出易维护、易拓展的高内聚低耦合的代码。 它是由罗伯特C马丁(知名的 Rob 大叔)21世纪初期 (准确来说,2000年在他的论文…

DevOps实战系列【第十章】:详解Jenkins Pipeline基本概念和语法

个人亲自录制全套DevOps系列实战教程 :手把手教你玩转DevOps全栈技术 流水线基本概念 官方中文手册: https://www.jenkins.io/zh/doc/book/pipeline 我们最好在结合英文文档去看,因为翻译过来的中文比较乱。 Jenkins pipeline是一套插件&…

MySQL 日志,难怪被模仿

一.前言 日志是mysql数据库的重要组成部分,记录着数据库运行期间各种状态信息。mysql日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。 通过分析日志,我们可以优化数据库性能,排除故障,甚至能够还原数…

中文文献检索网站

1. 中国知网 网址: https://www.cnki.net/ 中国知网被称众多科研人称国内文献论文最全最权威的中文文献库,知网提供中国学术文献、外文文献、学位论文、报纸、会议、年鉴、工具书等各类资源统一检索、统一导航、在线阅读和下载服务。 2. 掌桥科研 网址…

25.Django大型电商项目之地址管理——如何使用三级联动菜单数据加载地址、保存数据、动态获取数据、设置默认值

1. 地址管理基本页面 1.1 概述 1.2 流程 修改templates的跳转链接center.html <ul><li><a href"/userapp/address/">地址管理</a></li> </ul>templates {% extends base.html %} {% block title %}用户中心{% endblock %} {…

东北大学数据结构第八周(排序)

7-1 快速排序 作者 朱允刚 单位 吉林大学 给定包含n个元素的整型数组a[1],a[2],…,a[n]&#xff0c;利用快速排序算法对其进行递增排序&#xff0c;请输出排序过程&#xff0c;即每次Partition之后的数组。每次选择所处理的子数组的第一个元素作为基准元素。 输入格式: 输入为…

MapReduce 序列化案例

文章目录MapReduce 序列化案例一、案例需求二、案例分析map 阶段Reduce 阶段三、代码实现1、编写流量统计的Bean对象2、Mapper阶段代码MapReduce 序列化案例 一、案例需求 1、需求&#xff1a; 统计每一个手机号耗费的总上行流量&#xff0c;下行流量&#xff0c;总流量 2、输…

二、ZFNet可视化卷积神经网络——可解释性机器学习(DataWhale组队学习)

目录引言ZFNet的网络结构可视化反卷积反池化反激活反卷积训练细节特征可视化特征演化特征不变性局部遮挡测试敏感性分析相关性分析消融实验宽度影响深度影响迁移学习能力有效性分析总结引言 纽约大学ZFNet&#xff0c;2013年ImageNet图像分类竞赛冠军模型。对AlexNet进行改进的…

AOP 操作

AOP 操作AOP 操作&#xff08;准备&#xff09;1. Spring 框架一般是基于 AspectJ 实现 AOP 操作&#xff08;1&#xff09;什么是 AspectJ2. 基于 AspectJ 实现 AOP 操作3. 在项目工程里面引入 AOP 先关的依赖4. 切入点表达式举例1&#xff1a;对 com.fairykunkun.dao.UserDao…

谈谈自己对依赖注入的理解

1. 絮絮叨叨 1.1 想学习Google Guice 在工作的过程中&#xff0c;发现有名的大数据组件Presto大量使用Google Guice实现各种Module的构建 很多bind(interface).to(implementClass).in(scope)语句&#xff0c;实现接口与实现类的绑定&#xff0c;并指定实现类是单例还是多例 /…

Service的绑定过程

前言 Service的绑定过程将分为两个部分来进行讲解&#xff1b;分别是Contextlmpl到AMS的调用过程和Service的绑定过程。 frameworks/base/core/java/android/content/ContextWrapper.javapublic boolean bindService(Intent service, ServiceConnection conn,int flags) {ret…

计算机毕设Python+Vue-新型冠状病毒防控咨询网站(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

根据端口划分虚拟局域、集线器、中继器、交换机、路由器、网桥----计算机网络

集线器&#xff1a; 连接计算机和交换机&#xff0c;类似于多台中继器。 实现多台电脑的同时使用一个进线接口来上网或组成局域网 中继器&#xff1a; 连接两条电缆&#xff0c;作用是放大前一条电缆里面的信号并传入下一条电缆。 是对接收到的信息进行再生放大&#xff0c;以…

Jenkins + Jmeter + Ant 持续集成

搭建提前安装好&#xff1a;ant Jenkins 环境 一、Jenkins 安装 Ant 插件&#xff1a; 进入Jenkins 配置插件页面&#xff0c;安装ant 插件&#xff1a; 打开插件配置页面&#xff0c;如下图&#xff1a; 点击“Available” 在输入框搜索 ant 安装即可&#xff1a; 二、安装…

计算机毕业设计springboot+vue基本微信小程序的透析耗材管理系统

项目介绍 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理程序应运而生,各行各业相继进入信息管理时代,透析耗材管理小程序就是信息时代变革中的产物之一。 任何程序都要遵循…

vue前端案例教学:动态获取最新疫情数据展示(代码详解)

【辰兮要努力】&#xff1a;hello你好我是辰兮&#xff0c;很高兴你能来阅读&#xff0c;昵称是希望自己能不断精进&#xff0c;向着优秀程序员前行&#xff01; 博客来源于项目以及编程中遇到的问题总结&#xff0c;偶尔会有读书分享&#xff0c;我会陆续更新Java前端、后台、…

[leetcode.4]寻找两个正序数组的中位数 多思考边界

题目展示 题目要点 题目其实本身的思路非常简单&#xff0c;就是把两个数组给合并起来&#xff0c;然后寻找中位数&#xff0c;具体可以参考我们使用归并排序时候的最后一步&#xff0c;这题的难点其实在于&#xff08;1&#xff09;时间压缩到lognm&#xff08;2&#xff09;…