背景
公司所有项目打包发布都是采用自动化发布流程,由于公司之前没有过App开发,对App的自动化打包集成是欠缺的,所以需要将App自动化打包进行集成。公司的自动化打包工具使用Jenkins,本应使用Jenkins对iOS项目实现自动化打包,但是由于自己本机对Jenkins下载的版本是Jenkins 2.289.1,一直无法完成打包配置,试过降低版本(指定版本下载--下载失败)、Homebrew(无效)、重装Jenkins(无效),遂弃之。
实现自动化打包方式了解到有(依赖macOS系统环境):
- 使用Jenkins(亲测--未成功,弃之)
- 使用macOS Server(Xcode自带的打包机器人,亲测--成功,待选项)
- 使用fastlane,集成可参考该文章(未测,待选项)
- 使用Bazel 谷歌推出(未测,待选项)
- 使用xcodebuild archive 脚本命令进行自动化打包
环境
- 系统 macOS 10.15.7
- Xcode 12.4
脚本命令介绍
以下是使用到的脚本命令介绍
#!/bin/sh
# 注意:配置静态资源,"="左右两边无空格
#项目路径
export item_path=项目文件所在路径(eg:~/Documents/git_item/TestDemo)
#项目中.pch文件所在文件夹路径(修改改文件内容(用于网络环境更换))
export item_path_pch=${item_path}/TestDemo/PCH/
#工程名称
export project_name=项目工程名称(eg: TestDemo)
#pods工程名称
export workspace_name=.workspace文件名称(eg:TestDemo.workspace -> 取:TestDemo)
#scheme name, 即运行应用时所选择的schemeName(真机运行时,点击所运行的scheme->选择真机)
export scheme_name=TestDemo
#配置,这里使用Release 或 Debug (该处我使用的都是:Release)
export Configuration=Release
#enterprise---------Bundle ID
EnterpriseBundleID=cn.xxxx.TestDemo
#导出(.plist)文件路径,该文件如何生成,下方会介绍
export ExportOptionsPlistPath=~/Desktop/CI_CD/dev/ExportOptions.plist
#导出文件到路径($(date +"%Y%m%d") -> 生成文件夹依据年月日 eg: ~/dev/20210817/xxx.ipa)
export Export_Fiel_Path=~/Desktop/CI_CD/dev/$(date +"%Y%m%d")/
#进入到PCH文件修改网络环境状态
cd $item_path_pch
# 修改,将1001 || 1003 || 1004 修改为1002, 将环境修改为测试环境
sed -i '' 's|1001|1002|' PrefixHeader.pch
sed -i '' 's|1003|1002|' PrefixHeader.pch
sed -i '' 's|1004|1002|' PrefixHeader.pch
#进入项目路径
cd $item_path
#pod install, 项目使用了pods管理执行
pod install
#删除原来文件编译文件包存放路径,$item_path/build
rm -rf build
# clean
xcodebuild clean -project ${project_name}.xcodeproj \
-scheme ${scheme_name} \
-configuration ${Configuration}
# 列出workspace下所有的scheme,有需要可以使用
# xcodebuild -list -workspace ${project_name}.xcodeproj/project.xcworkspace
# Information about workspace "TestDemo":
# Schemes:
# TestDemo
# TestDemoDev
# Build 指定 scheme
# xcodebuild -workspace ${project_name}.xcodeproj/project.xcworkspace -scheme ${scheme_name} build
# build target
# xcodebuild -target ${scheme_name} -configuration ${Configuration}
#打包命令
xcodebuild archive -workspace ${workspace_name}.xcworkspace \
-scheme ${scheme_name} \
-configuration ${Configuration} \
-archivePath build/${project_name}.xcarchive \
archive build PRODUCT_BUNDLE_IDENTIFIER="${EnterpriseBundleID}"
#导出包命令
xcodebuild -exportArchive -archivePath build/${project_name}.xcarchive \
-exportPath ${Export_Fiel_Path} \
-exportOptionsPlist ${ExportOptionsPlistPath}
# copy出dSYM文件,如果在项目中使用了异常检测库,可能需要到的.dSYMs文件即该文件,例如:Sentry
cp -R build/${project_name}.xcarchive/dSYMs/${scheme_name}.app.dSYM ${Export_Fiel_Path}/
#移除放在项目中的编译包
rm -rf build
# 将ipa包上传到OSS 文件夹下(使用到阿里云的oss服务,此处根据自己实际环境修改)
cd ~
./ossutilmac64 cp -r -u ${Export_Fiel_Path}/${scheme_name}.ipa ${上传路径}
cd ~
#将DSYM文件进行上传到异常监测服务
# ${根据自己实际环境配置,上传}
ExportOptions.plist文件配置
在Xcode 9.0开始ExportOptions.plist配置需要包含:
- provisioningProfiles
- compileBitcode
- method
- signingCertificate
- signingStyle
- stripSwiftSymbols
- teamID
- thinning 下面是配置信息
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>compileBitcode</key>
<true/>
<key>destination</key>
<string>export</string>
<key>method</key>
<!-- 打包方式,分为app-store,ad-hoc,enterprise和development -->
<string>development</string>
<key>provisioningProfiles</key>
<dict>
<!--Bundle ID-->
<key>cn.xxx.testDemo</key>
<!--所选打包证书名称 profiles文件名称-->
<string>xxx-dev</string>
</dict>
<key>signingCertificate</key>
<!--使用到的证书-->
<string>Applexxxx</string>
<key>signingStyle</key>
<!--打包方式,手动打包还是自动打包,填写:manual-->
<string>manual</string>
<key>stripSwiftSymbols</key>
<true/>
<key>teamID</key>
<!--项目id-->
<string>xxxx42</string>
<key>thinning</key>
<string><none></string>
</dict>
</plist>
为了确保打出来的包可安装,建议使用手动打包一次生成ExportOptions.plist文件