可持续构建和部署,对于移动端,尤其是iOS端,不是一件容易的事情。因为公司一开始就有专人在开发和维护可持续构建平台,所以这块并没有吃过太多苦。但是对中小团队的困境,我通过脑补,深有体会。直到fastlane横空出世,终于有一个神器可以大大减少无线开发者的重复劳动。fastlane在github上的star数量可以表明它受欢迎的程度。
image.png
fastlane通过一系列的lane和action/plugin,将CI/CD过程中主要的环节自动化起来。
image.png因为苹果Developer Member Center和iTunes Connect的接口并没有公开,并且Xcode每年都要发版,带动MC和iTC也要跟着更新,所以fastlane发版非常频繁。比如最近发布了2.38.1版本,以支持iOS 11和Xcode 9。
本来想写一个🌰讲一下fastlane的基本使用,直到我找到一篇绝好的文章:fastlane Tutorial: Getting Started,我觉得我就没有必要费这个劲儿了。
这篇文章非常欢快地把App从创建、打包到提交审核等关键流程都介绍了一下。只要对着文章把相关的变量,比如bundle id改成自己的就行。
image.png image.png image.png以前提交审核最苦逼的事情莫过于等待苹果处理完二进制,然后才能勾选上做测试或者提交审核,fastlane甚至会一直等待二进制处理完,并且帮忙做后续处理,所以不用再守在电脑旁边啦。不过提交审核需要用户最后确认一下关键信息,这个还是比较关键的,自动化做了也不太放心。
基于fastlane做一个可持续构建平台是一件非常容易的事情。事实上,只要构建平台的机器上安装了fastlane,用户执行一下fastlane ios release
就好了,fastlane接管了所有的工作。构建平台要做的是提供机器和一些必要的UI界面,比如查看日志。事实上,主流的CICD平台也都在积极拥抱fastlane,比如travis-ci和flow.ci。
我也尝试一下在Jenkins里面运行fastlane。下载和安装好Jenkins之后,创建一个项目,接着去配置项目,添加一个脚本如下。因为在网页中没法做交互选择,所以记得指明FASTLANE_ITC_TEAM_ID
和FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD
这两个环境变量。
接着点立即构建,可以去控制台看到很多日志,可以看到最后构建成功了。
image.png image.pngMac上有两个坑。一个是如果在Jenkins官网下载Mac OS X的pkg包安装,安装完成之后,就会启动Jenkins服务,这个服务是以Jenkins
这个用户启动的,各种无权限访问当前用户资源。并且这个进程用kill -9
杀死后还会重启,感觉有服务在保护它。
$ ps aux | grep jenkins
jenkins 82494 0.0 0.8 4435172 67252 ?? Ss 12:23下午 1:04.30 /usr/bin/java -Dfile.encoding=UTF-8 -XX:PermSize=256m -XX:MaxPermSize=512m -Xms256m -Xmx512m -Djava.io.tmpdir=/Users/Shared/Jenkins/tmp -jar /Applications/Jenkins/jenkins.war --httpPort=8080
为了绕开这个问题,我手动启动Jenkins,并且把端口改成9090,这样就是以当前用户启动的服务。
$ /usr/bin/java -Dfile.encoding=UTF-8 -XX:PermSize=256m -XX:MaxPermSize=512m -Xms256m -Xmx512m -Djava.io.tmpdir=/Users/Shared/Jenkins/tmp -jar /Applications/Jenkins/jenkins.war --httpPort=9090
$ ps aux | grep jenkins
henshao 89248 0.1 3.0 5155436 249804 s000 S+ 4:01下午 1:27.86 /usr/bin/java -jar /Applications/Jenkins/jenkins.war --httpPort=9090
另外一个坑就是提示下面这个错误。解决这个问题只需要在脚本的最前面增加#!/bin/bash --login
就好了。
rvm is not a function selecting rubies with 'rvm use ...' will not work
最后再推荐一下Fastlane实战这几篇文章,真的非常棒。
网友评论