美文网首页iOS 你不知道的新鲜事iOS CI工具iOS进阶
iOS菜鸟福利!带你一键轻松搞定项目构建、封包、上传

iOS菜鸟福利!带你一键轻松搞定项目构建、封包、上传

作者: 西蒙SIMON | 来源:发表于2017-03-02 18:29 被阅读1308次

    iOS可持续构建集成部署,Jenkins+Fastlane+Git+Fir架设一键构建部署内测分发服务!

    首先我们来看一个iOS开发手动构建打包的故事......

    Paste_Image.png

    就如大家熟悉的,我们平常手动打包都要经历更新代码、更新build version、使用Xcode Archive出IPA包。然后如果是内测包就保存到本地,如果要使用内测分发网站,就要上传到相应的网站并配置好相应的参数;如果是上传TestFlight或者App Store包则直接上传。
    这一套下来,偶尔做做还觉得没什么,如果是遇到频繁修改需求、调整UI、修复BUG,又或者是同时有好几个任务分支需要分别打包的时候,就会十分抓狂了,最后不能自拔,堕落深渊。

    Paste_Image.png

    难道就这样了吗?就只能这样屈服于可恶的现实吗?
    不!
    我们要直面惨淡的人生,敢于挑战种种操蛋的困难!
    在这里,我要向大家传授一套“组合拳”,虽然不像军体拳一样能够克制女子防狼术,但是确实能大大减轻苦逼iOS开发们的工作,提升效率。

    以下是需要用到的招式:

    • Git: 管理代码,这里我使用OSChina的git仓库服务;
    • Jenkins: 提供构建平台,从git仓库拉取代码、更改build version、调用fastlane;
    • Fastlane: 构建代码、打包、上传
    • Fir: 内测分发网站

    都说了是组合拳,所以我这里只会说说这套技术最简单的应用,至于Jenkins和fastlane的各种插件、扩展功能(十分强大),请有兴趣的继续了解。

    1.准备一个project

    1.1创建项目

    这里我随便创建一个项目,随便打上一行字

    Paste_Image.png

    1.2配置项目

    1.2.1配置一下证书

    如果自己有证书那就直接使用Xcode的自动管理即可,但是我没有,于是我上X宝买了一个临时的(囧)。
    要手动配置一下。

    Paste_Image.png

    1.2.2配置build number

    为了稍后实现自动递增build number做准备,这里我使用4段式,最后6位是时间。

    Paste_Image.png

    2. Fastlane的安装使用

    Fastlane github地址

    Fastlane应该说是一个ruby工具集合包,是一个全方位自动化流程工具,从构建、签名、封包、上传、单元测试等等都可以做,十分强大方便。

    这里有两个名词(其实我也不懂ruby,这是我的粗浅理解):
    action: Fastlane的插件,fastlane有自带提供诸多功能的action,也可以自定义。可以理解为封装好的ruby函数。
    lane: Fastlane的任务,开发者编写,可以理解为fastlane命令调用的自定义方法。

    2.1 安装

    直接使用rubyGem命令安装即可

    sudo gem install fastlane
    

    可以随时使用以下命令查看版本

    fastlane --version
    
    Paste_Image.png

    ps:关于fastlane升级
    我发现直接使用sudo gem update fastlane总是失败,一定要先用sudo gem uninstall fastlane删除旧版本,再重新安装,才能装到最新版本。

    2.2初始化Fastlane

    进入到项目目录,使用以下命令初始化

    fastlane init
    
    Paste_Image.png

    按照提示输入相关信息,然后就会自动创建出fastlane的配置文件

    Paste_Image.png

    2.3开始写fastlane脚本代码

    要用到的Action

    • gym: 针对于 iOS 打包和签名的自动化工具
    • get_version_number: 获取项目version number
    • ensure_git_status_clean: 检查git状态
    • git_pull: git拉取代码
    • increment_build_number: 递增build version number
    • commit_version_bump: 创建一个build version number改变的提交注释
    • push_to_git_remote: git推送代码到远程仓库
    2.3.1编辑“Fastfile”文件

    里面已经给你提供了一个基本的流程模板

    Paste_Image.png
    2.3.2使用gym构建打包

    先来看一下fastlane怎么跑,删除多余代码,增加一个打印代码

    # This is the minimum version number required.
    # Update this, if you use features of a newer version
    fastlane_version "2.18.3"
    
    default_platform :ios
    
    platform :ios do
      lane :ci do
        puts "Begin to run ci"
      end
    end
    

    在终端输入以下命令运行lane,格式是“fastlane + platform + lane”

    fastlane ios ci
    
    Paste_Image.png

    好,确定fastlane是可以跑的!
    那我们改一下代码,这里因为我买的证书只有开发真机测试的,没有分发的,所以传一个export_method参数为“development”。还有一个参数output_directory是ipa包保存地址。

    # This is the minimum version number required.
    # Update this, if you use features of a newer version
    fastlane_version "2.18.3"
    
    default_platform :ios
    
    platform :ios do
      lane :ci do
        puts "Begin to run ci"
        gym(
          export_method:"development",
          output_directory:"./fastlane/build",
        ) 
    
      end
    end
    



    跑起来,孩儿们!

    Paste_Image.png Paste_Image.png

    fastlane的log真是超棒棒的!
    ipa包已经打出来了。

    Paste_Image.png
    2.3.3安装fir-cli工具

    fir提供了一套打包、上传的工具,其实它也可以打包,但是我还是喜欢用fastlane,因为真的太强大了。
    fir-cli github地址

    在fir注册后获取你的token。

    Paste_Image.png
    2.3.4完善fastlane脚本

    这个用来区分不同的版本,免得搞混了。
    我先在OSChina旗下的码云创建了一个仓库(你们也可以使用github),创建了2个新分支dev1和dev2,模拟开发中多个功能同时开发的情况。

    Paste_Image.png

    直接上代码

    # This is the minimum version number required.
    # Update this, if you use features of a newer version
    fastlane_version "2.18.3"
    
    default_platform :ios
    
    platform :ios do
      lane :ci do|options|
        branch = options[:branch]
        build_no = get_version_number + '.' + Time.new.strftime("%m%d%H%M")
        
        puts "Begin to run ci"
    
        #确认分支、git状态、拉取最新代码
        sh "git checkout #{branch}"
        ensure_git_branch(branch: branch)
        ensure_git_status_clean
        git_pull
    
        #递增build number
        increment_build_number(build_number: build_no)
    
        #开始打包
        gym(
          export_method:"development",
          output_directory:"./fastlane/build",
        )
    
        #使用fir-cli上传ipa
        sh "fir publish ./build/HVWCIDemo.ipa -T 304795a8933faf8bc1ba8b21521eafa1"
    
      end
    end
    

    跑跑跑,这里我增加了一个参数"branch"用来区分不同的分支。

    fastlane ios ci branch:dev1
    
    Paste_Image.png

    中间省略......

    Paste_Image.png

    我们可以看到,fir上已经成功上传到了一个ipa包!

    Paste_Image.png

    现在你已经可以使用fastlane一句代码构建、打包、上传app了!

    但是如果我连一句代码都不想打,也不想每次都要进入项目目录、打开终端来操作;而且如果其他小伙伴也想用这个方便的工具怎么办?难道每个人都要装一套?
    当然不!我们可以使用Jenkins作为容器,做一个构建服务器。
    请看下文。

    3. Jenkins的安装使用

    来这里Jenkins官网下载,可以直接下个war包,然后跑命令跑起来,安装的话安装默认的插件就好了,之后可以自己配的。

    java -jar jenkins.war
    

    配置完进来就是这样子

    Paste_Image.png

    3.1配置一下git仓库的ssh登录

    如果不使用ssh登录的话,会在jenkins运行的终端出现账号密码输入提示。
    生成一个ssh key,把公钥上传到码云,私钥配置到Jenkins中。

    Paste_Image.png Paste_Image.png

    3.2创建Jenkins任务

    3.2.1新建任务
    Paste_Image.png
    3.2.2配置git
    Paste_Image.png
    3.2.3配置调用Fastlane的命令
    Paste_Image.png
    3.2.3跑起来
    Paste_Image.png

    点击正在构建的任务


    Paste_Image.png

    再点击Console Output可以看到终端输出


    Paste_Image.png

    这里就可以看到Fastlane的log了


    Paste_Image.png

    Done!

    Paste_Image.png

    已经上传了一个新包到fir

    Paste_Image.png

    好了,这样你就可以把这个服务共享给小伙伴们了,只需要轻轻一点,一步到位。


    后记
    Jenkins和Fastlane的功能真的非常强大!
    这里只不过是很简单地组合起来用一下,Jenkins还可以做定时任务、权限管理、配置参数。
    Fastlane拥有许多的Action,除了内测分发,还可以传包到TestFlight和AppStore。
    你可以在Jenkins上配置灵活的参数来指定构建分支、触发命令;Fastlane的fastfile可以引用git仓库的文件的,所以你也可以分离项目和Fastlane配置文件。
    如果你不喜欢fir,也可以用其他的分发平台,可能上传方式有点不同,例如Bugly是提供了Fastlane的自定义Action来做上传,功能会多一点,可以配置名称、描述、密码等。
    ......

    相关文章

      网友评论

      • Pierre_: increment_build_number(build_number: build_no)
        设置这个时候会到这里进行不下去了就

        There does not seem to be a CURRENT_PROJECT_VERSION key set for this project. Add this key to your target's expert build settings.

        您是怎么操作的呢?
        西蒙SIMON:你是不是项目的build version没有填,或者项目地址没有配对
      • Silicn:你写多了,其实写一个脚本就行了,fir脚本已经很好用了,自己写个本地目录的脚本就行了
        西蒙SIMON: 如果你是单人、单项目、单分支开发,是的

      本文标题:iOS菜鸟福利!带你一键轻松搞定项目构建、封包、上传

      本文链接:https://www.haomeiwen.com/subject/srwcgttx.html