利用jenkins+grdle完成Android项目打包

1. 问题和思路

目前存在的问题:

  • 打包操作由开发人员完成,这样开发进度容易被打断

解决问题的思路:

  • 将打包操作交测试/产品/开发人员来完成,主要是测试/开发

按照以上的思路,那么jenkins+gradle的解决方案是比较经济的,实现起来难度不大,下面我们详细介绍一下搭建过程

2. 搭建过程

2.1. 服务器的准备
  • 普通配置PC一台
  • 安装ubuntu20.04(或者vmware 虚拟ubuntu也可以)
  • 可配置上网;关闭防火墙;开启ssh服务
2.2 docker安装jenkins

2.2.1 在ubuntu下安装dokcer(略)

2.2.2 使用下面的命令拉取jenkins的docker镜像,这里我是用的是lts的长期支持版本,你可以到jenkins官网自由选择其他版本

sudo docker pull jenkins/jenkins:lts

2.2.3 配置宿主机映射到容器的目录,之后jenkins的一些配置文件都将会存储到该目录下,这个目录可以自己定,但是我建议遵守我这样的规范,便于日后查找和管理

sudo mkdir /home/jenkins_home            # 创建jenkins_home目录
sudo chown  zhq:zhq /home/jenkins_home      #设置该目录的所有者和所属的组(zhq是常用登录到机器的账号)

ps zhq是常用登录到机器的账号,这样为了避免一些有关操作权限的问题

2.2.4 启动jenkins的docker镜像,并设置相关参数,参数解释:

-d 表示以后台模式运行
--name 为容器定义一个名字(后面可以代替容器id使用)
-p 表示映射容器的端口到宿主机的端口
-v 表示映射宿主机的目录到容器的目录
-u zhq 使用zhq用户运行,与登录到ubuntu的账号一致,避免后面出现的一些执行权限问题
-v /home/jenkins_home:/var/jenkins_home 映射jenkins_home,将数据存储到宿主机,这样配置就不会随容器丢失
-v /var/run/docker.sock:/var/run/docker.sock 与 -v /usr/bin/docker:/usr/bin/docker 把宿主机docker 映射到容器内,可以直接在容器内使用宿主机docker
-v /usr/lib/x86_64-linux-gnu/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7 \ 容器内docker运行需要的库文件
-v /opt:/opt \ 自主安装的一些运行时软件(如java/maven/git...)
-v /etc/timezone:/etc/timezone映射时区文件,保证容器的时区和宿主机相同(官网的jenkins容器时区不是中国的时区)
最后的jenkins/jenkins:lts是要启动的镜像

sudo docker run -d  --name jenkins -p 8080:8080 -p 50000:50000  -u $(id -u) \
  -v /home/jenkins_home:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker \
  -v /usr/lib/x86_64-linux-gnu/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7 \
  -v /opt:/opt \
  -v /etc/timezone:/etc/timezone jenkins/jenkins:lts

ps: 可使用以下命令查看container 是否运行成功:

$ sudo docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                                              NAMES
3c20dfcbb16e        jenkins/jenkins:lts   "/sbin/tini -- /usr/…"   2 minutes ago       Up 2 minutes        0.0.0.0:8080->8080/tcp, 0.0.0.0:50000->50000/tcp   jenkins

2.2.5 容器启动后,就可以访问ip:8080看到jenkins首次运行的首页了,然后通过下面命令查看初始密码,填入之后跳转到安装插件的页面,选择第一个就好,会默认安装一些插件

sudo cat /home/jenkins_home/secrets/initialAdminPassword

ps: 上面路径与在浏览器中访问jenkins提示的地址不一样哦,那个是container中的地址,我们要查宿主机中映射的地址,见上面的命令,不要搞错。

2.2.6 插件安装很慢,所以我们要设置的插件的国内镜像url进行提速,具体可参考文章:
https://www.cnblogs.com/hellxz/p/jenkins_install_plugins_faster.html
替换完成后,需要执行以下命令,重启容器:

sudo docker ps    # 获取container 的id
sudo docker container restart 获取的container_id

再次访问jenkins页面可以发现插件安装飞快

2.2.7 创建一个自由风格的项目

  • 在项目配置中,添加git地址,分支名称
  • 保存退出,回到项目列表,点击右侧的构建按钮
  • 校验代码是否拉取成功
