傻瓜式-iOS自动化分发部署-持续化集成方案【Fastlane+蒲公英+Jenkins】

如需转载请备注地址~ 谢谢 ~

技术资料分享www.jianshu.com/p/e162b6b19…html

关注公众号获取更多

使用初衷

公司产品版本比较多,不少版本都须要独立化部署。致使产生了每一个地址须要打包,每次打包就是一件麻烦的事情,经常一下午的时间过去了却都浪费在打包这件事情上了。So....研究了下Fastlane+Jenkins+蒲公英。能够方便的发布和管理版本。看到爬了不少坑。写出来让你们参考下,遇到问题了能够私信我。尽我所能帮助你。java

基础名词

  • Ruby,一种简单快捷的面向对象(面向对象程序设计)脚本语言
  • RVM是一个命令行工具,它容许您轻松地安装,管理和使用从解释器到多组gems多个ruby环境。
  • Gems RubyGems简称gems,是一个用于对 Ruby组件进行打包的 Ruby 打包系统。例如常常用的cocoapods就须要 gem 来管理。
  • Fastlane是Felix Krause大神写的fastlane是一套使用Ruby写的自动化工具集,用于iOS和Android的自动化打包、发布等工做。
  • pgyer/fir 第三方发布测试平台。

爬坑攻略

若是你在安装期间想很顺利的话,请务必按照步骤去作,本教程只针对Mac。python

此文档是二次更新的,由于第一次写的时候,就根据安装记录写出来了,第二次在别的机器上部署的时候,就出现了各类问题,就感受这是写了个P啊。。。。P P P -_-~!git

因此此次就进行了二次加工,虽然变成了二手的,可是更有内涵哦~~~github

Ruby处理

使用Mac的小伙伴都应该能感觉的OSX的好处,本人对Mac中毒很深,要是让我说一点什么很差的话,就是价格过高。web

各类环境,系统都自带了,ruby,python等等,且不会出现全家桶的问候。shell

回归正体接着说ruby,Mac系统自带ruby,可是是给系统本身使用,权限很小,因此在平时使用过程当中,会出现不少问题,并且版本通常都比较低,因此大多人都在本身使用RVM来管理本身使用的ruby.数据库

参照此文档来安装 RVM使用ruby 使用RVM来管理rubybootstrap

ruby安装完成以后,来进行下一步。api

Fastlane 安装初始化

image

  • 确保你已经安装了最新版本的Xcode命令行工具:
xcode-select --install
复制代码
  • 官方文档支持三种方式安装,我使用的是ruby,刚才不是使用RVM来管理本身的ruby 么,接下来咱们来安装fastlane
方法 os支持 描述
Homebrew 苹果系统 brew cask install fastlane
安装程序脚本 苹果系统 下载zip文件。而后双击install脚本(或在终端窗口中运行)。
RubyGems 带有Ruby版本> 2.0.0 gem install fastlane -NV

若是使用的是系统自带的ruby,可能会报错没有权限。

ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /Library/Ruby/Gems/2.3.0 directory. ERROR: While executing gem ... (Gem::FilePermissionError) You don't have write permissions for the /usr/bin directory.
复制代码

查看本身是否使用的是本身管理的ruby

which ruby
> 返回/Users/seven/.rvm/rubies/ruby-2.4.1/bin/ruby
> 则说明已经使用RVM管理的Ruby了非系统自带的。
> 若是是usr/bin这个目录下的则说明还在使用系统自带的,可能会出现一系列权限的问题,请更换。
复制代码

若是你非要使用系统自带的,也能够,也可能出现问题,也可能没事,跟系统版本也有关系,

下面给出系统自带问题的一些些方法。如跟我同样使用非系统自带ruby,请跳过此步骤。

> 方法一:sudo gem install fastlane -NV //提高权限,部分系统权限仍是不够。
> 方法二:安装到别的目录使用指定目录安装: sudo gem install -n /usr/local/bin fastlane
> 方法三:仍是使用RVM管理ruby
复制代码
  • 初始化

