起这么一个标题应该不会被那啥吧。+1s
背景
这次我们来说说App打包,简书上有大量教程教你怎么搭建持续集成、怎么搭建Jenkins、怎么打App包、怎么上传fir.im等等。这些教程大部分达到的效果就是:登录Jenkins -> 找到对应job -> 构建 -> 自动上传FIR/蒲公英 -> Jobs History显示二维码,对于懒的人来说,这太麻烦了,我想要一步就开始构建,构建完成后直接给我反馈结果;另一个问题,大部分公司都是用一些老的MacBook或Mac Mini来搭建Jenkins,这台机器通常在内网中,外网是访问不到,除非有梯子,你要是外出或者回家了想打个包怎么办,我想要最简单的条件就可以打包。简书现在做到了在IM中发一条消息,打包就开始了,打包完成后我会收到一条消息,消息显示下载地址的二维码,真正的too simple,这也是名字的由来。领导看后说了一句:“你们搞的这个系统啊,excited!”。话不多说,赶紧上车。
结构
首先我们来看一下整体的结构。
IM
这一步要完成的是指定要打包的App,以及一些配置,代码分支、Release/Debug、ChangeLog等。
简书内部使用的IM是零信(原瀑布IM),它提供了两个很有用的扩展:Outgoing和Incoming。Outgoing是一个触发机器人,当消息命中了关键字,它会把这条消息POST到一个指定URL,也就是下一步要说的API Server。举个栗子:
zhao0:打包(iOS)
命中了关键字打包
,Outgoing就把用户名、消息内容POST到Server。
Incoming则相反,我们可以向生成的URL POST一条消息,可以是文字或图片或链接,这条消息就出现在了IM中,在这里用来反馈结果,Incoming在其他监控方面用得挺多。我知道的其他IM有Slack也是支持这两个扩展的。这一步弄一个Web页面或者邮件也是可以的,思路是一样的。
API Server
API Server的任务非常简单,它维护一个队列,IM POST过来的消息入队;Client主动查询,Server收到GET请求就出队,队列可以是全局变量(重启就丢失了)、消息队列MQ、数据库。
Jenkins
Jenkins需要进行三步配置
1、参数化构建过程
参数化可以不改变构建脚本实现不同配置,类似于函数的参数,这里可以根据需要添加自己的参数,在脚本中通过${参数名}
取到值。
2、远程触发构建
简单地说这是支持通过一个URL触发构建,还可以传入参数。Token这里需要填入一个随便生成的字符串。
3、分配用户
新增一个用户专门用来触发构建,查看用户的API Token
这里顺便推荐使用
Role-based Authorization Strategy
插件来管理用户的权限。三步好了之后,就可以通过这样一个URL触发构建,很容易在脚本中使用,注意替换所以大写的字段
http://USERNAME:APITOKEN@JENKINSADDRESS/JOBPATH/buildWithParameters?token=TOKEN&OTHERPARARMS
Query Client
Client负责定时从API Server拉任务,解析参数,触发Jenkins构建,由一段简单的Python/Ruby脚本就可以完成。从Server获得的消息保留了原来的格式,需要进行简单的匹配,组装成一个完整的URL,然后'curl -G url'就触发了。搭配crontab每隔几分钟执行一次。
到这里,整个系统就搭好啦,是不是很简单。
每个人的环境和需求有差别,这里给你指明了路子,有任何疑问可以在评论中留言。
关于fastlane
简书的iOS持续集成全部都用fastlane完成,fastlane本质上和写一堆shell script没区别,但是fastlane提供了大量现成的action,想要实现的功能几乎都有(实在没有也可以自己定制),把枯燥的shell代码变成简单的ruby函数(action)调用,Jenkins里只需要一行代码。
下回预告
fir.im开始按量收费了?Debug包不敢传到外部平台?安卓的apk可以直接下载,iOS的ipa怎么弄?下次将教你怎么自己搭建一个这样的平台,代码会开源,一键部署,等不及的就node install -g ipapk-server
。
写在最后
简书作为一个优质原创内容社区,拥有大量优质原创内容,提供了极佳的阅读和书写体验,吸引了大量文字爱好者和程序员。简书技术团队在这里分享技术心得体会,是希望抛砖引玉,吸引更多的程序员大神来简书记录、分享、交流自己的心得体会。这个专题以后会不定期更新简书技术团队的文章,包括Android、iOS、前端、后端等等,欢迎大家关注。