前言
Jenkins就不过多介绍了,本人实现Xcode9+Jenkins+蒲公英自动化打包踩过了N多个坑,也构建了N多次才成功!!!!!
因此本文记录一下, 防止以后在入坑😂😂😂
~~好了,不多赘述了,直接进入正题
Jenkins环境下载及其配置
Jenkins运行需要Java环境,Java环境下载
1. Jenkins下载
2. 安装成功后,在浏览器中输入localhost:8080打开jenkins
3. 进入对于路径获取密码。secrets没有读取权限,需要开启权限,进行获取。
1:开启管理权限
2:开启对应用户读与写的权限
3:选择【应用到包含的项目...】
4:点击确定
4. 使用推荐安装,进行插件安装。
5. 如果进入的是离线模式,可以使用手动安装插件的方式。Jenkins插件地址。下载成功后,在【系统管理】-【管理插件】-【高级】进行上传插件。
如果可选插件里获取不到插件,可以尝试将站点替换成http://mirror.xmission.com/jenkins/updates/current/update-center.json进行尝试,如果还不可行,只能进行自行下载,然后上传的方式了。
6. 在【系统管理】-【管理插件】-【可选插件】安装所需插件"GitLab Plugin","Gitlab Hook Plugin","keychains and Provisioning Profiles Management","Git Parameter Plug-In"
7. 点击新建项目,输入项目名称,选择“构建一个自由风格的软件项目”,最后点击确认。
8. 在General中,勾选【参数化构建过程】-【添加参数】-【Git Parameter】,这里是在获取代码的前一步,进行代码分支选择。
Name:branch //参数名称
Description:分支选择 //描述
Parameter Type:Branch or Tag
9. 为本机添加SSH keys,并通过SHH keys进行连接远程仓库。为GitLab帐号添加SSH keys并连接GitLab
Repository URL :填写远程仓库的SSH地址
Credentials :点击右侧Add,如下图所示,填写SSH信息,然后点击保存。
(注:这里添加的SSH keys为私钥,并且将私钥内容全部复制过来)
Branches to build :填写第8步中的参数名称,我这里为branch
最后点击add。如果正常的配置正确的话,会出现红色的警告,就说明Jenkins还没有连通GitLab或者SVN,那就请再检查SSH Key是否配置正确。
10. 证书描述文件配置。
在Xcode中不要选择Automatically manage signing,需要手动配置描述文件,如下图所示。
注意:需要打包上传到蒲公英,需要打的是Adhoc的包,所有需要Adhoc的描述文件,这需要到苹果开发者中心进行生成下载。
这里只使用的Jenkins打包上传蒲公英,如果需要Jenkins自动打包上传AppStore,还需要生成App Store的描述文件。我这里两种Distribution都生成了,以免不时之需。
11. 配置keychains and Provisioning Profiles Management。
保存当前步骤,进入到Jenkins的系统管理,进入到keychains and Provisioning Profiles Management
进入到/Users/管理员用户名/Library/keychains文件目录下,将login.keychain文件拷贝到桌面,如果为macOS 10.13以上的系统,只有login.keychain-db文件,需要将login.keychain-db文件拷贝到桌面,将login.keychain-db文件重命名为login.keychain文件。点击【选择文件】,选择桌面的login.keychain文件,点击Upload,如下图所示。
接着上传描述文件。
Provisioning Profiles Directory Path
/Users/Shared/Jenkins/Library/MobileDevice/Provisioning Profiles // 如此填写即可。
点击Save进行保存。接下来回到项目的配置,在【构建环境】中勾选Keychains and Code Signing Identities与Mobile Provisioning Profiles,如图所示。
如果红框内容没有自动显示,点击【保存】,再重新进入到配置,就会自动显示了。
12.添加ExportOptions.plist问价。我们都知道,Xcode9之后,打出来的包不光ipa文件,还顺便生成配置文件,log等。所有我们想要用Xcode9通过xcodebuild生成ipa包,ExportOptions.plist文件必不可少,我将ExportOptions.plist放到了工程了同级目录下。ExportOptions.plist文件,我们可以通过Xcode打个ipa包出来,直接用生成的ExportOptions.plist就可以。
将ExportOptions.plist文件放到项目的根目录下。
13.在【构建】处,添加【增加构建步骤】选择【Execute shell】,然后进行编写脚本。
#!/bin/bash
#设置超时
export FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT=300
#计时
SECONDS=0
#工程绝对路径
project_path=$(cd `dirname $0`; pwd)
#工程名
project_name= XXX
#scheme名
scheme_name= XXX
#包类型
configuration="Adhoc"
#打包模式 Debug/Release
development_mode=Release
#build文件夹路径
build_path=${project_path}/build
#plist文件所在路径
exportOptionsPlistPath=${project_path}/ExportOptions.plist
#导出.ipa文件所在路径
exportIpaPath=${project_path}/IPADir/${development_mode}
echo ''
echo '///-----------'
echo '/// 正在清理工程'
echo '///-----------'
xcodebuild clean -configuration ${development_mode} -quiet || exit
echo ''
echo ''
echo '///--------'
echo '/// 清理完成'
echo '///--------'
echo ''
echo ''
echo '///-----------'
echo '/// 正在编译工程:'${development_mode}
echo '///-----------'
xcodebuild archive -workspace ${project_path}/${project_name}.xcworkspace -scheme ${scheme_name} -configuration ${development_mode} -archivePath ${build_path}/${project_name}.xcarchive -quiet || exit
echo ''
echo ''
echo '///--------'
echo '/// 编译完成'
echo '///--------'
echo ''
echo ''
echo '///----------'
echo '/// 开始ipa打包'
echo '///----------'
xcodebuild -exportArchive -archivePath ${build_path}/${project_name}.xcarchive -exportPath ${exportIpaPath} -exportOptionsPlist ${exportOptionsPlistPath} -allowProvisioningUpdates
echo ''
if [ -e $exportIpaPath/$scheme_name.ipa ];
then
echo '///----------'
echo '/// ipa包已导出'
echo '///----------'
open $exportIpaPath
else
echo '///-------------'
echo '/// ipa包导出失败 '
echo '///-------------'
fi
echo ''
echo '///------------'
echo '/// 打包ipa完成 '
echo '///-----------='
echo ''
echo ''
echo "++++++++++ipa文件所在路径: ${exportIpaPath}"
echo ''
echo ''
echo "开始上传到蒲公英"
#蒲公英apiKey
MY_PGY_API_K=XXX
#蒲公英uKey
MY_PGY_UK=XXX
curl -F "file=@${exportIpaPath}/${scheme_name}.ipa" -F "uKey=${MY_PGY_UK}" -F "_api_key=${MY_PGY_API_K}" https://qiniu-storage.pgyer.com/apiv1/app/upload
#输出总用时
echo ''
echo "===Finished. Total time: ${SECONDS}s==="
这里给出了我现在使用的shell脚本,包含了【ipa包生成】【上传蒲公英】。
其中的XXX为需要替换的地方。
蒲公英的ApiKey与UserKey在蒲公英的【账户设置】-【API信息即可查看】。
这里建议将shell脚本放到工程的根目录下,修改脚本直接提交代码就好,就不需要重新配置Jenkins了。
14.接下来进行构建项目。如图所示,构建成功。
15.新版本上传成功,【邮件通知】【手机短信通知】【微信信息通知】。这里使用的蒲公英的更新通知功能,前两项通知需要收费的,只有5次免费的机会。所以我们使用了【微信消息通知】。
常见问题
问题1:
No profiles for 'com.xxxxxxx.xxxxx' were found: Xcode couldn't find a
provisioning profile matching 'com.xxxxxxx.xxxxx'.
Code signing is required for product type 'Application' in SDK 'iOS 10.3'
将 /Users/管理员用户名/Library 的 MobileDevice 文件夹拷贝到 /Users/Shared/Jenkins/Library 下面
问题2:
No iOS profile matching 'xxxxxxxxxxxxxxxxxxxDistribution' found: Xcode couldn't find a profile
matching 'xxxxxxxxxxxxxxxxxxxDistribution'. Install the profile (by dragging and dropping it onto
Xcode's dock item) or select a different one in the General tab of the target editor.
Code signing is required for product type 'Application' in SDK 'iOS 10.3'
1.用 Xcode 打开 iOS 项目,在 【TARGETS】 - 【General】 中不勾选Automatically manage signing
2.如图配置开发证书:
3.配置完证书之后,需提交代码到 Git 远程仓库,确保 Jenkins 构建时能获取最新的证书配置
4.还要确保已经将 /Users/管理员用户名/Library 的 MobileDevice 文件夹拷贝到了 /Users/Shared/Jenkins/Library 下面
问题3:
报errSecInternalComponent错误, 如图所示
这个问题困扰了我很长的时间,在网上搜索造成此问题的原因是
The error comes from a mismatch in the provisioning profile setup and the certificates and the bundle id. Make sure that your PP, bundle id, and certificates are setup correctly in the and assigned correctly in itunes connect and in app.
按照解决办法,重启电脑,但是我并没有解决该问题。
最终,我将Jenkins全部删除,重新配置了一遍,此问题解决了。
2018-6-26号更新:
重新搭建Jenkins又遇到了此问题, 经过调研发现,根本原因是Jenkins,ssh方式到slave机上,默认是没有账户的,但是访问钥匙串要求必须有用户身份,所以添加一步输入密码解锁钥匙串,可以给Jenkins一个用户身份。
build步骤前添加一步解锁钥匙串。
security unlock-keychain -p "管理员密码" "login.keychain-db的路径"
如图所示:
最后, 问题解决~~~
~
~
~