前言
由于公司需要,所有项目都必须上CI CD,所有就有了接下来的Ios CI配置的坎坷之路。IOS CI的资料和并不多,因为官方也有不错的配套工具。例如直接用xocde来打包,如果内部流程简单,没有多个测试环境,发布频率较小的话,这无疑是最好的选择。还有就是macOS 版 Transporter App,您可以便捷地将 App 上传至 App Store Connect 以便在 App Store 上分发。除了上传构建版本,您还可以上传元数据包,查看交付进度(包括警告、错误和交付日志)以及交付历史,但是对于多环境的配置的切换和版本号的设置方面还需手动,这样就还是有出错的机会,所以就有了今天我们要说的CICD工具。目前最主流的CICD工具是Jenkins,他拥有着庞大的社区共享的插件酷,耗不夸张的说,CICD就约等于Jenkins,但不幸的是我们公司用的是一个叫Teamcity的工具,对IOS的交付来说并不太友好,所有很多脚本都是需要自己写,就有了下面的脚本教程。或许脚本内容大家不需要,但是我觉得步骤和流程方面还是有一定参考价值的,这里主要是通过App store里的TestFlight来做测试环境的,正式的话是直接发布到App store,至于TestFlight这里就不普及,可以自行去了解,正式发布到App store的话这边还没发布到正式,所以无法进行过多讲解。
步骤
1.Set Version(修改project.pbxproj文件或Info.plist文件的版本号)
一般CICD工具都是会生成一个构建的版本号的,我们可以拿这个版本号来当我们App版本号,其实就是设置project.pbxproj文件或Info.plist文件的版本号后再进行编译,笔者这边是设置了project.pbxproj文件,具体脚本如下:
sed -i "" "s/AppBuildVersion/%Version%/g" project.pbxproj
注:这里的%Version%是CICD工具的一个变量
2.设置项目配置
这里也是通过 sed -i
命令行进行修改配置文件,由于每个人的配置文件都可能不同,因为我这边用的是React Ntive来开发的,跟原生还是有一定差异, 所以这里就不提供脚本了,大概搜一下sed -i命令,几分钟就能写出该基本。
3.Install Mobileprovision(安装App描述文件)
每个IOS APP都会有一个自己的描述文件的,里面记录了你这App的一些基础信息和可用安装APP的设备(开发者描述文件)以及有权限编译和分发APP的证书,详细还需自己自行了解,这里就不再赘述太多。
我们这边的话需要安装两个描述文件,一个是开发者描述文件(编译时依赖)与发布描述文件(推送至App store Connetc时依赖),这两个文件可以去开发者平台创建后下载下来,具体安装脚本如下:
DevUuid=`grep UUID -A1 -a dev_profile.mobileprovision | grep -io "[-A-F0-9]\{36\}"`
cp dev_profile.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/$DevUuid.mobileprovision
ReleaseUuid=`grep UUID -A1 -a release_profile.mobileprovision | grep -io "[-A-F0-9]\{36\}"`
cp release_profile.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/$ReleaseUuid.mobileprovision
4.Security Import(证书导入)
证书这里的话也是有开发者证书与发布证书的说法,这里跟描述文件那里比较相似,需要将两份证书导入进去后才有权限进行编译和APP分发,具体脚本如下:
security import dev.p12 -k ~/Library/Keychains/login.keychain -P %DevCertificatePassword%
security import release.p12 -k ~/Library/Keychains/login.keychain -P %ReleaseCertificatePassword%
5.Security Unlock Keychain(证书解锁)
CICD Runner由于Mac Security 的ssh远程认证出现问题,需要输入Mac系统用户密码才可以获取到证书权限,具体脚本如下:
security unlock-keychain -p %Password% ~/Library/Keychains/login.keychain
6.Archive(打包)
这里唯一注意的是要设置一下打包完成后包的存放路径,之后导出Ipa的时候要用到,脚本如下:
xcodebuild -workspace ios/DemoApp.xcworkspace -scheme DemoApp clean archive -allowProvisioningUpdates -archivePath CICD/ios/build/DemoApp.xcarchive
7.Export Archive As Ipa(将打包的xcarchive导出为ipa文件)
这里也是要设置下导出Ipa的路径,进行推送时要用到,脚本如下:
xcodebuild -exportArchive -archivePath CICD/ios/build/DemoApp.xcarchive -exportPath CICD/ios/build -exportOptionsPlist CICD/ios/test.plist -allowProvisioningUpdates
8.Distribute App(将ipa文件推送上传至app store准备分发)
这里先进行Ipa的验证,通过之后就可以把包推送到App store Connetc了,脚本如下:
xcrun altool --validate-app -f DemoApp.ipa -t ios -u DeveloperAppleId -p DeveloperPassword
xcrun altool --upload-app -f DemoApp.ipa -t ios -u DeveloperAppleId -p DeveloperPassword