注1:Jenkins依赖于Java运行环境,所以安装Jenkins之前需要先安装Java
注2:本文使用svn来checkout代码
注3:打包完之后可将生成的apk传输到本机的ftp目录,将本机作为打包服务器
注4:假如本机ip地址为192.168.100.60,那么局域网内其他电脑访问192.168.100.60:8080和ftp://192.168.100.60/可以访问到本机的Jenkins和ftp目录。所以本机适合做一个打包服务器
1. 安装Jenkins
- 依次执行
wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins
2. 配置
- Jenkins默认端口是8080,如需修改,打开/etc/default/jenkins文件,将HTTP_PORT=8080修改为你需要的端口即可
3. 启动
- 执行命令(后面跟的是选项)
/etc/init.d/jenkins {start|stop|status|restart|force-reload}
- 复制初始密码
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
9b4e46e0c33e4e99b9bbc916a7adccac
- 访问并粘贴至localhost:8080以Unlock Jenkins
4. 安装插件
- 除安装推荐插件外,还可选择性安装以下插件
- git plugin
- SSH Credentials Plugin
- Git Changelog Plugin: 获取仓库提交的commit log
- build-name-setter:用于修改Build名称
- description setter plugin:用于在修改Build描述信息,在描述信息中增加显示QRCode(二维码)
- Post-Build Script Plug-in:在编译完成后通过执行脚本实现一些额外功能
- Gradle plugin: Android专用
安装方式也比较简单,直接在Jenkins的插件管理页面搜索上述插件,点击安装即可。
5. 全局配置
- 在 系统管理-->Global Tool Configuration 中配置JDK和Gradle路径,如下图所示
设置完成后保存,进入主面板
6. 新建项目
- 选择 新建-->构建一个自由风格的软件项目,输入项目名称后点击ok,进入项目面板
-
General设置如图2和图3
- 源码管理设置如图4
- 构建触发器设置如图5所示
重点总结基于Build periodically和Poll SCM的日期表写法
- 第一个参数代表的是分钟 minute,取值 0~59;
- 第二个参数代表的是小时 hour,取值 0~23;
- 第三个参数代表的是天 day,取值 1~31;
- 第四个参数代表的是月 month,取值 1~12;
- 最后一个参数代表的是星期 week,取值 0~7,0 和 7 都是表示星期天。
所以 0 表示的就是每个小时的第 0 分钟执行一次构建 H(25-30) 18 1-5: 工作日下午6点25到30分之间进行build H 23 1-5:工作日每晚23:00至23:59之间的某一时刻进行build H(0-29)/15 :前半小时内每隔15分钟进行build(开始时间不确定) H/20 :每隔20分钟进行build(开始时间不确定)
- 构建设置如图6和图7所示
- 全部设置完成后点击保存,进入Test项目面板
7. 使用命令行创建工作目录
注:这步是我自己在用的,先使用命令行将项目设置好,Jenkins中的项目就可以直接运行,省去了很多构建错误的麻烦。
- 首先设置环境变量,在~/.bashrc中增加ANDROID_HOME环境变量和gradle的PATH,比如我的是添加如下两行
export PATH=/home/whatsid/Studio/gradle-3.3/bin:$PATH
export ANDROID_HOME=/home/whatsid/Android/Sdk
-
上面图3中设置了Jenkins的工作目录,此时这个目录应该还没有被创建(如果已有也可以),顺序执行下面的命令行(有些命令需要改动某些部分,请注意)
注1:要看懂下面每行命令行的意思,否则容易出错,命令行都不难
注2:例如svn仓库的地址是svn://xxxxxxxxx/trunk,那么执行svn co命令的时候,check下来的代码会在trunk目录下,所以下面的命令行没有mkdir trunk,这点需要注意
注3:执行命令行的时候//以及后面的内容不要拷贝,这是注释
注4:执行完下面的命令后就会在~/Jenkins/launcher/trunk/app/build/outputs/apk下生成apk包
cd ~
mkdir Jenkins
sudo chmod -R 777 ~/Jenkins
cd Jenkins
mkdir launcher //假如有多个Jenkins项目,为了方便管理,每个项目有自己单独的工作目录,如果要创建第二个项目,就可以mkdir launcher2,不至于多个项目混在一起
sudo chmod -R 777 ~/Jenkins/launcher
cd launcher
svn co your_svn_address --username your_svn_username //执行这行后需要输入svn密码
cd trunk
svn upgrade
svn update
sudo chmod -R 777 ~/Jenkins/launcher
gradle clean
gradle assemble
sudo chmod -R 777 ~/Jenkins/launcher
- 也可以使用组合命令,一步到位
cd ~;mkdir Jenkins;sudo chmod -R 777 ~/Jenkins;cd Jenkins;mkdir launcher;sudo chmod -R 777 ~/Jenkins/launcher;cd launcher;svn co your_svn_address --username your_svn_username;cd trunk;svn upgrade;svn update;sudo chmod -R 777 ~/Jenkins/launcher;gradle clean;gradle assemble;sudo chmod -R 777 ~/Jenkins/launcher;
8. 执行完上面的命令行后,Jenkins项目面板中点击立即构建即可构建成功
构建过程中有可能遇到以下错误
问题1. the working copy at '/home/whatsid/Jenkins/launcher/trunk' is too old (format 8) to work with client version '1.9.3 (r1718519)' (expects format 31). You need to upgrade the working copy first.
解决办法:在/home/whatsid/Jenkins/launcher/trunk目录下执行svn upgrade
问题2. java.nio.channels.NonWritableChannelException
解决办法:给权限,sudo chmod -R 777 /home/whatsid/Jenkins/launcher/trunk
问题3. org.tmatesoft.svn.core.SVNException: svn: E200030: BUSY
解决办法:删除.svn文件夹再重试,sudo rm -rf /home/whatsid/Jenkins/launcher/trunk/.svn
9. 安装ftp服务(可选)
- 安装ftp
sudo apt-get install vsftpd
- 配置
首先执行
sudo gedit /etc/vsftpd.conf
然后添加
#允许匿名访问
anonymous_enable=YES
#接受本地用户
local_enable=YES
#允许上传
write_enable=YES
#用户只能访问限制的目录
chroot_local_user=YES
#设置固定目录,在结尾添加。如果不添加这一行,各用户对应自己的目录,当然这个文件夹自己建
local_root=/home/ftp
调整文件夹权限,避免“500 OOPS: vsftpd: refusing to run with writable root inside chroot()”
sudo chmod 777 /home/ftp
如果要将生成的apk放在/home/ftp/download/launcher中
cd /home/ftp
mkdir download
cd download
mkdir launcher
sudo chmod -R 777 /home/ftp/download
重启vsftpd
sudo service vsftpd restart
这样就可以用ftp://localhost/download/ 来访问本机的ftp文件夹了。看到的是local_root设置的/home/ftp,并且限制在该目录。
10. Jenkins项目自动打包生成的apk传入ftp文件夹下(可选)
- 在Jenkins的项目中添加如下配置并保存,如图8和图9
- 在/home/whatsid目录下新建launcher.sh,内容如下(除了第一行的#,其他的#及其后面的内容都是注释,不需要):
#! /bin/bash
datename=$(date +%Y%m%d_%H:%M:%S) #生成20170606_14:20:35格式的时间戳
mkdir -p /home/ftp/download/launcher/$datename #生成时间戳为名称的文件夹
#将生成的apk、logs、mapping三个文件夹拷贝到生成的文件夹中
cp -r /home/whatsid/Jenkins/launcher/trunk/app/build/outputs/apk/ /home/ftp/download/launcher/$datename
cp -r /home/whatsid/Jenkins/launcher/trunk/app/build/outputs/logs/ /home/ftp/download/launcher/$datename
cp -r /home/whatsid/Jenkins/launcher/trunk/app/build/outputs/mapping/ /home/ftp/download/launcher/$datename
#删除生成的文件夹,以免下次重复拷贝
rm -rf /home/whatsid/Jenkins/launcher/trunk/app/build/outputs/apk
rm -rf /home/whatsid/Jenkins/launcher/trunk/app/build/outputs/logs
rm -rf /home/whatsid/Jenkins/launcher/trunk/app/build/outputs/mapping
- 给launcher.sh执行权限
sudo chmod -R 777 /home/whatsid/launcher.sh
- 点击立即构建即可构建项目并将生成的apk文件传输到ftp文件夹下