jenkins 打包应用流程不是很复杂,却有很多的坑,需要细心处理
jenkins 一般两种:1. mac 上下载.pkg 文件直接安装
2. windows 上安装,通过http访问,要打包IOS 应用需要新建 macOS 节点,也可理解为分布式构建
jenkins 的安装及插件安装很简单网上资料很多就不赘述,主要分享一下配置中遇到的问题:
注意点: 1 . 插件下载:线上直接安装,安装不成功可选择离线安装(自己用的离线)
离线插件下载地址: http://updates.jenkins-ci.org/download/plugins/ 下载对应插件上传成功即可自动安装插件
Keychains and Code Signing Identities 对应的为 kpp-management-plugin/
2. 上传证书之后,没有pp 文件的添加入口,此时需要在上传 证书的地方继续上传 对应工程的 pp 文件 (这里没注意,之前总感觉跟网上别人的不一样,我的没有 pp 入口,上传pp 文件之后pp 对应的内容会自动填充)
3. ssh 的配置:
添加完 ssh 之后如果能连接上 git (没有出现红色的错误信息)说明连接成功,此时可以构建拉取代码试一下。
4. 代码拉取:如果文件比较大网速又慢,则会clone 工程文件失败(jenkins 先会将工程文件压缩在接收拉取文件),默认时间为10分钟,若10 分钟没有完成则会失败(自己项目比较大,进行到 80% 就失败,我开始以为是自己的 ssh 没配置好,jenkins 与 git 之间有问题,实际是项目较大,网速较慢)。另一说是: git 插件不稳定,卸载git 插件再安装低版本的git 插件版本(我没试过,我的原因是因为项目较大)。 此时可更改源码管理 --> add -- > 设置 clone time(单位 分钟),再重新构建
5 . 构建脚本:
# 工程名
APP_NAME="Anyo"
# 证书
CODE_SIGN_DISTRIBUTION="xxxxxxx
# info.plist路径 路径根据自己工程路径修改
project_infoplist_path="./${APP_NAME}/Info.plist"
#取版本号
bundleShortVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleShortVersionString" "${project_infoplist_path}")
#取build值
bundleVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleVersion" "${project_infoplist_path}")
DATE="$(date +%Y%m%d)"
#输出路径 注意输出路径要在 jenkins 穿建文件夹中,自己手动创建的文件夹可能会导出包失败
IPANAME="Library/${APP_NAME}_V${bundleShortVersion}_${DATE}.ipa"
echo "================= 构建中 ================="
echo "=================clean================="
xcodebuild -target "${APP_NAME}" -configuration 'Release' clean
echo "+++++++++++++++++build+++++++++++++++++"
# 设置 team
sed -i "" s/'DEVELOPMENT_TEAM = "team 名称.";'/'DEVELOPMENT_TEAM = "team 名称";'/g 项目名称.xcodeproj/project.pbxproj
# xcodebuild 命令开始构建包
xcodebuild -target "${APP_NAME}" -sdk iphoneos -configuration 'Release' CODE_SIGN_IDENTITY="${CODE_SIGN_DISTRIBUTION}" SYMROOT='$(PWD)'
echo "+++++++++++++++++ 正在打包完成 +++++++++++++++++"
echo "+++++++++++++++++ 开始编译 .app -- .ipa 文件 +++++++++++++++++"
xcrun -sdk iphoneos PackageApplication "./Release-iphoneos/${APP_NAME}.app" -o ~/"${IPANAME}"
echo "+++++++++++++++++ 编译 .app -- .ipa 文件完成 +++++++++++++++++"
注意:在打包命令中会出现一些问题:
Check dependencies xxxx has conflicting provisioning settings. xxxx is automatically signed, but code signing identity iPhone Distribution: 证书文件 has been manually specified. Set the code signing identity value to "iPhone Developer" in the build settings editor, or switch to manual signing in the project editor.
关于证书打包的几点问题:
1.在macOS 10.10 以后不支持 xcode 插件打包(网上资料)
2.xcode 8 之后证书管理有xcode 会自动帮我们管理证书,但用jenkins 打包会产生问题。解决方法: 去掉
manual signing 选项,改为手动选择证书。
3.安装jenkins 后,mac 会自动创建jenkins 用户,jenkins 的操作都是在 jenkins 用户下完成的,而关于证书的操作需要访问钥匙串,jenkins 用户是没有这个权限,shell 中也没有地方是可以让用户输入本机密码的,所以:1 先要将 本机用户下的 配置文件 全部拷贝到 jenkins 用户下 /User/用户名/资源库/MobileDevice/Provisioning Profiles ----> /User/Shared/Jenkins/Library/MobileDevice/Provisioning Profiles 没有 MobileDevice/Provisioning Profiles 文件夹自己手动创建
4.访问jenkins keychain 文件需要本机密码: User interaction is not allowed.
Signing Identity: "iPhone Distribution: ** Co., Ltd."
Provisioning Profile: "**"
(**----**)
/usr/bin/codesign --force --sign ** --entitlements /Users/Shared/Jenkins/Home/workspace//build/**.build/Release-iphoneos/*.build/*..--timestamp=none /Users/Shared/Jenkins/Home/workspace/**/build/Release-iphoneos/**.app
/Users/Shared/Jenkins/Home/workspace/*/build/Release-iphoneos/**.app: User interaction is not allowed.
解决方法: 在 sehll 脚本中加入下面脚本 pwd 为本机用户密码
/usr/bin/security unlock-keychain -p pwd ~/Library/Keychains/login.keychain
执行一次之后可将这行脚本删除
6. 构建成功之后可在目标输出文件夹中找到打包好的 .ipa 文件。
7. 构建 .ipa 文件注意点: 证书选择: 1. adHoc 文件,要进行内测,除了 jenkins 中要选择对应证书之外,xcode 中的证书也要选择 adHoc 证书,否则导出的 .ipa 文件上传蒲公英等第三方内测平台的话会出现下载完无法安装的情况。
8.首次构建遇到了不少问题,jenkins 部署不难但需要细心
9. 构建完成后 脚本上传 第三方测试平台 及 上传 appStore 后续会持续更新
注: 修改jenkins 端口: jenkins 端口号默认8080 ,但这个端口被占用其它服务可能无法使用,修改步骤:
1. 首先停止 jenkins 服务。普通用户下执行 停止服务:sudo launchctl unload -w /Library/LaunchDaemons/org.jenkins-ci.plist
2.修改端口:sudo defaults write /Library/Preferences/org.jenkins-ci httpPort 7070 // 比如为 7070
3.重启:sudo launchctl load -w /Library/LaunchDaemons/org.jenkins-ci.plist 到此,可以访问了:http://localhost:7070
修改的前提是是要先 停止 服务