iOS Jenkins CI 集成上传fir、AppStore

iOS Jenkins CI 集成上传fir、AppStore

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

集成步骤

下载dmg

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

选择相应系统下的安装包

安装

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

iOS Jenkins CI 集成上传fir、AppStore_第1张图片
点击继续
iOS Jenkins CI 集成上传fir、AppStore_第2张图片
点击同意
iOS Jenkins CI 集成上传fir、AppStore_第3张图片
点击安装
iOS Jenkins CI 集成上传fir、AppStore_第4张图片
输入用户登录密码并点击安装软件开始安装Jenkins
iOS Jenkins CI 集成上传fir、AppStore_第5张图片
正在安装
iOS Jenkins CI 集成上传fir、AppStore_第6张图片
安装成功
iOS Jenkins CI 集成上传fir、AppStore_第7张图片
这时候会多了一个jenkins用户
iOS Jenkins CI 集成上传fir、AppStore_第8张图片
iOS Jenkins CI 集成上传fir、AppStore_第9张图片

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

iOS Jenkins CI 集成上传fir、AppStore_第10张图片

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

iOS Jenkins CI 集成上传fir、AppStore_第11张图片

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

iOS Jenkins CI 集成上传fir、AppStore_第12张图片

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

iOS Jenkins CI 集成上传fir、AppStore_第13张图片

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

iOS Jenkins CI 集成上传fir、AppStore_第14张图片
开始安装插件
iOS Jenkins CI 集成上传fir、AppStore_第15张图片
创建管理员账户

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

Jenkins 配置

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

iOS Jenkins CI 集成上传fir、AppStore_第16张图片
选择系统管理然后选择插件管理
iOS Jenkins CI 集成上传fir、AppStore_第17张图片
在可选插件中选择Keychains and Provisioning Profiles Management插件点击直接安装

新建任务

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

iOS Jenkins CI 集成上传fir、AppStore_第18张图片

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

iOS Jenkins CI 集成上传fir、AppStore_第19张图片

说明:这里遇到一个小坑,在输入代码的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_第20张图片
公钥和私钥就生成完毕

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

iOS Jenkins CI 集成上传fir、AppStore_第21张图片
修改目前登陆用户的权限

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

iOS Jenkins CI 集成上传fir、AppStore_第22张图片
公钥和私钥
//  修改权限后打开终端运行 
$ sudo more /Users/Shared/Jenkins/.ssh/jenkins.pub

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

// 得到 Jenkins 的 git 私钥如下图:
iOS Jenkins CI 集成上传fir、AppStore_第23张图片
Jenkins 的 git 私钥
iOS Jenkins CI 集成上传fir、AppStore_第24张图片
  • 添加私钥


    iOS Jenkins CI 集成上传fir、AppStore_第25张图片
    粘贴进来后点击下方的add即可
iOS Jenkins CI 集成上传fir、AppStore_第26张图片

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

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

iOS Jenkins CI 集成上传fir、AppStore_第27张图片
iOS Jenkins CI 集成上传fir、AppStore_第28张图片
iOS Jenkins CI 集成上传fir、AppStore_第29张图片

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

几分钟后我们会看到:

iOS Jenkins CI 集成上传fir、AppStore_第30张图片
iOS Jenkins CI 集成上传fir、AppStore_第31张图片
iOS Jenkins CI 集成上传fir、AppStore_第32张图片

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

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


针对iOS自动化打包的配置

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

iOS Jenkins CI 集成上传fir、AppStore_第33张图片
点击上传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_第34张图片

打包前xcode中项目配置

achieve项目配置如下图:

iOS Jenkins CI 集成上传fir、AppStore_第35张图片
iOS Jenkins CI 集成上传fir、AppStore_第36张图片
屏幕快照 2017-07-10 上午9.45.52.png

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

export ipa 项目配置:
我们需要在项目中配置一个plist来告诉xcodebuild下面的信息
metmod : 常用的值 developmentapp-storead-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

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

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

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

你可能感兴趣的:(iOS Jenkins CI 集成上传fir、AppStore)