Jenkins 实现 iOS 项目自动打包
共 8286字,需浏览 17分钟
·
2021-12-31 05:16
转自:掘金 Perry_6
https://juejin.cn/post/6920469161021816846
Jenkins 概述
Jenkins 是一款流行的开源持续集成(Continuous Integration)工具,广泛用于项目开发,具有自动化构建、测试和部署等功能。Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。通常与版本管理工具(SCM)、构建工具结合使用。常用的版本控制工具有SVN、GIT,构建工具有Maven、Ant、Gradle。
安装 Jenkins
由于Jenkins 依赖于Java,所以在安装Jenkins前,需要先检查是否已安装Java环境。在终端输入命令进行检测:
$ java -version
前往官网下载
点击进入安装说明页面,可以按照提示命令安装
使用 Homebrew 软件包管理器安装Jenkins 。
自制安装程序 jenkins-lts 。
安装命令:
安装最新的LTS版本: brew install jenkins-lts
安装特定的LTS版本: brew install jenkins-lts@YOUR_VERSION
启动 Jenkins 服务: brew services start jenkins-lts
重新启动 Jenkins 服务: brew services restart jenkins-lts
更新 Jenkins 版本: brew upgrade jenkins-lts
安装步骤
启动 Jenkins 服务后,浏览 http://localhost:8080 ,该页面需要确认是管理员安装,让我们输入密码,密码存放在红色的目录下,取出来填到输入框里就行。
选择安装推荐的插件。
等待插件安装完成,有的插件可能会安装失败,建议重试,直到把建议安装的都装好。
插件安装完成后会自动跳转到配置完管理员账户
点击保存并完成,完成注册
Jenkins 配置
打开浏览器,输入localhost:8080,即可打开Jenkins,输入密码,点击继续。
重启Jenkins
因部分插件依赖可能出现错误 待创建好用户后,可以重启Jenkins,并用刚创建的账户或者admin账户登录Jenkins。重启Jenkins方法,命令行中输入jenkins-lts
,回车即可。
安装iOS相关插件
iOS打包需要钥匙串中访问证书、描述文件等,所以我们要安装钥匙串和描述文件插件。进入Jenkins->系统管理->插件管理安装相关插件,可通过右上角过滤搜索。然后选择需要安装的插件,进行勾选,安装。安装成功后可以选择是否重启Jenkins。 等待安装完成后重启 jenkins
配置钥匙串
成功之后,我们可以在Jenkins首页->系统管理中发现刚才我们安装的Keychains and Provisioning Profiles Management,点击进入配置钥匙串和描述文件。 上传keychain和provisioning Profile文件。 可以在钥匙串中看到登录的钥匙串路径,然后只需要按照路径找到这个文件上传(点击upload)即可。 注意:login.keychain-db是上传不了的,我们需要复制一份,改为login.keychain。另外上传的时候,找不到路径,是因为资源库被隐藏起来了,需要使用command+shift+.将其显示出来,就可以了。 注意:Code Signing Identity是可以配置多个的,我们可以把通知证书、发布证书都加入到里面,方法就是点击下面的Add Code Sign Identity。
配置描述文件
先上传Provisioning Profiles文件,这些文件的路径为/Users/[你的电脑用户名]/Library/MobileDevice/Provisioning Profiles,在此路径下找到相应的项目的profile文件上传,拖入终端会显示整个路径,复制过来,点击保存就OK了,现在 Jenkins
不需要一个一个上传描述文件了😁。 到此为止整个插件配置完成。
创建一个工程
新建任务
选第一个,输入工程名称,点击确定。
构建配置
General
源码管理
我使用Git,credentials是登录的账号密码,打包分支可以根据需要设置 如果没有添加一个,如下图
构建环境
选择刚才插件填写的对应证书。
构建(关键)
点击增加构建步骤,选择执行shell,输入打包脚本
脚本说明
-exportArchive有一个文件adhoc_ExportOptions.plist。 不用自己创建,可以使用xcode导出ipa后,从导出的文件夹里获取。名字为ExportOptions.plist,修改一下名字就行了 method:有四种渠道。我将他们做了区分,分成四个不同的plist文件。
分别为 app-store ad-hoc enterprise development
打包导出ipa后需要执行上传内测或应用平台,我是上传的蒲公英, 使用cURL直接上传到蒲公英,具体命令蒲公英官方有提供 蒲公英API,获取uKey 和 _api_key也是在这个页面
到这里就配置完了,点击保存,可以开始构建了。
附打包脚本
#!/bin/sh
export LANG=en_US.UTF-8
# 1.设置配置标识,编译环境(根据需要自行填写 release |debug )
configuration="release"
# 工程名(根据项目自行填写)
APP_NAME="TestDome"
# TARGET名称(根据项目自行填写)
TARGET_NAME="TestDome"
# ipa前缀(根据项目自行填写)
IPA_NAME="测试"
# info.plist路径
#project_infoplist_path="./${TARGET_NAME}/Info.plist"
# 取版本号
#bundleShortVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleShortVersionString" "${project_infoplist_path}")
#bundleVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleVersion" "${project_infoplist_path}")
# 日期
DATE=$(date +%Y%m%d-%H-%M-%S)
# 工程文件路径
ARCHIVE_NAME="${APP_NAME}_${DATE}.xcarchive"
# 存放ipa的文件夹名称(根据自己的喜好自行修改)
IPANAME="${APP_NAME}_${DATE}_IPA"
# 工程根目录#工程源码目录(这里的${WORKSPACE}是jenkins的内置变量表示(jenkins job的路径):/Users/plz/.jenkins/workspace/TestDome/)
# ${WORKSPACE}/TestDome/ 中的TestDome根据你的项目自行修改
CODE_PATH="${WORKSPACE}"
# 要上传的ipa文件路径 ${username} 需要换成自己的用户名
ROOT_PATH="/Users/${username}/Desktop/Jenkins"
ARCHIVE_PATH="${ROOT_PATH}/Archive/${ARCHIVE_NAME}"
IPA_PATH="${ROOT_PATH}/Export/${IPANAME}"
echo "ARCHIVE_PATH: ${ARCHIVE_PATH}"
echo "IPA_PATH: ${IPA_PATH}"
echo "IPA_PATH:\n${IPA_PATH}">> export_history.txt
# 导包方式(这里需要根据需要手动配置:AdHoc/AppStore/Enterprise/Development)
EXPORT_METHOD="AdHoc"
# 导包方式配置文件路径(这里需要手动创建对应的XXXExportOptionsPlist.plist文件,并将文件复制到根目录下[我这里在源项目的根目录下又新建了ExportPlist文件夹专门放ExportPlist文件])
if test "$EXPORT_METHOD" = "AdHoc"; then
EXPORT_METHOD_PLIST_PATH=${CODE_PATH}/ExportOptions/AdHocExportOptions.plist
elif test "$EXPORT_METHOD" = "AppStore"; then
EXPORT_METHOD_PLIST_PATH=${CODE_PATH}/ExportOptions/AppStoreExportOptios.plist
elif test "$EXPORT_METHOD" = "Enterprise"; then
EXPORT_METHOD_PLIST_PATH=${CODE_PATH}/ExportOptions/EnterpriseExportOptions.plist
else
EXPORT_METHOD_PLIST_PATH=${CODE_PATH}/ExportOptions/DevelopmentExportOptions.plist
fi
# 指ipa定输出文件夹,如果有删除后再创建,如果没有就直接创建
if test -d ${IPA_PATH}; then
rm -rf ${IPA_PATH}
mkdir -pv ${IPA_PATH}
echo ${IPA_PATH}
else
mkdir -pv ${IPA_PATH}
fi
# 进入工程源码根目录
cd "${CODE_PATH}"
# 执行pod
pod install --verbose --no-repo-update
#mkdir -p build
# 清除工程
echo "++++++++++++++++clean++++++++++++++++"
xcodebuild clean -workspace ${APP_NAME}.xcworkspace -scheme ${APP_NAME} -configuration ${configuration}
# 将app打包成xcarchive格式文件
echo "+++++++++++++++++archive+++++++++++++++++"
xcodebuild archive -workspace ${APP_NAME}.xcworkspace -scheme ${APP_NAME} -configuration ${configuration} -archivePath ${ARCHIVE_PATH}
# 将xcarchive格式文件打包成ipa
echo "+++++++++++++++++ipa+++++++++++++++++"
xcodebuild -exportArchive -archivePath ${ARCHIVE_PATH} -exportPath "${IPA_PATH}" -exportOptionsPlist ${EXPORT_METHOD_PLIST_PATH} -allowProvisioningUpdates
# 删除工程文件
# echo "+++++++++删除工程文件+++++++++"
# rm -rf $ARCHIVE_PATH
# 蒲公英上传结果日志文件路径
PGYERLOG_PATH="${IPA_PATH}/upload_pgyer_log"
# 创建蒲公英上传结果日志文件夹
mkdir -p ${PGYERLOG_PATH}
# 创建蒲公英上传结果日志文
touch "${PGYERLOG_PATH}/log.txt"
# 上传IPA到蒲公英 根据蒲公英官方文档编写
file_path="${IPA_PATH}/${IPA_NAME}.ipa"
echo "正在上传文件"
echo $file_path
curl -F "file=@${file_path}" -F "uKey=0ea4142136d51cbe5aaf94cdbf6aaeb1" -F "_api_key=16d3ff684c5576f9d9f6c958cf0a7300" https://upload.pgyer.com/apiv1/app/upload
构建 (打包上传)
立即构建
点击立即构建开始构建
点击构建版本可以查看状态和控制台输出信息
Jenkins 打包 ipa 常见错误汇总
问题1. pod时候会出现 command not found
当你jenkins服务在非OS X系统运行时,使用Mac节点的配置稍微不一样。
解决方案
系统管理-系统配置-全局属性
值:在终端中输入echo $PATH将输出内容复制填写。
问题2:ipa包导出失败,导致报错:curl: (26) Failed to open/read local data from file/application
1.先去文件路径下查看打包是否成功,路径下包含已经IPA文件,确定路径没有问题;
2.查看脚本文件中的路径,脚本中的ipa名称与打包出来的IPA文件的名称不一致。
解决方案
将脚本中的ipa名称改为应用的显示名称
问题3. 打包时报错:error: exportArchive: The data couldn’t be read because it isn’t in the correct format.
解决方案 1
xcode archive 导出 ipa 时不要勾选 Rebuild from Bitcode ,导出的
ExportOptions.plist
替换项目目录下的AdHocExportOptions.plist
解决方案 2
需要把xcode上的BitCode关闭,设置成No即可,project和targets里面对应的BitCode都需要关闭
问题4. 打包时报错:xcodebuild: error: 'APP.xcworkspace' does not exist
解决方案
Choose Product > Scheme > Manage Schemes.
Share your scheme:
也可能是Xcode Workspace File 路径错误
问题5. 编辑报错 error: /Users/plz/.jenkins/workspace/target_name/Pods/Target Support Files/Pods-HIGO/Pods-HIGO.release.xcconfig: unable to open file (in target "target_name" in project "target_name") (in target 'target_name' from project 'target_name')
解决方案
shell脚本中添加如下命令
1. sudo gem install cocoapods --pre
2. pod install
如果不行 加上 3. pod update
问题6. 编辑报错 This project contains no schemes
解决方案
这里我们不能去Jenkins项目目录下修改Xcode项目的shared勾选,我们应该在本地的开发源码上修改,然后提交到git远程仓库,再次构建!!
问题7. 编辑报错 `xcodebuild -exportArchive -archivePath /xxx.xcarchive -exportOptionsPlist /Users/xxx/ExportOptions.plist -allowProvisioningUpdates -exportPath ./
error: archive not found at path '/xxx.xcarchive' Build step 'Execute shell' marked build as failure`
解决方案
用脚本构建时,脚本输写错误
问题8. 编辑报错 error: archive not found at path '/Users/plz/Desktop/Jenkins/HIGO/Archive/HIGO_20210122-15-43-31.xcarchive'
查看日志发现在执行
pod install
时中断了,引入的三方库没有拉下来
解决方案
按照日志提示 shell 脚本 pod install 前执行 pod update PLPlayerKit --no-repo-update
参考文章
Jenkins+github+fir持续集成iOS项目
iOS: Jenkins + xcodebuild打包ipa + 上传蒲公英
-End-
最近有一些小伙伴,让我帮忙找一些 面试题 资料,于是我翻遍了收藏的 5T 资料后,汇总整理出来,可以说是程序员面试必备!所有资料都整理到网盘了,欢迎下载!
面试题
】即可获取