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

这篇具有很好参考价值的文章主要介绍了使用jenkins创建双provisioning profile的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窗口进行如下配置,来实现打包:文章来源地址https://www.toymoban.com/news/detail-503796.html

# 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的编译打包过程,网上比较多,这里不再赘述。

到了这里,关于使用jenkins创建双provisioning profile的iOS安装包的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • iOS 验证一下配置provisioning file有没有生效,

    iOS开发过程中账号多了,就会产生很多provisioning profile文件,Xcode 没有自带删除功能。provisioning profile文件都在 /Library/MobileDevice/Provisioning Profiles 这个文件夹下。 1、通过终端进入到此文件夹,通过日期删除(个人不推荐,因为文件名都是加密过的,通过日期不好辨认,容易操

    2024年02月13日
    浏览(22)
  • 在ios设备上运行Unity Profiler

    久违了朋友们。 最近基于Unity 2021.3 和AR Foundation开发了个应用,需要在ipad上实际运行时查看程序的各项指标功耗。 于是乎,我尝试跟随者官方教程来实时调试,现在附上一些心得。 按照官方的三步走,Build and Run理论上会自动开启XCode,但是我的XCode默认却是布置到Mac上,于

    2024年04月27日
    浏览(30)
  • 【运维知识高级篇】超详细的Jenkins教程1(安装部署+配置插件+创建自由风格项目+配合gitlab实现Jenkins自动触发)

    Jenkins是一个开源软件项目,是基于Java开发的一种持续集成的工具,用于监控持续重复的工作, 旨在提供一个开放易用的平台,使软件的持续集成变成可能,是持续集成的核心,可以与其他软件进行协作,例如,gitlab推送给测试环境代码,可以通过Jenkins省略步骤,实现自动

    2024年02月05日
    浏览(42)
  • Centos安装Jenkins,解决插件安装失败问题

    Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,广泛用于项目开发,具有自动化构建、测试和部署等功能。Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。通常与版本管理工具(SCM)、构建工具结合使用。 因为开发部门同时维护多个版本

    2024年02月09日
    浏览(28)
  • Jenkins 教程|完美解决Jenkins安装失败、运行失败和账号丢失问题

    😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD 如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。😊 座右铭:不想当开发的测试,不是一个好测试✌️。 如果感觉博主的文章还不错的话,还请点赞、收藏哦

    2024年02月07日
    浏览(38)
  • ReactNative进阶(三十四):Jenkins 流水线 组包 iOS 应用包 ipa Archive 阶段报错error: Multiple commands produce问题修复及思考

    在应用RN开发跨平台APP阶段,从git中拉取项目,应用Jenkins进行组包时,发现最终生成的ipa安装包版本号始终与项目中设置的版本号不一致。 经过仔细排查,发现Jenkins在 Archive 编译、归档阶段失败,但是后续 Export 阶段生成了ipa包。 在xCode中打开应用,选中项目 target - Build p

    2024年02月10日
    浏览(30)
  • Jenkins 安装插件失败问题解决方案

    安装 jenkins 总是安装部分插件失败 1.切换下载源地址 1点击 \\\"系统管理\\\" - \\\"纠正\\\"  /  \\\"Manage Jenkins\\\" - \\\"Correct\\\" 2.点击 “高级\\\" / Advanced 3.找到页面最下面的 ”升级站点“ / Update Site ,替换链接为: ​​​​​https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json​​ 2.修改服务器

    2024年02月15日
    浏览(33)
  • 使用swift创建第一个ios程序

    一、安装xcode 先到app store中下载一个Xcode app 二、创建项目 1、项目设定 创建ios app 2、工程结构 三、修改代码实现按键联动 四、运行测试

    2024年01月17日
    浏览(30)
  • 使用Github.io创建自己的博客

    Fork repo, https://github.com/academicpages/academicpages.github.io 进入fork的项目中,点击Setting,把名字改成你的github名字.github.io (yourname.github.io), 下载fork后的项目到本地,vscode打开准备开始编辑修改 2.2.1 基本修改 把 _config.yml 中的内容全部复制到 _config.dev.yml 中,后者当做备份,然后对前

    2024年02月05日
    浏览(42)
  • 《npm安装依赖、Jenkins打包系列问题》遇到问题可以在此处跟,定期补充进来

    此处记录前端 Jenkins及下载依赖时碰到的各类问题 构建时出现的错误截图: 查了一下说要升级node? https://stackoverflow.com/questions/66586352/referenceerror-globalthis-is-not-defined 可是公司环境基本上node都是 10.xxx版本,升级是定然不行的。 不需要升级node版本 固定sass版本后可正常打包 截图

    2024年01月25日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包