iOS使用脚本命令(xcodebuild archive)打包

1,925 阅读2分钟

背景

公司所有项目打包发布都是采用自动化发布流程,由于公司之前没有过App开发,对App的自动化打包集成是欠缺的,所以需要将App自动化打包进行集成。公司的自动化打包工具使用Jenkins,本应使用Jenkins对iOS项目实现自动化打包,但是由于自己本机对Jenkins下载的版本是Jenkins 2.289.1,一直无法完成打包配置,试过降低版本(指定版本下载--下载失败)、Homebrew(无效)、重装Jenkins(无效),遂弃之。

实现自动化打包方式了解到有(依赖macOS系统环境):

  1. 使用Jenkins(亲测--未成功,弃之)
  2. 使用macOS Server(Xcode自带的打包机器人,亲测--成功,待选项)
  3. 使用fastlane,集成可参考该文章(未测,待选项)
  4. 使用Bazel 谷歌推出(未测,待选项)
  5. 使用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>&lt;none&gt;</string>
</dict>
</plist>

为了确保打出来的包可安装,建议使用手动打包一次生成ExportOptions.plist文件