Jenkins+gradle+git实现Android的自动化构建

前言

最近公司需求,需要部署jenkins方便运营自己打包不同渠道的apk去发布,我自己是在网上找了很多博客,最终发现他们的博客有些写的不是很全或者说现在插件都更新了,不适用以前的老办法了,所以我在这里重新写一篇博客方便Android开发者部署jenkins以方便运营可以不依靠技术自主的去编译apk去发布,当然,学会jenkins也会给你的简历上加分哦

1、Tomacat

Tomcat下载去下载Tomcat,下载解压后进入bin目录启动startup.bat文件就可以启动tomcat了

2、Jenkins

Jenkins下载去下载Jenkins,有两种选择,一种是 Long-term Support (LTS) 还有一种是Weekly,前者是稳定版本,后者则是更新比较频繁的版本,这里我们选择LTS就好,下载后的安装包解压安装,安装完成之后找到tomcat目录下的webapps下创建一个文件夹命名为jenkins,然后去jenkins安装目录下的war文件夹里的内容全部copy至刚刚创建的jenkins文件内,这个时候打开在浏览器打开http://localhost:8080/就可以进入到jenkins页面了,会让你输入密码,你根据他生成的文件路径去打开这个密码文件把密码输入进去就会进入到这个界面


可能是英文的也可能是中文的,不管是什么语言,点击左边,安装一些jenkins推荐的插件,这些插件安装失败可以重试,如果重试了一两次之后还是失败就不用管了直接进入下一步创建用户,也可以使用admin,不过还是推荐自己创建用户,后期权限管理方便一些

3、安装插件

如果某些插件找不到或者下载不了可以在这里下载,如果没有积分可以私信我邮箱,我会发给你,csdn强制要求最低2积分,无法设置为免费,我也没办法,本地下载的插件可以通过系统管理>管理插件>高级>上传插件来离线安装插件

4、配置环境

需要额外配置gradle环境当然java环境和android sdk的环境也要配置,然后进入jenkins主界面

进入系统管理>全局工具配置>找到jdk、gradle、和git
  • 别名可以随意,地址就是你的jdk绝对路径


  • git的name可以随你的心意去命名路径就写你git.exe的绝对路径


  • gradle的name也是随意的,推荐配置多个版本的gradle,gradle默认路径就在C:\Users(用户名).gradle\wrapper\dists\下


    cccc.png
然后回到主页面>系统管理>系统设置

找到全局属性设置勾选环境变量设置android sdk


开始创建项目

  • 主页面新建任务,输入项目名称,然后选择构建一个自由风格的软件项目后点确定


  • 然后点击源码管理选择git,svn也大同小异,先点击add添加账号密码,然后再输入你的项目地址

在kind项下你也可以选择SSH Username with private key,选择enter directly填入你的私钥
#cat ~/.ssh/id_rsa.pub 是公钥,#cat ~/.ssh/id_rsa是私钥

填好之后就是这样,下面的Branches to build 填你分支的名字

然后就点击保存,回到项目主页点击Build with Parameters或是立即构建按钮开始构建,构建成功后在



可以看到,你们的可能是#1,然后回到jenkins的根目录找到workspace目录然后找到你的项目名字的文件夹不带@tmp的文件夹,进去看看你们的代码有没有被拉下来,如果没有或者配置失败则检查你的源码配置或路径

自定义参数

111.png
33333.png
4444444.png
6666666.png
77777777.png
555555555.png
2222222222.png

然后是构建>增加构建步骤>invoke gradle script

先解释一下被红色条遮住的内容,这个内容就是你新建项目的任务名称其他的都一样就行
${JENKINS_HOME}/workspace/替换为为你的任务名称
${JENKINS_HOME}/workspace/替换为你的任务名称/app/build.gradle
你也可以使用${JOB_NAME}自动去获取任务名称
${JENKINS_HOME}/workspace/${JOB_NAME}
${JENKINS_HOME}/workspace/${JOB_NAME}/app/build.gradle

下面解释红色箭头和Tasks里的的内容,然后打开你的AndroidStudio,打开你的项目,找到属于Project properties的gradle.properties文件,打开它,然后增加如下参数

APP_VERSION = 1.0 //对应你jenkins的选项参数APP_VERSION
IS_JENKINS = false //对应你jenkins的选项参数IS_JENKINS
BUILD_TYPE = debug //与上方一一对应
PRODUCT_FLAVORS = 你的渠道
CHANNEL=你的渠道
BUILD_PATH_JENKINS = F:\jenkins\workspace\你的项目名\jenkinsapk //你jenkins编译后的路径
BUILD_PATH_LOCAL = F:\jenkins\workspace\你的项目名\jenkinsapk\testjenkins //非jenkins编译后的apk
BUILD_TIME= 2018-4-24 //对应上方的BUILD_TIME选项参数
APPNAME = hbw //对应上方的文本输入参数
android.buildCacheDir=F:/AndroidStudio/build-cache-cache //可以不添加,如果编译报错需要添加这行,具体作用可以自己去stackoverflow上找

