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,点击进入配置钥匙串和描述文件。
注意: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
- 先去文件路径下查看打包是否成功,路径下包含已经IPA文件,确定路径没有问题;
- 查看脚本文件中的路径,脚本中的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 + 上传蒲公英