使用jenkins创建双provisioning profile的iOS安装包

news/2024/7/20 20:12:01 标签: jenkins, ios, 运维

问题描述

有个iOS项目,代码中配置了一个APP provisioning profile和一个Plugin provisioning file,现在需要通过jenkins平台来打包,生成iOS ipa文件。

解决过程

研发已经习惯于使用图形化xcode工具来打包,作为一个DevOps工程师,命令行才是我们的拿手好戏,我常挂在嘴边的一句话是“凡是命令行可实现的,皆可自动化!”

1、作为DevOps工程师,我需要从开发那边拿到:证书的p12文件及密码,以及provisioning profile及相关的属性信息。
2、拿到证书的P12文件,将该文件上传到构建机器,并双击后,输入密码,将证书导入构建机器上。
3、按照如下步骤,将provisioning profile导入构建机器上:
3.1 通过security命令解析mobileprovision文件 到一个新的文件中:

security cms -D -i xx.mobileprovision > tmp.xml 2> /dev/null

3.2 通过PlistBuddy命令获得 mobileprovision文件 的UUID:

/usr/libexec/PlistBuddy -c "print UUID" tmp.xml

3.3 把mobileprovision文件复制到指定的目录下:

cp xx.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/${uuid}.mobileprovision

4、做完上面准备工作后,就可以在jenkins的shell窗口进行如下配置,来实现打包:

# bundle ID
APP_BUNDLE_IDENTIFIER="cn.org.xxx.app"
PLUGIN_BUNDLE_IDENTIFIER="cn.org.xxx.plugin"
# configiration: Debug、Beta、Release
CONFIGURATION="Release"
 
# 编译用Provisioning profile
APP_PROFILE="AppProfile"
PLUGIN_PROFILE="PluginProfile"

# 编译用证书,数据来自于provisioning profile中Certificates配置
CODE_SIGN_IDENTITY="iPhone Distribution: xxxxx (TEAMID)"

# Team 
DEVELOPMENT_TEAM="XXXXXXXXX"

# Schema,可以通过xcodebuild -list得到
BUILD_SCHEMENAME="APP_name" 

# 签名方式
SIGNING_STYLE="Manual"

export PATH=/usr/local/bin:/usr/libexec:$PATH
export LC_ALL="en_US.UTF-8"
# 该目录相对于xcworkspace文件的路径
ARCHIVE_FOLDER_PATH="../Outputs/APP_name.xcarchive"
INFOPLIST_FILE="../APP_name/Info.plist"

# 导出ipa的配置文件
EXPORT_OPTIONS_PLIST="exportOptions.plist";
#该参数定义了导出ipa包是ad-hoc,还是appStore的或者enterprise 
EXPORT_METHOD="ad-hoc";

cat << EOF > ${EXPORT_OPTIONS_PLIST}
<?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>destination</key>
	<string>export</string>
	<key>manageAppVersionAndBuildNumber</key>
	<true/>
	<key>method</key>
	<string>${EXPORT_METHOD}</string>
	<key>provisioningProfiles</key>
	<dict>
		<key>${APP_BUNDLE_IDENTIFIER}</key>
		<string>${APP_PROFILE}</string>
        <key>${PLUGIN_BUNDLE_IDENTIFIER}</key>
		<string>${PLUGIN_PROFILE}</string>
	</dict>
	<key>signingCertificate</key>
	<string>$CODE_SIGN_IDENTITY</string>
	<key>signingStyle</key>
	<string>manual</string>
	<key>stripSwiftSymbols</key>
	<true/>
	<key>teamID</key>
	<string>${DEVELOPMENT_TEAM}</string>
	<key>uploadBitcode</key>
	<false/>
	<key>uploadSymbols</key>
	<true/>
</dict>
</plist>
EOF

