美文网首页
iOS可持续集成:Jenkins + fastlane + 蒲公

iOS可持续集成:Jenkins + fastlane + 蒲公

作者: 心至靜行至遠 | 来源:发表于2019-03-23 15:36 被阅读0次

    说到持续集成,那么很多人就会问,什么是可持续集成?可持续集成可以为我们开发者做什么?

    持续集成是一种软件开发实践:许多团队频繁地集成他们的工作,每位成员通常进行日常集成,进而每天会有多种集成。每个集成会由自动的构建(包括测试)来尽可能快地检测错误。许多团队发现这种方法可以显著的减少集成问题并且可以使团队开发更加快捷。

    CI是一种开发实践。实践应该包含3个基本模块:

    • 自动构建、自动编译、自动分发、部署和测试;
    • 代码版本仓库(SVN或者Git);
    • 持续集成的服务器;

    通过持续集成,可以让我们通过自动化等手段高频率地去获取产品反馈并响应反馈的过程。接下来是iOS可持续集成的实践。

    安装fastlane

    1. 查看Ruby版本,需要2.0及以上版本

    $ ruby -v
    

    2. 需要将gem的source改为:https://gems.ruby-china.com/

    #查看gem的source
    $ gem sources
    
    *** CURRENT SOURCES ***
    
    https://gems.ruby-china.com/
    

    3. 检查Xcode命令行工具是否安装:

    $ xcode-select --install
    

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

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

    4. 安装fastlane:

    $ sudo gem install fastlane --verbose
    

    如果出现以下错误:

    ERROR:  While executing gem ... (Gem::FilePermissionError) You don't have write permissions for the /Library/Ruby/Gems/2.0.0 directory.
    

    则在终端输入:

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

    检查是否安装正确:

    $ fastlane --version
    

    5. 安装插件

    直接使用gem install貌似有问题,改用bundle安装:

    bundle install --path vendor/bundle
    # 版本号
    bundle exec fastlane add_plugin versioning
    # 蒲公英
    bundle exec fastlane add_plugin pgyer
    

    6. Fastlane配置

    在工程目录下:

    $ fastlane init
    

    中间会让你输入苹果开发者账号的账号和密码,之后会在你项目工程的目录下生成一个fastlane文件夹,里面有Fastlane的配置文件,一个是Appfile文件,一个是Fastfile文件(如果要上传AppStore的话还有Deliverfile文件)。Appfile保存苹果开发者的相关信息、项目的相关信息等。Fastfile是运行脚本。
    2.编辑Fastfile文件
    有时候一天需要打好几个包,为了区分,我们这里实现一个递增build号的功能。
    (1)修改项目工程配置
    修改Build Settings中的Versioning配置,Current Project Version随便填一个,Versioning System选择Apple Generic。

    image

    (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
    

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

    7. 双重认证

    单独跑fastlane是没什么问题,就是提示需要双重认证(two factor)
    因为使用的是Jenkins,只能执行脚本无法输入内容。

    1. 访问AppId管理网站,生成专用密码。

    2. 我们需要用到 spaceship(可以访问Apple Developer Center和iTunes Connect API), 获取session:fastlane spaceauth -u abc@qq.com(APPID)

    配置环境变量:

    $ vim ~/.bash_profile
    # App专用密码
    export FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD=专用密码
    # 
    export FASTLANE_SESSION='YOUR SESSION'
    

    session有过期时间,打包失败的时候记得去打包机更新一下

    8. CodeSign

    在执行fastlane打包脚本的时候会遇到代码签名的问题,不同Xcode版本貌似有区别,现在基本上应该都在9.0以上了,所以就按照9.0以上版本进行配置:

    • 使用match的情况:
      进入工程目录
    $ fastlane match init
    

    会要求你输入用来存放证书和描述文件的git仓库地址:

    fastlane match supports multiple storage modes, please select the one you want to use:
    1. git
    2. google_cloud
    

    这里选择1,

    [14:59:31]: Please create a new, private git repository to store the certificates and profiles there
    [14:59:31]: URL of the Git Repo:
    

    输入git仓库URL地址,,之后会在fastlane文件夹下生成一个MatchFile。
    修改FastFile文件:

    # 添加 match 
     match(type: "development") #type can be: appstore, adhoc, enterprise or development
    
    • 不适用match的情况,需要在gym函数中添加export_options参数,将bundleid和provisioningProfiles映射起来:
    gym(
          clean: true, 
          configuration: "Debug", 
          scheme: "Rain", 
          export_method: "development", 
          output_directory:"./fastlane/build",
          export_options: {
             provisioningProfiles: {
                "com.passion.raining" => "Development_com.passion.raining.mobileprovision"
             }
           }
          )
    

    重置证书:

    # development, distribution and enterprise
    $ fastlane match nuke distribution
    

    持续化集成工具——Jenkins

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

    安装Jenkins

    安装过程如下:
    1.点击 http://mirrors.jenkins.io/war-stable/latest/jenkins.war 下载最新的Jenkins.war,也可以从官网https://jenkins.io/ 上下载最新的pkg安装包进行安装。

    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.点击新建,输入名称,构建一个自由风格的软件项目

    image

    2.配置Git

    image

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

    如果是HTTP

    image

    如果是SSH

    image

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

    3.配置脚本

    image

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

    image

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

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

    image

    5.执行成功显示如下

    image

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

    image

    参考链接

    https://www.jianshu.com/p/0a113f754c09
    https://www.jianshu.com/p/41ecb06ae95f
    https://mp.weixin.qq.com/s/4I9lHEf5TvwwGtVPTjKFUw

    相关文章

      网友评论

          本文标题:iOS可持续集成:Jenkins + fastlane + 蒲公

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