使用Jenkins进行iOS项目自动化发布
前段时间把iOS发布逻辑迁移到fastlane平台,现在发布调一下fastlane脚本就好,对开发人员极度友好。不过后来发现虽然开发人员用得爽了,不过还是要被测试妹子催着打包,于是想釜底抽薪,把这个功能做得更彻底一点,直接让测试妹子自己来打包,这样就把iOS开发同学彻底解放了~
公司内网已经部署了一台linux系统的jenkins服务器,上面集成了一些后端和前端的发布逻辑,所以直接添加一个iOS项目的发布流程就行。Xcode环境只能跑在Mac OS上,所以iOS项目的发布流程势必要做远程服务。
在调研的时候打算在Mac OS上启一个http server,自己写相关的逻辑。后来发现jenkins有远程job互调用的功能,所以方案就变成在Mac OS上也部署一套jenkins,暴露出一些打包服务,然后在公司的jenkins中调用。因为有两套jenkins环境的配置(提供服务的和使用服务的),姑且称之为调用端和执行端。下面就来简单说一下这两部分的具体配置。
主要流程
执行端
执行端主要就是提供一个http服务,用http协议来触发构建任务。下面是具体步骤:
- 在jenkins中新建一个任务,这里选“自由风格的软件项目”
- 然后在General中勾选“参数化构建过程”,这里因为需要接收主调方发送的构建参数,所以要选这一项。因为要通知调用方执行结果,所以构建参数里增加“callbackurl”
- 接着在构建触发器中勾选“触发远程构建”,并填写身份证令牌。这里的身份证令牌和用户无关,仅仅只是这个job的api令牌,这里可以随便填一个,只要不太容易被猜到就行
- 最后在构建中增加“执行shell”选项。这里可以写执行任务的逻辑,我这儿就是简单的切换到工程目录,再调用fastlane打包,结束后回调完成的url
1 | cd ~/projectPath #项目路径 |
- 到了这一步就完成了项目配置,不过因为用户认证相关的设置还没有完成,所以这个任务还不能被远程触发。点击右上角用户名可以进入到用户设置页面,点击设置,在“API Token”中添加一个token,使用这个token和用户名就能在其他机器上触发任务
完成上面这些设置后,会得到下列信息。主调方有了这些信息就能触发远程构建
用户名(userName)
用户令牌(userToken)
- 任务令牌(jobToken)
- 执行任务的机器ip地址,jenkins服务端口号码
- jenkins任务名字(jobName)
- 回调url,这个非必须,不过不传的话无法知道任务是否已经结束(callbackurl)
1
2
3#最后用上面这些信息拼接成类似下面这样的URL,通过http协议访问就能触发这台机器上的远程任务
jobTriggerURL = "http://${userName}:${userToken}@${jobServerIPAndPort}/job/${jobName}/buildWithParameters?token=${jobToken}&callbackurl=${callbackurl}"
curl jobTriggerURL
调用端
当执行端设置好以后,调用端的设置就比较简单了。
- 在jenkins中新建一个任务,这里选“流水线”,因为调用端的逻辑用到了一些pipeline插件,而且还有一些逻辑要处理,用流水线可以实现更精确控制
- 在“高级项目选项”中的“流水线”里写下下面的逻辑:
1 | stage ("Wait remote iOS package job finish.") { |
脚本的主要逻辑是调用远程job,然后等待远程任务发送回调请求。这里用到了Webhook Step Plugin插件,它主要作用是获取一个回调URL,并挂起当前执行的脚本,直到回调url被调用以后再继续执行。
经过上面的配置后就能在公司jenkins上进行iOS项目自动化发布了。如果jenkins是在外网,则会麻烦一些,需要连vpn或者在NAT上做一个端口映射才行。