现在可以开始解释红色箭头的作用了,它的作用就是把你jenkins填写的内容覆盖到你的gradle.properties内,上面的NAME必须与gradle.properties内的命名对应,你们可以随意发挥想象,比如,因为我公司的特殊性,我们的渠道不是指的各大app store而是指的和我们公司合作的各大公司,所以我定义了一个Name为CHANNEL的文本参数,这样,运营就可以在jenkins上随意输入内容,这样他生成的APK的CHANNEL则会把我gradle.properties里的CHANNEL的内容覆盖掉,这样我在我app的build.gradle里就可以这样声明


这样我就可以在代码内部在BuildConfig类中取出这个自定义的渠道名称,上面其他的APP_VERSION,APP_NAME之类的你们也可以随意发挥想象,gradle本身就是一个框架,你们可以尽情发挥想象力去完成你们各自公司的不同的功能,不仅仅只是渠道,但是你们现在可能发现了,那上面的PRODUCT_VLAVORS和BUILD_TYPE参数和Invoke Gradle script下的Tasks里的clean assemble${PRODUCT_VLAVORS}${BUILD_TYPE}是什么意思啊,说这个意思之前得先普及一点 Gradle命令的知识
assemble命令用于打包,比如assembleDebug就可以编译打一个debug包,assembleRelease就可以编译出一个release包,除此之外,assemble还可以搭配productFlavors使用,比如你在gradle里设置设置了一个腾讯应用宝

那么就可以通过assemble+你的渠道名字,如我们上面写的应用宝assembleyingyongbao或者assemble+你的渠道名+Release或Debug,也就是assembleyingyongbaoReleaseassembleyingyongbaoDebug,当然assemble的作用远不于此,更多的你们自己去发现

讲完了这些知识有些人可能已经懂了assemble${PRODUCT_VLAVORS}${BUILD_TYPE}是什么意思了,没错,就是${PRODUCT_VLAVORS}会获得上面所选择的你设置的渠道${BUILD_TYPE}则会获得你上面选择的Release或Debug,这样就拼接成了assemble+渠道名+Release或Debug,这一点很多博客都没有讲清楚,还有一点需要注意,你PRODUCT_VLAVORS参数下的选项必须是你在app下的build.gradle脚本的productFlavors方法里声明的渠道,比如我只声明了yingyongbao,那么我的选项只能是有yingyongbao,因为assemble+你的渠道这条命令会去找这个task,如果没有,则会报错,到这里相信没接触过Jenkins的人都应该对jenkins有一个大概的了解了,基本上这样就会编译出apk,如果你想控制编译后的apk名字,则可以在app的build.gradle脚本内这样写

因为我希望生成出来的apk名字为jenkins内输入的APP_NAME+_+jenkins内输入的CHANNEL,但是我还有个功能是生成apk后上传到后台的ftp服务器上,而服务器上是不能存在中文的,会不兼容,所以我首先判断了一下是否为中文,如果是中文则把中文转换成拼音,这个isChinese()和getChinesetoPinyin()方法是在android接口之上声明的


大家看到了吧,所以,gradle可以让你的构建过程通过代码来控制,所以推荐大家去学习一下gradle和groovy,为什么我要把大家都说的什么什么节点之下称之为方法呢,原因就是你们可以ctrl+左键点击android节点,productFlavors节点,compileSdkVersion、buildToolsVersion、defaultConfig、applicationId等等等等,实际上都是调用的gradle提供的api,如果你gradle声明的参数有疑问,那么点进去,看看他的需要的参数要求,你就解决问题起来就会方便很多,基本上就是这些,剩下的就留给各位开发者自己想象。

构建出apk后上传到后台的ftp或者sftp服务器

如果后台是ftp服务器,则导入| publish-over-ftp/ |插件,具体的用法可以百度这个插件如何使用,因为我公司是sftp服务器,所以这里我拿publish-over-ssh/插件来演示

  • 回到jenkins主页面,系统管理>系统设置>Publish over SSH
  • Name可以随意填写
  • Hostname填写需要连接ssh的主机名或ip地址,此处填写应用服务器IP(建议ip)
  • Username填写进入这个服务器的用户名
  • Remote Directory:远程目录(根据需要填写文件传到此目录下)
  • 然后点击高级勾选Use password authentication,or use a different key
  • Passphrase / Password填写访问服务器的密码
  • port填写22,一般ftp端口是21,sftp服务器端口是22
  • Timeout (ms)填写超时
  • 然后保存>回到主页面>进入你的项目>配置>点击构建后操作


name选择你刚才在系统设置里填的name,source files则填写你apk生成的相对路径,相对于jenkins的workspace里你的项目下,这样我们后台的sftp服务器的路径(在系统设置里的Remote Directory)下会多出一个jenkinsapk文件夹,这个文件夹下会出现你生成的apk

  • Remove prefix和Remote directory的作用分别是删除本地的的和服务器的目录,可以不填写,Exec command可以不填写,这个警告不会影响编译,然后我们就回到项目主页点击Build with Parameters或是立即构建按钮开始构建


看到结尾的SUCCESS就代表我们就编译并且上传成功了

后言

jenkins的配置差不多就是这样了,还有很多各种各样的插件,比如钉钉的,比如你可以不使用ssh插件,蒲公英和fir.im这两个应用内测托管平台也有相应的插件可以构建后直接上传到他们的服务器,比如生成二维码发邮箱,比如定时去构建等等许多功能,都有不同的插件可以做到,只需要发挥你的想象力就可以搭建一个完全不需要技术人员维护的一个构建平台让运营等不懂技术的人单独做到生成apk >发布。

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