iOS Jenkins CI 集成上传fir、AppStore

iOS Jenkins CI 集成上传fir、AppStore

背景:由于我司的App比较多,为了方便测试人员测试,所以配置Jenkins去自动打包。

集成步骤

下载dmg

在Jenkin官网下载Jenkins的安装包 Jenkin官网下载

选择相应系统下的安装包

安装

采用Jenkins安装包的方式安装就比较傻瓜式了,只需要点击继续就可以了

《iOS Jenkins CI 集成上传fir、AppStore》 点击继续
《iOS Jenkins CI 集成上传fir、AppStore》 点击同意
《iOS Jenkins CI 集成上传fir、AppStore》 点击安装
《iOS Jenkins CI 集成上传fir、AppStore》 输入用户登录密码并点击安装软件开始安装Jenkins
《iOS Jenkins CI 集成上传fir、AppStore》 正在安装
《iOS Jenkins CI 集成上传fir、AppStore》 安装成功
《iOS Jenkins CI 集成上传fir、AppStore》 这时候会多了一个jenkins用户
《iOS Jenkins CI 集成上传fir、AppStore》
《iOS Jenkins CI 集成上传fir、AppStore》

等Jenkins启动成功后会看到下面这个页面, 去到 ‘/Users/Shared/Jenkins/Home/secrets’ 目录下

《iOS Jenkins CI 集成上传fir、AppStore》

如果没有权限打开这个文件夹,就打开secrets的简介,修改这个文件夹的属性。

《iOS Jenkins CI 集成上传fir、AppStore》

修改secrets文件夹的属性后就可一看到这些文件,打开终端执行 sudo more /Users/Shared/Jenkins/Home/secrets/initialAdminPassword命令(也可以直接在编辑器中打开文件)

《iOS Jenkins CI 集成上传fir、AppStore》

执行命令结束后会拿到一串密码复制后粘贴在浏览器中点击continue就可以了

《iOS Jenkins CI 集成上传fir、AppStore》

建议选择左侧的选项,安装jenkins推荐的插件就可以了

《iOS Jenkins CI 集成上传fir、AppStore》 开始安装插件
《iOS Jenkins CI 集成上传fir、AppStore》 创建管理员账户

至此 Jenkins 安装已经结束下面我们开始配置我们的 Jenkins

Jenkins 配置

在配置 Jenkins 时,我们首先要做的就是安装关于 iOS 的插件,在我们使用
xcode 打包的时候需要配置证书和描述文件,所以 Jenkins 用户需要一个和电脑用户中间的一个媒介来管理证书我描述文件。我们需要安装 Keychains and Provisioning Profiles Management 插件。

《iOS Jenkins CI 集成上传fir、AppStore》 选择系统管理然后选择插件管理
《iOS Jenkins CI 集成上传fir、AppStore》 在可选插件中选择Keychains and Provisioning Profiles Management插件点击直接安装

新建任务

Jenkins 首页的右上角选择新建 -> 输入项目的名称(推荐选择 构建一个自由风格的软件项目选项 )-> 保存后会到项目的配置页面

《iOS Jenkins CI 集成上传fir、AppStore》

在源码选项下有 NoneGitSubversion 三个选项。由于我司的代码是在
git 下托管的,所以我配置的也是 git。不相同的同学简单配置下,步骤应该差不多。

《iOS Jenkins CI 集成上传fir、AppStore》

说明:这里遇到一个小坑,在输入代码的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

公钥和私钥生成

《iOS Jenkins CI 集成上传fir、AppStore》 公钥和私钥就生成完毕

至此Jenkins用户下的 git 公钥和私钥就生成完毕,去到/Users/Shared/Jenkins 修改.ssh文件的权限(不会的同学,看下面的图)

《iOS Jenkins CI 集成上传fir、AppStore》 修改目前登陆用户的权限

这时打开.ssh文件就可以看到刚才生成的公钥和私钥

《iOS Jenkins CI 集成上传fir、AppStore》 公钥和私钥

//  修改权限后打开终端运行 
$ sudo more /Users/Shared/Jenkins/.ssh/jenkins.pub

// 将公钥上传到 `git` 服务器
// 同上运行,查看公钥
$ sudo more /Users/Shared/Jenkins/.ssh/jenkins 

// 得到 Jenkins 的 git 私钥如下图:

《iOS Jenkins CI 集成上传fir、AppStore》 Jenkins 的 git 私钥
《iOS Jenkins CI 集成上传fir、AppStore》

  • 添加私钥

    《iOS Jenkins CI 集成上传fir、AppStore》 粘贴进来后点击下方的add即可

《iOS Jenkins CI 集成上传fir、AppStore》

这时刚才的错误已经不见了,恭喜老铁

如果打包的时候只需要打某一个分支的ipa,只需要修改branches to build 选项中的分支名即可。

《iOS Jenkins CI 集成上传fir、AppStore》
《iOS Jenkins CI 集成上传fir、AppStore》
《iOS Jenkins CI 集成上传fir、AppStore》

点击立即构建,这时我们需要等待几分钟。累了的同学可以下去抽支烟

几分钟后我们会看到:

《iOS Jenkins CI 集成上传fir、AppStore》
《iOS Jenkins CI 集成上传fir、AppStore》
《iOS Jenkins CI 集成上传fir、AppStore》

这时代码已经拉取到我们Jenkins目录下,有兴趣的同学可以去看一下

这时我们的Jenkins配置基本上结束了,下面就是进行打包的配置。

针对iOS自动化打包的配置

1.上传钥匙串。选择 系统管理 -> `Keychains and Provisioning Profiles Management

《iOS Jenkins CI 集成上传fir、AppStore》 点击上传login.keychain

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 目录下拷贝一份放过去。不然就会打包失败, 失败的日志如下图:

《iOS Jenkins CI 集成上传fir、AppStore》

打包前xcode中项目配置

achieve项目配置如下图:

《iOS Jenkins CI 集成上传fir、AppStore》
《iOS Jenkins CI 集成上传fir、AppStore》 屏幕快照 2017-07-10 上午9.45.52.png

说明:因为我们要去脚本中指定证书,所以在xcode中我们不做任何证书方面的处理
补充:在 xcode 的菜单栏选中 product -> Scheme -> Manage Schemes 查看对要打包的 scheme 后面的shared 勾有没有打上,不然打包的时候会报 scheme not found 的错误导致打包失败

《iOS Jenkins CI 集成上传fir、AppStore》

export ipa 项目配置:
我们需要在项目中配置一个plist来告诉xcodebuild下面的信息
metmod : 常用的值 developmentapp-storead-hoc
teamID: 就是打包证书名称括号里的那一串字符串拷贝一下就可以了
compileBitcode: Boolean 值, 推荐使用 yes, 这样打出来的包体积计较小
附exportPlist配置图:

《iOS Jenkins CI 集成上传fir、AppStore》

打包脚本

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

补充:上传 ipaappStore 的时候报说 altool file not found ,需要给 altool 建立软链接 打开终端执行

ln -s /Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/itms /usr/local/itms

至此,iOS端的jenkins自动化集成就配置基本结束了,刚开始配的时候也踩了不少坑,也请教了很多大牛。所以小白整理了一下,有不正确的地方欢迎大牛们指正,感谢~~~~

    原文作者:轻拂丶肩上雪
    原文地址: https://www.jianshu.com/p/03428288e657
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