安装完毕后,在终端进入到你的项目目录下。初始化fastlane

fastlane init
复制代码

若是没有报错,就跳过此条继续 报错Exit status of command 'bundle exec pod install' was 1 instead of 0. bundler: failed to load command: pod (/usr/local/bin/pod) 解决方法:在项目根目录下 fastlane/Fastfile 修改文件中的cocoapods ' cocoapods(use_bundle_exec: false)'

按照提示输入开发者帐号(付费帐号) 输入Bundle Identifier 用于初始化配置,后期可在配置文件改。随便输入 根据提供的信息,fastlane会自动为您生成一个配置。

您能够看到新建立的./fastlane目录,包含Appfile和Fastfile文件。

最有趣的文件是fastlane/Fastfile,其中包含分发您的应用程序所需的全部信息。

这样就完成了初始化

蒲公英插件安装

初始化完毕后直接在终端输入

//fastlane fastlane search_plugins//列出可用插件
fastlane add_plugin pgyer//安装插件
复制代码

image.png

插件安装成功
./fastlane目录下会生成Pluginfile的一个文件。
插件安装不成功,就是fastlane安装的有问题。

配置Fastlane


文件名 描述
Appfile 从 Apple Developer Portal 获取和项目相关的信息 详情
Fastfile 核心文件,存放lane任务
Deliverfile deliver的配置文件,从 iTunes Connect 获取和项目相关的信息详细
metadata 同步iTC中的元数据
screenshots 同步iTC中的截图

fastlane工具集是配置fastlane最重要的

文件名 描述
match 证书和配置文件管理工具会重置证书,推荐新项目使用。🌟🌟🌟🌟🌟
cert 自动建立管理iOS代码签名证书,会去自动建立证书,永远不会撤销现有的证书。如不能建立会报错。
sigh 用来建立、更新、下载、修复Provisioning Profile的工具
gym 自动化编译打包工具.shenzhen的代替品.🌟🌟🌟🌟🌟
pem 自动生成、更新推送配置文件
produce 若是你的产品还没在iTunes Connect(iTC)或者Apple Developer Center(ADC)创建,produce能够自动帮你完成这些工做
deliver 自动上传截图,APP的元数据,二进制(ipa)文件到iTunes Connect
snapshot 自动截图(基于Xcode7的UI test)
frameit 能够把截的图片自动套上一层外边框
pilot 管理TestFlight的测试用户,上传二进制文件
boarding 创建一个添加测试用户界面,发给测试者,可自行添加邮件地址,并同步到iTunes Connect(iTC)
scan 自动运行测试工具,而且能够生成漂亮的HTML报告
spaceship 为pilot,boarding和deliver等工具提供和 iTC 和 ADC 的交互API。spaceship原本是个独立的项目,后来被Fastlane收编进来
WatchBuild 是一个独立的iTC监控工具,开启WatchBuild能够监控iTC上的文件状态,弹出MacOS自带的Notification
supply Android自动上传到Google Play工具(若是有时间,我想把国内提供API的Android Store都写个插件自动上传,这个问题从10年我刚开始工做就以为是个痛点)
screengrab Android的自动截图工具

关于fastfile:

  • 里面存放了不少lane,每一个lane至关于按顺序执行的工做流。每一个lane能够存放多个action,action能够看作具体的执行动做
  • 生命周期
执行顺序 方法名 说明
1 before_all 在执行 lane 以前只执行一次
2 before_each 每次执行 lane 以前都会执行一次
3 lane 自定义的任务
4 after_each 每次执行 lane 以后都会执行一次
5 after_all 在执行 lane 成功结束以后执行一次
6 error 在执行上述状况任意环境报错都会停止并执行一次
  • 任务定义
