其实在前期已经投入精力对持续集成进行部署,但是真正的困难不是部署应该走的方向,却是过程中发生的一个个的“坑”,如何对待这些拦路虎并跨过他们,记述一二。


一、iOS集成

之前使用gym打包为这次iOS的集成提供了方便之门,但是这次需要注意的是:
1、需要分别打inhouse,adhoc,appstore的包
2、inhouse和adhoc作为内测,需要更换显示图标,加上内测字样。
3、inhouse包需要上传蒲公英(之前选择的Fir因为收费放弃),需要跟slack对接,并且自动推送。
4、appstore需要上传TestFlight
当然已经全部实现了,把其中遇到的波折一项项列一下。


(1)分别打三种包,对证书和rightProvision了解的不够透彻?
解决:把三种证书都从开发那里要过来,然后将自己的APPLE ID升级到开发者Admin状态,就具有了三种证书的使用权限,然后跟开发一一对接,对每个包分别对应的证书了解并整理,打包的时候一一对应上就好。这个过程中,收获的是对xcodebuild的method参数有更深的了解,其实inhouse,adhoce,appstore分别对应的打包方式是enterprisead-hocapp-store
(2)需要更换inhouse的图标?
解决:之前想通过是打包的时候指向不同的target,后来的解决方案是直接替换。

1
2
3
4
5
for file in os.listdir(appIconPath):
if ".png" in file:
for appicon in os.listdir(replaceAppIconPath):
if file == appicon:
shutil.copy(replaceAppIconPath+'/'+appicon, appIconPath+'/'+file)

但是需要注意的是像素和尺寸需要保持一致,设计同学的帮忙很必要。
(3)之前上传Fir,后来因为Fir每日超过下载量需要收费,决定更改内测分发平台。
解决:之前是想通过上传公司内部服务器,然后给出外网链接,然后分发下载,后来因为感觉进入到下载页面以后没有关于ipa各种信息的介绍,比如build_version和build_number等。
但是要记录一下用ftp上传的时候由于是匿名上传,之前尝试出现各种错误,因为能力不够经验缺少的原因吧,后来用python实现上传ftp。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
def ftpconnect(host):
ftp = FTP()
ftp.connect(host, 21)
# 登录
try:
ftp.login()
except ftplib.error_perm:
print "ERROR: cannot login anonymously"
ftp.quit()
return None
ftp.cwd('xx/') # *不是根目录*
return ftp
def uploadfile(ftp, name, localpath):
bufsize = 1024
fp = open(localpath, 'rb')
ftp.storbinary('STOR ' + name, fp, bufsize)
ftp.set_debuglevel(0)
fp.close()
if __name__ == "__main__":
host = "ip"
localpath = "xx"
ipa_path = "xx"
name = "xx.ipa"
ftp = ftpconnect(host)
uploadfile(ftp, name, localpath)
ftp.quit()

其实之前放弃蒲公英是因为蒲公英上传之后的api返回值有一个特点,生成的二维码是固定不变的,但是下载的短链接网址是跟着其中的key字段改变的,经过仔细对比发现appShortcutUrl字段不会变化。自然有了对策。实现方式,自己拼接:

1
2
3
4
5
6
7
8
def parseUploadResult(jsonResult):
resultCode = jsonResult['code']
if resultCode != 0:
print "Upload Fail!"
raise Exception("Reason: %s" % jsonResult['message'])
appShortcutUrl = jsonResult['data']['appShortcutUrl']
appDownloadPageURL = "https://www.pgyer.com/%s" % appShortcutUrl
return appDownloadPageURL

(4)和slack对接
解决:其实我觉得slack真的非常好用,因为它提供了各种整合持续集成的api,这里特别佩服我们老大对这块内容的重视,slack和jenkins集成非常方便。只是网速有点不靠谱。
slack api地址:https://api.slack.com/docs/message-guidelines
然后构造请求,发送即可,详细不表。
(5)将appstore的包上传TestFlight
解决:之前安装testflight,一直遇到的问题是会有一个类似如下的报错:
from /usr/local/bin/fastlane:23:in '<main>',其实一条命令解决了,
sudo gem uninstall bundler,其实这是fastlane的bug。
用pilot可以上传到TestFlight,

1
2
3
4
pilot upload --verbose --username ${username}
--app_identifier ${bundle_id} --ipa ${ipa_path} --apple_id ${apple_id}
--team_id ${team_id} --team_name "${team_name}" --dev_portal_team_id
${dev_portal_team_id} --itc_provider "${itc_provider}"

二、Android集成

安卓打包更简单一点,但是一上来的错误就弄懵懂了我,因为对安卓平台的确接触不多。


(1)gradle version is 2.14.1,Current Version is 2.9。
解决:最后很简单就实现,选择jenkins构建grale脚本中,Use Gradle Wrapper,即可。


先写这么多,因为发现安卓又报错了,去解决问题了。。。