问题和思路
目前存在的问题
打包操作由开发人员完成,这样开发进度容易被打断。
解决问题的思路
将打包操作交测试/产品/开发人员来完成,主要是测试/开发。
按照以上的思路,那么Jenkins+Gradle的解决方案是比较经济的,实现起来难度不大,下面我们详细介绍一下搭建过程。
搭建过程
服务器的准备
-
普通配置PC一台
-
安装ubuntu20.04(或者vmware虚拟ubuntu也可以)
-
可配置上网、关闭防火墙、开启ssh服务
docker安装Jenkins
在ubuntu下安装dokcer。使用下面的命令拉取Jenkins的docker镜像,这里我用的是lts的长期支持版本,你可以到Jenkins官网自由选择其他版本。
sudo docker pull jenkins/jenkins:lts
配置宿主机映射到容器的目录,之后jenkins的一些配置文件都将会存储到该目录下,这个目录可以自己定,但是我建议遵守我这样的规范,便于日后查找和管理。
-
sudo mkdir /home/jenkins_home # 创建jenkins_home目录
-
sudo chown zhq:zhq /home/jenkins_home #设置该目录的所有者和所属的组(zhq是常用登录到机器的账号)
ps:zhq是常用登录到机器的账号,这样为了避免一些有关操作权限的问题。
启动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
容器启动后,就可以访问ip:8080看到Jenkins首次运行的首页了,然后通过下面命令查看初始密码,填入之后跳转到安装插件的页面,选择第一个就好,会默认安装一些插件。
sudo cat /home/jenkins_home/secrets/initialAdminPassword
ps: 上面路径与在浏览器中访问Jenkins提示的地址不一样哦,那个是container中的地址,我们要查宿主机中映射的地址,见上面的命令,不要搞错。
插件安装很慢,所以我们要设置的插件的国内镜像url进行提速,具体自行寻找参考文章。
替换完成后,需要执行以下命令,重启容器:
-
sudo docker ps # 获取container 的id
-
sudo docker container restart 获取的container_id
再次访问Jenkins页面可以发现插件安装飞快。
创建一个自由风格的项目:
-
在项目配置中,添加git地址、分支名称
-
保存退出,回到项目列表,点击右侧的构建按钮
-
校验代码是否拉取成功
-
cd /home/jenkins_home/workspace
-
ls -l
-
drwxr-xr-x 12 zhq zhq 18 4月 21 16:28 HelloWorld # 如果展示了项目名称,代表拉取代码成功
-
暂停当前操作,我们先在本地使用Gradle打包,然后再和Jenkins进行结合
Gradle打本地包
下载解压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
配置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
现在来验证一下。以我们当前项目做例子,可执行下面命令:
~$ ./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下安装比较容易,在此不做详细说明了。
把Jenkins和Gradle进行结合
把打包命令写成一个脚本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
在Jenkins项目中添加构建shell,把刚才文件的绝对路径添加进去,下面我们就准确掉坑里了。
执行项目构建发现构建失败,提示test.sh没有找到,这是因为Jenkins执行的时候,是在容器中进行的,我们刚才那个路径在容器中不存在,我们需要把宿主机当作一台远程机器ssh到机器上执行脚本:
-
给Jenkins安装SSH插件
-
在系统管理-->系统配置中按照填写宿主机ip/端口/凭证(登录账号密码)如下图:
-
保存退出,重新构建
至此,这台机器已经可以成功打包了。
扫尾工作
安装存放到指定位置。对于上面提到的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
把列表发布到网络,可以通过浏览器访问:
-
使用docker安装lnmp服务器
-
映射apk存放目录到nignx服务器
以上内容不是很难,略掉了哈。
行动吧,在路上总比一直观望的要好,未来的你肯定会感 谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入扣群: 320231853,里面有各种软件测试+开发资料和技术可以一起交流学习哦。
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!