定义 是否必须 说明 备注
desc false 方法描述 可屡次使用打到换行的目的
name true 方法名 符号化的方法名
options false 方法参数 返回 Hash 类型
task true 方法主体 参考 ruby 的方法代码且支持 ruby 代码
  • 一个简单的lane
lane :deploy do
  # 执行 pod instasll
  cocoapods
  # 执行 carthage bootstrap
  carthage
  # 增长build版本号
  increment_build_number
  # 编译代码
  gym
  # 发布到Apple Store
  deliver(force: true)
end
复制代码
  • fastlane示例
  • 这个是我本身 配置到蒲公英的。同时导出ipa到./build文件夹下,以版本号和打包时间命名。这样就保留了每一版本包了。

只须要项目根目录下执行便可

fastlane topgyer desc:更新内容
复制代码
desc "上传到测试版本到蒲公英"
  desc "生成本地版本"
  lane :topgyer do|option|
    
    #自动增长build
    # increment_build_number

    #自动生成证书
    cert

    #自动生成配置文件
    # sigh(force: true)//我使用的是手动配置关闭这个。如需自动则打开便可

    #gym配置,打包输出。

    #fastlane gym --export_method ad-hoc
    #fastlane gym --export_method enterprise
    #fastlane gym --export_method app-store
    scheme_name = "xxxx"//应用名词

    #获取version和build版本号
    version = get_info_plist_value(path: "./#{scheme_name}/Info.plist", key: "CFBundleShortVersionString")
    build = get_info_plist_value(path: "./#{scheme_name}/Info.plist", key: "CFBundleVersion")
    
    #导出路径
    output_directory = "./build"
    
    #导出名称
    output_name = "#{scheme_name}_#{version}_#{build}_#{option[:desc]}_#{Time.now.strftime('%Y%m%d%H%M%S')}.ipa"

    gym(
      export_method: "enterprise",//企业帐号
      scheme: scheme_name, //名词
      clean: true,//是否清理上次编译
      output_directory: output_directory,//导出路径
      output_name: output_name//导出名词
     )

    pgyer(api_key: "1212121", user_key: "121212", update_description: "#{option[:desc]}")//蒲公英设置查看key

  end
复制代码
  • 手动配置证书。 fastlane初始化Gym

    fastlane gym init

    会生成一个Gymfile的文件。增长下面代码,同时不要使用自动生成配置文件这个选项sigh(force: true)

export_options(
	 provisioningProfiles: { 
	"com.xxx.xxx" => "profilesName",#包名 证书配置文件名称
	"com.xxx.xxxxxx" => "profilesName1"
  })
复制代码
  • scheme 设置 没有在gym或者fastfile写应用的名字的话。打包的时候会自动检测当前目录下的文件。列出来供你选择。
    也能够设置一下在gym中直接赋值,或者fastfile中增长便可。
  • 关闭 Enable Bitcode.若是开启会报错。
  • 设置完成便可测试打包上传到蒲公英fastlane topgyer desc:更新内容

Fastlane问题汇总

使用过程当中出现了不少问题,大部分问题都已经有人躺过水了,因此有问题先去看看issues

gym编译报错解决不了请先检查三遍证书是否有问题

初始化报错请检查安装路径是否有问题。

问题 | 解决方案

---|--- ruby -v 版本低于2.0.0 | gem版本不对 请升级ruby请更新gems cocoapods没有放到Gemfile中| Gemfile文件中增长cocoapods fastlane init 提示sudo|请检查ruby路径。若是没问题请检查user目录下.bash_profile。环境变量设置是否有效。export PATH="HOME/.fastlane/bin:PATH" 若是初始化成功|其余的问题大部分都是证书问题了。 The generated archive is invalid, this can have various reasons:Usually it's caused by the Skip Install option in Xcode, set it to NO |xcode中修改build settings Skip Install 选项为NO

Jenkins持续集成


在持续集成(Continuous integration,简称CI)这块,Jenkins无疑是目前使用的比较多的一个开源框架

jekins.png

JDK