cd /home/jenkins_home/workspace
ls -l
drwxr-xr-x 12 zhq zhq 18 4月  21 16:28 HelloWorld   # 如果展示了项目名称,代表拉取代码成功
  • 暂停当前操作,我们先在本地使用gradle打包,然后再和jenkins进行结合
2.3 gradle打本地包

2.3.1 下载解压java SDK, Android SDK 和gradle

~$ mkdir soft
~$ cd soft
~$ wget ftp://biguser:www.jb51.net@big.gxkjbg.com:8021/201704/tools/jdk-linux-x64.tar.gz
~$ wget http://dl.google.com/android/android-sdk_r24.4.1-linux.tgz
~$ wget https://services.gradle.org/distributions/gradle-5.4.1-all.zip
~$ tar -zxvf jdk-linux-x64.tar.gz -C /opt/java/
~$ tar -zxvf android-sdk_r24.4.1-linux.tgz
~$ unzip gradle-5.4.1-all.zip

2.3.2 配置java,android环境变量

~$ sudo vim /etc/profile

在文件底部添加以下内容:

export JAVA_HOME=/opt/java/jdk1.8.0_131
export PATH=${JAVA_HOME}/bin:${PATH}
export ANDROID_HOME=/home/zhq/soft/android-sdk-linux

保存退出后,导入新的配置:

~$ source /etc/profile

2.3.3 验证
以我们当前项目做例子,可执行下面命令:

~$ ./soft/gradle-5.4.1/bin/gradle --parallel -b /home/jenkins_home/workspace/HelloWorld/build.gradle assemble_test

其中:
/home/jenkins_home/workspace/ 是文中jenkins用来存放项目代码的目录;
/HelloWorld/build.gradle 我们项目build.gradle所在目录,如果打包其他项目应做响应替换;
assemble_test 是项目的buildType,一般都会有assembleDebug 和 assembleRelease,项目不同可能会有其他类型,比如我们用到的assemble_test

以上操作,有错误产生,和当前所使用的android SDK 没有升级相关版本有关系,由于下载的Android SDK无法启动android SDK manger,所以我安装了android studio,在启动的时候提示指定SDK路径,启动已经下载了的项目,按照提示更新SDK即可。
android studio 在ubuntu下安装比较容易,在此不做详细说明了。

2.4 把jenkins和gradle进行结合

2.4.1 把打包命令写成一个脚本test.sh

#!/bin/bash +x
. /etc/profile   
~/soft/gradle-5.4.1/bin/gradle --parallel -b /home/jenkins_home/workspace/HelloWorld/build.gradle 

保存退出后,增加执行权限:

chmod +x test.sh

2.4.2 在jenkins项目中添加构建shell

把刚才文件的绝对路径添加进去,下面我们就准确的 掉坑里了 ,执行项目构建发现构建失败,提示test.sh没有找到,这是因为jenkins执行的时候,是在容器中进行的,我们刚才那个路径在容器中不存在,我们需要把宿主机当作一台远程机器ssh到机器上执行脚本:

  • 给jenkins安装SSH插件
  • 在系统管理-->系统配置中按照填写宿主机ip/端口/凭证(登录账号密码)如下图


    配置样图
  • 保存退出,重新构建

至此,这台机器已经可以成功打包了。

2.5 扫尾工作
  1. 安装存放到指定位置
    对于上面提到的test.sh可以进行修改,把apk放到指定位置,代码修改如下:
#!/bin/sh +x
.  /etc/profile
~/soft/gradle-5.4.1/bin/gradle --parallel -b /home/jenkins_home/workspace/Hellworld/build.gradle assemble_test



app_path='/home/jenkins_home/workspace/{项目apk存放的位置,根据项目不同进行修改替换}'
target_path='/home/zhq/webroot/apks/'     # 此处是自定义存放位置

if [ "`ls -A ${app_path}`" = "" ];
then
        echo "${app_path} is empty"
else
        mv $app_path/*.apk $target_path
        rm -rf $app_path/*
fi
  1. 把列表发布到网络,可以通过浏览器访问:
  • 使用docker 安装lnmp服务器
  • 映射apk存放目录到nignx服务器

以上内容不是很难,略掉了哈

3. 鸣谢

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355

推荐阅读更多精彩内容