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.plistelif test "$EXPORT_METHOD " = "AppStore" ; then EXPORT_METHOD_PLIST_PATH=${CODE_PATH} /ExportOptions/AppStoreExportOptios.plistelif test "$EXPORT_METHOD " = "Enterprise" ; then EXPORT_METHOD_PLIST_PATH=${CODE_PATH} /ExportOptions/EnterpriseExportOptions.plistelse EXPORT_METHOD_PLIST_PATH=${CODE_PATH} /ExportOptions/DevelopmentExportOptions.plistfi # 指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.
解决方案 1xcode 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 + 上传蒲公英