manajay

Valar Morghulis Valar Dohaeris

静下心来,用心观察 处处都透着生活的美.


iOS自动化打包分发

为什么要自动化

  • 节省时间,快速迭代: 减少重复繁琐的过程,本地继续编码,使用工具自动拉取远程库代码后打包
  • 纠错: 打包出错,会自动查找到编译错误
  • 快速分发多个版本: 配置好不同分支的打包策略,可以将打包任务移交测试,分工更明确

工具

  • Jenkins CI
  • Flow CI
  • Travis CI
  • Hudson CI
  • Circle CI

本文只关注 Jenkins 的使用

Jenkins 的三种安装方式

  • war
  • pkg
  • homebrew

推荐使用 homebrew

jenkins 安装

1、正确安装Homebrew的方式 2、安装: brew install jenkins 3、终端启动命令: jenkins 4、浏览器访问jenkins地址: http://localhost:8080/ , 如果不能正常访问,要么Java环境出问题,要么jenkins没有启动; Java环境的去官网下载最新的jdk安装;jenkins开关命令 5、 正常的浏览器启动页面是如下的 浏览器启动页面

根据提示修改文件夹权限,获取密钥,登录jenkins 6、安装插件 ,Jenkins功能很多以来相应的插件,简化了接入的难度

最好先跳过这一步,因为电脑环境问题,有些插件是需要翻墙安装,所以导致jenkins安装插件的时候,会卡在一个地方,然后就一直卡着,我安装过多次jenkins,因为这个问题,我习惯于跳过插件安装,先登录配置好环境,然后再手动安装插件!!!!!!!!!

install plugins

如果出现一只卡死在安装插件的界面,关机重启,重新启动Jenkins后,登录http://localhost:8080 进入管理员注册页面 7、 管理员注册 要牢记这个名称,如果是自己测试用,直接用 admin admin 这种更简单的组合. 管理员注册

8、 进入首页,首先将需要安装的插件 再次补充全 补全插件 需要的插件如下

  • Git , Gitlab,SVN , SSH Credentials用于授权后拉取远程库的代码
  • Keychains and Provisioning Profiles Management: 证书与描述文件的管理
  • Xcode integration Xcode打包的插件,所以iOS的打包只能部署在Mac系统
  • Cocoapods 如果项目使用了cocoapod插件 来获取依赖库
  • Mailer Plugin 用来发送通知邮件
  • fir-plugin 用来将ipa包分发到 fir.im上面,或者使用蒲公英(只能是脚本)也可以
  • Post-Build Script Plug-in 脚本插件

9、配置项目的访问ssh私钥

SSH-private-key

根据图上的路径

SSH

添加SSH的私钥, 一般你项目的访问私钥是 ~/.ssh/id_rsa 这个文件,如果没有配置,则询问你的源代码的管理员

id_rsa

如果私钥是错误的,则配置项目的时候会出现下面👇的错误

wrong private key

所以务必要明白,项目的私钥是如何配置的. 需不需要口令码!!! 如果是公司项目,询问运维,当然一般运维会搭建jenkins(iOS必须要在Mac电脑上面搭建,如果是给JAVA使用,一般用linux,不能打包iOS). 自己的项目,不论是在Coding,Github,Gitlab 都可以在页面上查找对应的SSH添加,以明确将要在jenkins使用的ssh私钥是什么

10、配置项目依赖的证书与描述文件

login key

进入后的界面是

upload login-keychains

主要有两个步骤, ①是 上传钥匙串的 login.keychain , mac地址~/Library/Keychains/

login-keychains location

② 设置参数

login-keychains password

注意 证书的名称就是本机钥匙串,安装后的证书简介的 常用名称

common name

描述文件的地址 一般是 ~/Library/MobileDevice/Provisioning Profiles 不过我多次尝试 发现配置项目的时候 并没有得到描述文件,后面只能用脚本自己打包的

11、创建新的项目 new job 选择项目的类型 new job setting

进入项目的配置页面

configuration

all setting items

丢弃旧的构建 ,可以自己定义策略

drop old builds

设置 源码的 拉取, 这一步 主要是可能卡在 私钥的配置上面,所以一定要明确SSH的配置(见上面的说明)

fetch origin code

构建触发器 , 这里主要是 定时去 自动化打包项目

triger

构建环境, 主要配置的是 证书与描述文件

keychain

下面是正确的环境链接在此,我不知道是不是xcode8之后才有的这问题,还是我使用homebrew确实获取不到.

others keychains

Xcode的配置

Xcode

具体配置

Xcode build settings

钥匙串 选择配置好的钥匙串

Xcode code sign

其他的编译打包参数 , 如果使用了cocoapods还需要指定具体的一些参数,并且执行脚本,拉取依赖的远程库

Xcode Project setting

最最重要的来了,打包的脚本

build shell

