iOS Jenkins CI 集成上传fir、AppStore

iOS Jenkins CI 集成上传fir、AppStore

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

集成步骤

下载dmg

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

选择相应系统下的安装包

安装

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

点击继续
点击同意
点击安装
输入用户登录密码并点击安装软件开始安装Jenkins
正在安装
安装成功
这时候会多了一个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 插件。

选择系统管理然后选择插件管理
在可选插件中选择Keychains and Provisioning Profiles Management插件点击直接安装

新建任务

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

在源码选项下有 NoneGitSubversion 三个选项。由于我司的代码是在
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 私钥如下图:
Jenkins 的 git 私钥
  • 添加私钥


    粘贴进来后点击下方的add即可

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

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

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

几分钟后我们会看到:

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

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


针对iOS自动化打包的配置

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

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


打包前xcode中项目配置

achieve项目配置如下图:

屏幕快照 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自动化集成就配置基本结束了,刚开始配的时候也踩了不少坑,也请教了很多大牛。所以小白整理了一下,有不正确的地方欢迎大牛们指正,感谢~~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容