美文网首页征服iOSiOSiOS日常
iOS自动化打包发布(Jenkins + Fastlane +

iOS自动化打包发布(Jenkins + Fastlane +

作者: BreadAwesome | 来源:发表于2017-07-15 22:30 被阅读5511次

    前言

    在项目测试阶段,频繁的打包发布会耗费团队很多的时间。搭建一个自动化打包发布的平台,可以将我们从那些繁琐的打包发布流程中解放出来。

    本文采用的方案是:Jenkins + Fastlane + GitLab + 蒲公英。

    Fastlane安装

    Fastlane是一套使用Ruby写的自动化工具集,用于iOS和Android的自动化打包、发布等工作,可以节省大量的时间。

    安装过程如下:
    1.检查Ruby版本,需要2.0及以上版本。在终端输入以下命令确认:

    ruby -v
    

    需要注意的是需要将gem的source改为https://gems.ruby-china.org/
    如何检查?在终端输入以下命令:

    gem sources
    

    结果应为:

    *** CURRENT SOURCES ***
    
    https://gems.ruby-china.org/
    

    2.检查Xcode命令行工具是否安装。在终端输入以下命令:

    xcode-select --install
    

    如果没有安装会进行安装。如果已经安装了则会提示:

    xcode-select: error: command line tools are already installed, use "Software Update" to install updates
    

    3.安装Fastlane

    sudo gem install fastlane --verbose
    

    如果出现以下错误:

    ERROR:  While executing gem ... (Errno::EPERM)
        Operation not permitted - /usr/bin/rougify
    

    则输入以下命令:

     sudo gem install -n /usr/local/bin fastlane
    

    4.检查Fastlane是否正确安装。输入以下命令:

    fastlane --version
    

    可以看到Fastlane版本信息,我的是2.46.1。

    蒲公英的Fastlane插件安装

    打开终端,进入你的项目工程的根目录,输入以下命令:

    fastlane add_plugin pgyer
    

    出现

    Plugin 'fastlane-plugin-pgyer' was added to './fastlane/Pluginfile'
    It looks like fastlane plugins are not yet set up for this project.
    fastlane will create a new Gemfile at path 'Gemfile'
    This change is necessary for fastlane plugins to work
    Should fastlane modify the Gemfile at path 'Gemfile' for you?
    (y/n)
    

    输入y按回车,出现

    Installing plugin dependencies...
    Successfully installed plugins
    

    便是安装成功了。

    Fastlane配置

    1.打开终端,进入你的项目工程的根目录,输入以下命令:

    fastlane init
    

    中间会让你输入苹果开发者账号的账号和密码,之后会在你项目工程的目录下生成一个fastlane文件夹,里面有Fastlane的配置文件,一个是Appfile文件,一个是Fastfile文件(如果要上传AppStore的话还有Deliverfile文件)。Appfile保存苹果开发者的相关信息、项目的相关信息等。Fastfile是运行脚本。

    2.编辑Fastfile文件
    有时候一天需要打好几个包,为了区分,我们这里实现一个递增build号的功能。

    (1)修改项目工程配置
    修改Build Settings中的Versioning配置,Current Project Version随便填一个,Versioning System选择Apple Generic。

    修改Info.plist File路径

    (2)定义一个递增build号的函数,添加到Fastfile中

    def updateProjectBuildNumber
    
    currentTime = Time.new.strftime("%Y%m%d")
    build = get_build_number()
    if build.include?"#{currentTime}."
    # => 为当天版本 计算迭代版本号
    lastStr = build[build.length-2..build.length-1]
    lastNum = lastStr.to_i
    lastNum = lastNum + 1
    lastStr = lastNum.to_s
    if lastNum < 10
    lastStr = lastStr.insert(0,"0")
    end
    build = "#{currentTime}.#{lastStr}"
    else
    # => 非当天版本 build 号重置
    build = "#{currentTime}.01"
    end
    puts("*************| 更新build #{build} |*************")
    # => 更改项目 build 号
    increment_build_number(
    build_number: "#{build}"
    )
    end
    

    实现自动打包的完整Fastfile如下:

    # 定义fastlane版本号
    fastlane_version “2.46.1” 
    
    # 定义打包平台
    default_platform :ios
    
    def updateProjectBuildNumber
    
    currentTime = Time.new.strftime("%Y%m%d")
    build = get_build_number()
    if build.include?"#{currentTime}."
    # => 为当天版本 计算迭代版本号
    lastStr = build[build.length-2..build.length-1]
    lastNum = lastStr.to_i
    lastNum = lastNum + 1
    lastStr = lastNum.to_s
    if lastNum < 10
    lastStr = lastStr.insert(0,"0")
    end
    build = "#{currentTime}.#{lastStr}"
    else
    # => 非当天版本 build 号重置
    build = "#{currentTime}.01"
    end
    puts("*************| 更新build #{build} |*************")
    # => 更改项目 build 号
    increment_build_number(
    build_number: "#{build}"
    )
    end
    
    #指定项目的scheme名称
    scheme=“TestCI”
    #蒲公英api_key和user_key
    api_key=“”
    user_key=“”
    
    # 任务脚本
    platform :ios do
    lane :development_build do|options|
    branch = options[:branch]
    
    puts “开始打development ipa”
    
    updateProjectBuildNumber #更改项目build号
    
    # 开始打包
    gym(
    #输出的ipa名称
    output_name:”#{scheme}_#{get_build_number()}”,
    # 是否清空以前的编译信息 true:是
    clean:true,
    # 指定打包方式,Release 或者 Debug
    configuration:"Release",
    # 指定打包所使用的输出方式,目前支持app-store, package, ad-hoc, enterprise, development
    export_method:"development",
    # 指定输出文件夹
    output_directory:"./fastlane/build",
    )
    
    puts "开始上传蒲公英"
    # 开始上传蒲公英
    pgyer(api_key: “#{api_key}”, user_key: “#{user_key}”)
    
    end
    end
    

    注意:蒲公英的 api_key 和 user_key,开发者在自己账号下的 账号设置-API信息 中可以找到。打其它类型的包的方法与development类似,可自定义一个新的lane实现。

    在终端输入

    fastlane development_build
    

    便会进行自动打包并上传蒲公英了。

    Jenkins安装

    Jenkins 是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上。同时 Jenkins 能实施监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象地展示项目构建的趋势和稳定性。

    安装过程如下:
    1.点击 http://mirrors.jenkins.io/war-stable/latest/jenkins.war 下载最新的Jenkins.war

    2.打开终端,进入war包所在目录,执行以下命令:

    java -jar jenkins.war
    

    注意:Jenkins依赖于Java运行环境,因此需要首先安装JDK,下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

    3.执行完成之后打开浏览器输入http://localhost:8080/

    4.弹出Jenkins安装界面,会让你输入安全密码,输入完成之后选择默认安装。

    5.新建管理员账号密码

    对以上过程有疑问的话可以参考手把手教你利用Jenkins持续集成iOS项目

    安装插件

    还是登录http://localhost:8080/ ,选择系统管理 - 管理插件。

    安装GitLab插件
    在可选插件中选择GitLab Plugin和Gitlab Hook Plugin进行安装。

    安装Xcode插件
    在可选插件中选择Xcode integration进行安装。

    安装完成之后,我们就可以配置构建项目了。

    构建任务

    1.点击新建,输入名称,构建一个自由风格的软件项目

    2.配置Git

    添加Git仓库地址,可以是HTTP也可以是SSH。点击Add

    如果是HTTP

    如果是SSH

    注意:UserName是取一个名字,填写的Key是私钥。

    3.配置脚本

    因为我的Git仓库的目录是这样的

    所以在执行fastlane development_build之前需要进入TestCI目录,即fastlane文件夹所在目录。

    4.添加完成之后点击立即构建

    5.执行成功显示如下

    可以点击进入查看控制台输出

    参考链接

    相关文章

      网友评论

      • 文扬_:写得很棒,解决了我的问题~
        BreadAwesome::joy: 能帮到你就好~
      • 洁简:build没有变化怎么回事
      • 热血足球2016:请问大大这个应该如何修改
        /Users/finedo/Desktop/ipa/icon.png: Permission denied
        提示没有权限
      • 锋芒不露大宝剑:You passed invalid parameters to 'gym'.
        method `to_plist' not defined in Array
        这个是为什么呀
        BreadAwesome:https://github.com/fastlane/fastlane/issues/11503
      • CoderMrGuo:请问遇到过这样的错误码
        + fastlane beta
        /var/folders/lt/f4mc8p992p934twdjgqb427m0000gn/T/jenkins2592060317108590347.sh: line 4: fastlane: command not found
        Build step 'Execute shell' marked build as failure
        Finished: FAILURE
        BreadAwesome:@momirror 自动签名就好了
        momirror:请问在Xcode9中应该用自动签名还是每个target手动指定?
        BreadAwesome:单独使用fastlane应该能成功吧。
        如果能,可能是由于 jenkins 没有设置正确的 $PATH 环境变量导致的。正确设置的方法为:
        在命令行下执行 echo $PATH,记录下输出的结果
        在 jenkins 中系统管理-系统设置中,找到 环境变量(Environment variables)
        在 key 中填写 PATH,在 value 中填写第一步中输出的结果
        保存即可。
        参考https://www.pgyer.com/doc/view/jenkins_ios
      • 星好唯柔:您这个打包方案里面包含,cocoapods吗?
      • leoliubj:请问你遇到过这样的错误吗?
        $ /bin/bash /Users/Shared/Jenkins/tmp/jenkins5611140248067175328.sh
        env: ruby_executable_hooks: No such file or directory
        Build step 'Execute shell' marked build as failure
        Finished: FAILURE
        d130f4024fd3:Multiple teams found on the Developer Portal, please enter the number of the team you want to use:
        1) XXXXX
        2) XXXXX

        选择之后没有反应请问有遇到过吗
        leoliubj:@BreadAwesome 谢谢你,我已经解决了,是需要在jenkins的系统设置中配置PATH、GEM_PATH的路径
        BreadAwesome:我没有遇到过,我查了一下,也许你可以试一下:sudo gem install --user-install executable-hooks,参考链接https://stackoverflow.com/questions/26247926/how-to-solve-usr-bin-env-ruby-executable-hooks-no-such-file-or-directory

      本文标题:iOS自动化打包发布(Jenkins + Fastlane +

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