如果使用了 cocoapods 则需要提供拉取依赖库的代码 否则请忽略这一步(比如我们叮叮暂时没有) 分别是 指定这是一个脚本(截图有问题,应该是#bin/bash -l), podfile文件的 中文格式编码, 切换到podfile的路径下,拉取依赖的pod pod shell

archive build

具体的代码如下

脚本① 样本 xcodebuild -workspace "demo.xcworkspace" -sdk iphoneos -scheme "targetName" -configuration 'Release Adhoc' CODE_SIGN_IDENTITY="keychain中证书代号名称" SYMROOT='$(PWD) 这里 -workspace "demo.xcworkspace"是使用cocoapods的样本, 没有使用就像下面的 -project "project的路径"

if [ -d "${WORKSPACE}/builds" ]; then rm -rf ${WORKSPACE}/builds; fi;
mkdir ${WORKSPACE}/builds;
if [ -d "${WORKSPACE}/builds/${BUILD_NUMBER}" ]; then rm -rf ${WORKSPACE}/builds/${BUILD_NUMBER}; fi;
mkdir ${WORKSPACE}/builds/${BUILD_NUMBER};
xcodebuild -project ${WORKSPACE}/ProjectName/ProjectName.xcodeproj 
-scheme "ProjectName" 
-sdk iphoneos 
archive -archivePath ${WORKSPACE}/builds/${BUILD_NUMBER}/archive 
CODE_SIGN_IDENTITY="iPhone Developer: xxxx"

注意 scheme 一定还要勾选 分享

scheme of project

share scheme

并且注意 不同的打包method 要对应好.

脚本② xcodebuild官方文档

xcodebuild -exportArchive 
-archivePath ${WORKSPACE}/builds/${BUILD_NUMBER}/archive.xcarchive 
-exportOptionsPlist ${WORKSPACE}/ProjectName/ProjectName/ExportOptions_development.plist 
-exportPath ${WORKSPACE}/builds/${BUILD_NUMBER}/${JOB_NAME}_${BUILD_NUMBER}.ipa 
PROVISIONING_PROFILE="iPhone Developer: xxxx"

这里有一个注意点 就是 exportOptionsPlist ,需要自己在项目中配置 相应的信息

exportOptionsPlist

一切顺利就可以正常打包了 后面就是打包后 上传到 fir.im或者是蒲公英 给测试团队 .

fir.im plugin

还有就是 邮件通知

email plugin

12、 正常使用

build by hand

点击进入控制台输出,查看运行的细节

log

团队的使用

1、 设置一个 局域网的固定访问地址

custom jenkins url

公司内其他同事就可以通过这个地址,访问jenkins 自己去配置项目,进行打包 2、 设置jenkins运行电脑的安装工作目录 为 分享目录

![share files(http://upload-images.jianshu.io/upload_images/1435355-25ba6162e97b27a9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

configurate share files

jenkins' workspace

同事可以通过Finder 访问共享的电脑,找到manajay名称的电脑,选择连接,可以设置密码,我直接让同事可以以客人的身份,无密码访问jenkins下的 workspace目录. 这样即使 上传失败,自己可以获取到ipa包,自己分发. 3、 jenkins 设置成,开机自启的程序 brewed-jenkins小插件 brewed-jenkins

补充另一种打包方式 fastlane

如果你的项目使用的是 fastlane那就简单很多了.

  • match 配置证书与描述文件
  • gym 负责打包
  • pgyer 负责分发测试, fastlane有个蒲公英的插件,亲测有bug,所以我还是用的脚本

整个打包上传脚本,注意如果使用了fastlane就不需要配置证书的钥匙串,上面的xbuild脚本了.

#bin/bash -l
pwd
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8

echo "pod 更新项目依赖 ----开始----"
/usr/local/bin/pod update --verbose --no-repo-update
echo "pod 更新项目依赖 ----结束----"

cd fastlane
pwd
echo "fastlane 打包命令-----开始-----"
fastlane development
echo "fastlane 打包命令-----结束-----"

echo "pyger 上传命令-----开始----"
sh ./deploy_pgyer.sh
echo "pyger 上传命令-----结束----"

待完成的

  • 测试蒲公英分发 curl -F "file=@/tmp/example.ipa" -F "uKey=" -F "_api_key=" https://qiniu-storage.pgyer.com/apiv1/app/upload
  • 添加webhooc自动触发构建

参考链接

最近的文章

极光推送的使用

苹果的APNS 用户的应用注册了APNS 消息推送功能 用户iOS设备通过SSL长连接到APNS苹果服务器,收到设备应用的注册信息后,下发给设备一个DeviceToken 给 应用 应用收到这个DeviceToken 然后推送给 自己应用的服务器 (应用到推送服务器的流程完毕) 推送服务器 发送消息到一个用户的时候, 会首先查找到 DeviceToken,然后将消息和DeviceToken 发送给 苹果的 APNS 服务器 苹果根据 DeviceToken 找到唯一的那台设备, ...…

App Push,极光推送继续阅读
更早的文章

ApacheBench的 认知与安装

介绍 Web性能压力测试工具之ApacheBench(ab)详解及概念普及 超实用压力测试工具-ab工具 遇到的问题 ab问题解决方案 ab常见问题汇总1. 使用apache 的ab做压力测试时,当压力过大,例如请求1000000次,在没有执行完 就报apr_poll:The timeout specified has expired错误2. apr_pollset_poll: The timeout specified has expired (70007)...…

Test继续阅读