系统要求:必须安装JDK 1.5以上版本,推荐安装最新版本的JDK[注意不支持java9]。能够经过如下命令查看是否安装JDK和JDK版本。JDK下载连接 如需卸载请看下文

java -version
复制代码

1.png
JDK

  • java卸载方法 以Mac为例子 [shift +cmd+g] 前往文件夹

1
删除所选版本

  • 在系统偏好设置面板移除Java

Snip20180126_14.png

  • JDK安装

下载完毕JDK后如图按照提示安装便可

Snip20180126_15.png
java

安装 Jenkins

Jenkins的官网 下载最新的 war 包。

推荐使用【Long-term Support (LTS)稳定版】

war 包

下载完成后,打开终端,进入到 war 包所在目录直接运行,也能够将war包丢在Tomcat的webapp目录下面。

终端方式执行如下命令:

java -jar jenkins.war//默认对端口是8080如需指定可更改
java -jar jenkins.war --httpPort=8888 //指定8888端口两者选一便可
复制代码

初始化Jenkins

待Jenkins启动后,在浏览器页面输入如下地址:

http://localhost:8888//端口指定的多少写多少
复制代码
注意不要关闭终端

第一次运行会出现以下界面,提示须要填写指定路径文件里面的内容(该内容也能够在终端上面看到)。

jenkins.png

根据提示目录打开initialAdminPassword文件,复制出密码,填写,Continue.

Jenkins用户/secrets/目录是没有读写权限的。修改权限。

安装推荐的插件
等待进度条完成···
建立管理员用户
next
设置完成

这样Jenkins初始化完毕了,能够快乐的使用了。仍是介绍下如何使用吧。

Jenkins使用

  • 启动方式

上文说了,如何初始化进入Jenkins,那么若是我关了再次怎么进入呢。别急hold~~~ 两种方式均可以

  • 方式一 跟初始化同样,进入war包所在目录经过命令启动,
java -jar jenkins.war
复制代码
  • 方式二 运行命令来建立配置文件
sudo touch /Library/LaunchDaemons/org.jenkins-ci.plist
复制代码

若是您使用了不一样的用户名,请务必在plist中使用它。须要指定用户名,不然会以系统根用户的身份运行,这会让您在使用Jenkins时遇到麻烦

plist内容以下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>Jenkins</string>
    <key>KeepAlive</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
      <string>/usr/bin/java</string>
      <string>-Dmail.smtp.starttls.enable=true</string>
      <string>-jar</string>
      <string>/usr/local/opt/jenkins/libexec/jenkins.war</string>
      <string>--httpListenAddress=127.0.0.1</string>
      <string>--httpPort=8080</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>UserName</key>
    <string>jenkins</string>
  </dict>
</plist>
复制代码

如今能够从新启动或者运行下方命令来查看运行在http://localhost:8888的Jenkins 。

sudo launchctl load -w /Library/LaunchDaemons/org.jenkins-ci.plist
复制代码

Jenkins配置

系统管理

插件管理

使用默认方式安装的基本插件都包含了,若是有须要能够本身来管理插件

image.png

安全配置

在工做中可能要在Jenkins中建立用户,这样你的团队的其余成员就能够访问本身的工做。首先打开左侧菜单中的“管理Jenkins”页面,而后转到“配置全局安全性”。

启用安全性,若是不那么将容许任何登陆用户作任何事情。

  • 进入系统管理 -> Configure Global Security -> 点击”启用安全” 。启用安全下面选择,“Jenkins专有用户数据库”,勾选容许用户能够注册。而后在“受权策略”中选择“任何用户能够作任何事(没有任何限制)”。固然,也可使用LDAP身份认证机制,直接使用外部统一的身份机制来作认证。
  • 返回注册一个帐户,登陆以后再次进入安全管理。勾选“登陆用户能够作任何事”,这样就只有登陆用户才能作操做了。

image.png

