iOS Jenkins CI 集成上传fir、AppStore
背景:由于我司的App比较多,为了方便测试人员测试,所以配置Jenkins去自动打包。
集成步骤
下载dmg
在Jenkin官网下载Jenkins的安装包 Jenkin官网下载
选择相应系统下的安装包
安装
采用Jenkins安装包的方式安装就比较傻瓜式了,只需要点击继续就可以了
等Jenkins启动成功后会看到下面这个页面, 去到 '/Users/Shared/Jenkins/Home/secrets' 目录下
如果没有权限打开这个文件夹,就打开secrets的简介,修改这个文件夹的属性。
修改secrets文件夹的属性后就可一看到这些文件,打开终端执行 sudo more /Users/Shared/Jenkins/Home/secrets/initialAdminPassword命令(也可以直接在编辑器中打开文件)
执行命令结束后会拿到一串密码复制后粘贴在浏览器中点击continue就可以了
建议选择左侧的选项,安装jenkins推荐的插件就可以了
至此
Jenkins
安装已经结束下面我们开始配置我们的Jenkins
Jenkins 配置
在配置
Jenkins
时,我们首先要做的就是安装关于iOS
的插件,在我们使用
xcode
打包的时候需要配置证书和描述文件,所以Jenkins
用户需要一个和电脑用户中间的一个媒介来管理证书我描述文件。我们需要安装Keychains and Provisioning Profiles Management
插件。
新建任务
在
Jenkins
首页的右上角选择新建 -> 输入项目的名称(推荐选择构建一个自由风格的软件项目选项
)-> 保存后会到项目的配置页面
在源码选项下有 None
、Git
、Subversion
三个选项。由于我司的代码是在
git
下托管的,所以我配置的也是 git
。不相同的同学简单配置下,步骤应该差不多。
说明:这里遇到一个小坑,在输入代码的URL会有一个上面所示的红色错误,是讲没有权限连接远程仓库,我就把自己电脑上的git私钥添加到Jenkins上(图中点击Credentials选项后面的add按钮,不会的同学下面会有图文教程)。当我把私钥添加到git服务器上后,事实告诉我然并卵。
解决办法:因为在构建的时候是
Jenkins
去构建,所以应该是在Jenkins
用户下去生成git
的公钥和私钥。那么:
// 1.首先我们要为 Jenkins 用户设置一个登陆密码(初始密码就是之前的那一串很长的密码)
$ sudo dscl . passwd /Users/jenkins passWord---(同学,不要全部复制好吗password是要设置的密码)
// 2.登陆Jenkins用户
$ sudo su jenkins ----之后输入刚才设置的Jenkins的登陆密码
// 3.生成Jenkins的git公钥和私钥
$ ssh-keygen -t rsa -C "你的邮箱标识" -f ~/.ssh/jenkins
公钥和私钥生成
至此Jenkins用户下的 git 公钥和私钥就生成完毕,去到/Users/Shared/Jenkins 修改.ssh文件的权限(不会的同学,看下面的图)
这时打开.ssh文件就可以看到刚才生成的公钥和私钥
// 修改权限后打开终端运行
$ sudo more /Users/Shared/Jenkins/.ssh/jenkins.pub
// 将公钥上传到 `git` 服务器
// 同上运行,查看公钥
$ sudo more /Users/Shared/Jenkins/.ssh/jenkins
// 得到 Jenkins 的 git 私钥如下图:
-
添加私钥
这时刚才的错误已经不见了,恭喜老铁
如果打包的时候只需要打某一个分支的ipa,只需要修改branches to build 选项中的分支名即可。
点击立即构建,这时我们需要等待几分钟。累了的同学可以下去抽支烟
几分钟后我们会看到:
这时代码已经拉取到我们Jenkins目录下,有兴趣的同学可以去看一下
这时我们的Jenkins配置基本上结束了,下面就是进行打包的配置。
针对iOS自动化打包的配置
1.上传钥匙串。选择 系统管理
-> `Keychains and Provisioning Profiles Management
login.keychain在
/Users/用户名/Library/Keychains/login.keychain
目录下,选中login.keychain
点击upload
即可,而Provisioning Profiles Directory Path
就是本机安装的描述文件的目录是在/Users/用户名/Library/MobileDevice
目录下的。配置结束后点击Save
按钮即可
说明:当点击
upload
按钮后在/Users/Shared/Jenkins/Home/kpp_upload
目录下的login.keychain
就是刚刚上传的钥匙串
。如果在/Users/Shared/Jenkins/Library/MobileDevice
目录下没有Provisioning Profiles
文件,就从/Users/admin/Library/MobileDevice
目录下拷贝一份放过去。不然就会打包失败, 失败的日志如下图:
打包前xcode中项目配置
achieve项目配置如下图:
说明:因为我们要去脚本中指定证书,所以在xcode中我们不做任何证书方面的处理
补充:在xcode
的菜单栏选中product
->Scheme
->Manage Schemes
查看对要打包的scheme
后面的shared
勾有没有打上,不然打包的时候会报scheme not found
的错误导致打包失败
export ipa 项目配置:
我们需要在项目中配置一个plist来告诉xcodebuild下面的信息
metmod : 常用的值development
、app-store
、ad-hoc
teamID: 就是打包证书名称括号里的那一串字符串拷贝一下就可以了
compileBitcode:Boolean
值, 推荐使用yes
, 这样打出来的包体积计较小
附exportPlist配置图:
打包脚本
JENKINS_USERS=root
APP_NAME=""
CONFIGURATION="Debug"
Scheme=""
#描述文件udid
PROVISIONING_PROFILE_SPECIFIER="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx"
#打包证书名称
CODE_SIGN_DISTRIBUTION=""
#exportplist的路径
EXPORTPLIST_PATH=""
#读取项项目的信息
project_infoplist_path="./${APP_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)"
IPANAME="${APP_NAME}_V${bundleShortVersion}_${DATE}.ipa"
IPA_PATH="$HOME/${IPANAME}"
security unlock-keychain -p "这里写上用户登录密码 解锁钥匙串" "${HOME}/Home/kpp_upload/login.keychain" || failed "unlock-keygen"
#没有使用cocoapod的打包方式
scheme "${APP_NAME}" -configuration '{$CONFIGURATION}' clean
xcodebuild archive -project "${APP_NAME}.project" -configuration "${Configuration}" -scheme "${Scheme}" -archivePath "$HOME/${APP_NAME}_V${bundleShortVersion}_${DATE}" CODE_SIGN_IDENTITY="${CODE_SIGN_DISTRIBUTION}" PROVISIONING_PROFILE_SPECIFIER="${PROVISIONING_PROFILE_SPECIFIER}"
xcodebuild -exportArchive -archivePath "$HOME/${APP_NAME}_V${bundleShortVersion}_${DATE}.xcarchive" -exportOptionsPlist "${EXPORTPLIST_PATH}" -exportPath "${HOME}"
#使用cocoapod的打包方式
xcodebuild -workspace "${APP_NAME}.xcworkspace" -scheme "${APP_NAME}" -configuration '{$CONFIGURATION}' clean
xcodebuild archive -workspace "${APP_NAME}.xcworkspace" -configuration "${Configuration}" -scheme "${Scheme}" -archivePath "$HOME/${APP_NAME}_V${bundleShortVersion}_${DATE}" CODE_SIGN_IDENTITY="${CODE_SIGN_DISTRIBUTION}" PROVISIONING_PROFILE_SPECIFIER="${PROVISIONING_PROFILE_SPECIFIER}"
xcodebuild -exportArchive -archivePath "$HOME/${APP_NAME}_V${bundleShortVersion}_${DATE}.xcarchive" -exportOptionsPlist "${EXPORTPLIST_PATH}" -exportPath "${HOME}"
if [ CONFIGURATION=="Debug" ]
then
#上传至fir.im 日志可以看到内测app的链接
fir publish 这里是打包结束的ipa的路径 -T这里是fir.im上的token -c "${commit_msg}"
else if [ CONFIGURATION=="Release" ]
then
#上传appStore
altoolPath="/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool"
"${altoolPath}" --validate-app -f "${IPA_PATH}/"${APP_NAME}".ipa" -u 开发者账号 -p 账号密码 -t ios --output-format xml
"${altoolPath}" --upload-app -f "${IPA_PATH}/"${APP_NAME}".ipa" -u xxf@开发者账号 -p 账号密码 -t ios --output-format xml
fi
补充:上传
ipa
到appStore
的时候报说altool file not found
,需要给altool
建立软链接 打开终端执行
ln -s /Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/itms /usr/local/itms
至此,iOS端的jenkins自动化集成就配置基本结束了,刚开始配的时候也踩了不少坑,也请教了很多大牛。所以小白整理了一下,有不正确的地方欢迎大牛们指正,感谢~~~~