rm -rf /Users/baiyu/Library/Developer/Xcode/DerivedData/*

cd $WORKSPACE

rm -rf "./Outputs"
rm -rf "./DerivedData"


# 修改签名方式
sed -i '' "s/Automatic/${SIGNING_STYLE}/g" ./APP.xcodeproj/project.pbxproj || exit -1

# 开始编译
xcodebuild -list

# 解锁keychain
security unlock-keychain -p password  ~/Library/Keychains/login.keychain

# 进入工程文件
cd APP.xcodeproj 
# 修改plugin的PROVISIONING_PROFILE_SPECIFIER
for num in `sed -n "/PRODUCT_BUNDLE_IDENTIFIER = cn.org.APP.plugin;/=" project.pbxproj`
do
  new_no=`echo $((num + 2))`
  #cho "Neew line number is : $new_no"
  sed -i '' "$new_no s/PROVISIONING_PROFILE_SPECIFIER = \"\";/PROVISIONING_PROFILE_SPECIFIER = \"$PLUGIN_PROFILE\";/" project.pbxproj || exit -1 
  #sed -n "$new_nop" project.pbxproj
done
#修改APP的PROVISIONING_PROFILE_SPECIFIER
for num in `sed -n "/PRODUCT_BUNDLE_IDENTIFIER = cn.org.APP;/=" project.pbxproj`
do
  #echo "Current line number is : $num"
  new_no=`echo $((num + 2))`
  #echo "Neew line number is : $new_no"
  sed -i '' "$new_no s/PROVISIONING_PROFILE_SPECIFIER = \"\";/PROVISIONING_PROFILE_SPECIFIER = \"$APP_PROFILE\";/" project.pbxproj || exit -1
  #sed -n "$new_nop" project.pbxproj
done


# 执行编译
xcodebuild -workspace "project.xcworkspace" -scheme ${BUILD_SCHEMENAME} -configuration "${CONFIGURATION}" \
           archive CODE_SIGN_IDENTITY="${CODE_SIGN_IDENTITY}" DEVELOPMENT_TEAM="${DEVELOPMENT_TEAM}" -archivePath "${ARCHIVE_FOLDER_PATH}" \
           -derivedDataPath "DerivedData" 


#导出编译产物
xcodebuild -exportArchive -archivePath "${ARCHIVE_FOLDER_PATH}" -exportPath "../Outputs/" -exportOptionsPlist "$WORKSPACE/${EXPORT_OPTIONS_PLIST}"

# 压缩archive文件
cd ../Outputs
base=`basename ${ARCHIVE_FOLDER_PATH}`
zip -r "${base}.zip" "${base}"


由于没有在xcode命令行用法中找到2个provisioning profile的配置方法,所以我们通过修改工程的project.pbxproj文件,直接将APP和Plugin的provisioning 信息提前设置好,然后再执行编译。

同时,由于provisioning profile参数都已经设置好了,所以编译的时候直接指定主工程 schme参数为主APP的schema,并去掉PROVISIONING_PROFILE_SPECIFIER参数即可。

如果导出编译产物的时候出错,问题一定出在EXPORT_OPTIONS_PLIST文件中的那些关键配置。

总结

作为一个DevOps工程师,可能不必关心iOS的代码是怎样写的,但是一定要搞清楚ipa包是怎么产生出来的,需要掌握xcode的编译过程。对于单个provisioning profile的编译打包过程,网上比较多,这里不再赘述。

http://www.niftyadmin.cn/n/473673.html

相关文章

Vault部署保姆级教程

Vault部署 官方文档:Install | Vault | HashiCorp Developer 软件运行环境 操作系统发行版及版本:自己选 Vault版本:XXXX Vault配置文件路径:/etc/vault.d/vault.hcl Vault环境变量路径:/etc/vault.d/vault.env Vault TLS文件路径:/opt/vault/tls(Qqun830709780)…

jmeter压力测试报告模板案例

目录 一 测试内容 二 测试方法 三 测试目标 四 测试环境 五 系统部署 5.1 物理部署 5.2 网络访问 六 性能测试结果与分析 6.1 jmeter集群压测&#xff08;5进程-每个进行10线程&#xff09; 6.1.1 聚合报告 6.1.2 每秒的响应分布图 6.1.3 响应时间分布图 6.…

ChatGLM-6b本地安装手把手教学

什么是ChatGLM-6B ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型&#xff0c;基于 General Language Model (GLM) 架构&#xff0c;具有 62 亿参数。结合模型量化技术&#xff0c;用户可以在消费级的显卡上进行本地部署&#xff08;INT4 量化级别下最低只需 6GB 显存&…

国外学位论文去哪里查找下载

查找下载国外博士论文最合适的文献数据库就是ProQuest学位论文全文数据库。 ProQuest学位论文全文数据库覆盖了大部分北美地区高等院校以及世界其他地区数千个高等院校每年获得通过的博硕士论文。是将ProQuest公司PQDD文摘库&#xff08;现名PQDT&#xff09;中适合中国科研人…

ECCV2020-FRELU

论文链接&#xff1a;https://arxiv.org/pdf/2007.11824.pdf 官方代码&#xff1a;GitHub - megvii-model/FunnelAct paddle复现版本&#xff1a;FReLU&#xff1a;简单高效的新型激活函数 - 飞桨AI Studio torch复现版本&#xff1a;GitHub - nekitmm/FunnelAct_Pytorch: py…

供应链金融探索

一、供应链金融介绍 供应链金融是指通过金融工具和服务来支持供应链中各个环节的交易和资金流转&#xff0c;从而提高供应链效率和降低成本。 随着近几年的数字化建设发展&#xff0c;企业的交易的数据线上化程度越来越高。由供应链金融已有1.0发展至4.0阶段。 1.0阶段授信主…

Karl Guttag评Vision Pro(三):为什么飞机上VR观影体验不佳?

在过去25年里&#xff0c;AR/VR头显显示技术得到长足发展&#xff0c;采用的屏幕规格越来越高。据早前报告预测&#xff0c;VR头显安装基数会在2023年达到约2500万台。尽管如此&#xff0c;相比于无处不在的手机&#xff0c;我们几乎看不到周围有人随身携带AR/VR头显&#xff0…

AI数字人:语音驱动面部模型及超分辨率重建Wav2Lip-HD

1 Wav2Lip-HD项目介绍 数字人打造中语音驱动人脸和超分辨率重建两种必备的模型&#xff0c;它们被用于实现数字人的语音和图像方面的功能。通过Wav2Lip-HD项目可以快速使用这两种模型&#xff0c;完成高清数字人形象的打造。 项目代码地址&#xff1a;github地址 1.1…