建立项目

  • “新建” —> 勾选“构建一个自由风格的软件项目”
    Snip20180801_112.png
  • General
    image.png
  • 源码管理--Git
    image.png
  • 设置源码的仓库,以便让 Jenkins 知道咱们的 iOS 项目的代码在哪里。由于个人代码放在本身的仓库中(若是你用 Github 等其余仓库也是相似),因此要先告诉 Jenkins 如何获取代码。RepositoryUrl就是git地址

首先,咱们须要配置 SSH,咱们能够在 Jenkins 的证书管理中添加 SSH。在 Jenkins 管理页面,选择“Credentials”,而后选择“Global credentials (unrestricted)”,点击“Add Credentials”,以下图所示,咱们填写本身的 SSH 信息,而后点击“Save”,这样就把 SSH 添加到 Jenkins 的全局域中去了。

Snip20180801_118.png

  • 类型SSH
  • userName 就是git中的名字 能知道是谁上传下载的就能够
  • PrivateKey ssh中的私钥,/Users/用户名/.ssh/id_rsa
  • Passphrase git密码。
  • 关于如何获取SSH你们能够看文尾,熟悉的人应该都会,不在此介绍
  • 回到刚刚新建的任务中,在源码管理中,选择 Git,按下图填好相关信息。注意:Credentials 不须要选择。
  • 同时也试了使用帐号密码的Credentials。选择你帐号密码建立的Credentials也能够。默认使用上边方法便可。

image.png

自动测试忽略,不须要设置触发器。

构建环境设置

  • 直接用 fastlane 这个工具,因此这里不须要特别设置。

构建设置

  • 选择使用shell进行构建 更新内容本身维护
cd /users/xxx/xxx   //你项目根目录
fastlane topgyer desc:更新内容!
复制代码

构建后增长步骤

  • 能够邮件通知人员,逗号隔开,通知构建失败

来个总体截图

12.png

开始构建

  • 返回面板会发现本身刚才新建的任务

image.png

  • 点击任务名称进入详情、能够修改任务配置项和构建版本

image.png

  • 点击构建
  • 休息一会
  • 登录蒲公英就会发现多了一个版本。

构建日志查看

  • 构建失败或者想看到输出的,能够在任务详情,构建历史中,选择构建中的版本。

image.png

  • 选择Console Output便可看到控制台输出

image.png

  • 截取下最后输出success送给你

image.png

节点管理能够参考如下,暂时不介绍

blog.csdn.net/birthmarkqi… www.jianshu.com/p/047362b11…

附加 SSH

SSH keys

SSH key 可让你在你的电脑和Code服务器之间创建安全的加密链接。 先执行如下语句来判断是否已经存在本地公钥:

cat ~/.ssh/id_rsa.pub
复制代码

若是你看到一长串以 ssh-rsassh-dsa开头的字符串, 你能够跳过 ssh-keygen的步骤。

提示: 最好的状况是一个密码对应一个ssh key,可是那不是必须的。你彻底能够跳过建立密码这个步骤。请记住设置的密码并不能被修改或获取。

你能够按以下命令来生成ssh key:

ssh-keygen -t rsa -C "你的邮箱@xx.com"
复制代码

这个指令会要求你提供一个位置和文件名去存放键值对和密码,你能够点击Enter键去使用默认值。

用如下命令获取你生成的公钥:

cat ~/.ssh/id_rsa.pub
复制代码

复制这个公钥放到你的我的设置中的SSH/My SSH Keys下,请完整拷贝从ssh-开始直到你的用户名和主机名为止的内容。

若是打算拷贝你的公钥到你的粘贴板下,请参考你的操做系统使用如下的命令:

Windows:

clip < ~/.ssh/id_rsa.pub
复制代码

Mac:

pbcopy < ~/.ssh/id_rsa.pub
复制代码

GNU/Linux (requires xclip):

xclip -sel clip < ~/.ssh/id_rsa.pub
复制代码
相关文章
相关标签/搜索