iOS

iOS自动打包神器fastlane部署

多target效率神器, 自动钉钉消息提醒

Posted by lingjye on October 26, 2018

简介

原文: fastlane is the easiest way to automate beta deployments and releases for your iOS and Android apps. 🚀 It handles all tedious tasks, like generating screenshots, dealing with code signing, and releasing your application.

Fastlane 是一套由Ruby写成的自动化工具集, 可以自动部署和发布(iOS/安卓)应用, 可以自动执行繁琐的任务,例如生成屏幕截图, 处理配置文件和发布应用程序

其他开源持续构建平台有:

Jekins 需要搭建环境, 配置过程比较繁琐

fir.im 后来也推出了flow.ci, 支持fastlane 相对比较简单, 需要依赖 Docker 服务

如何使用fastlane for iOS

  1. 安装最新的Xcode命令行工具

    1
    
     $ xcode-select --install
    

    如果提示:

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

    表示已安装, 直接进行第二步

  2. 安装fastlane

    1
    2
    
     # 使用 RubyGems 安装
     $ sudo gem install fastlane -NV
    

    或者

    1
    2
    
     # 使用 Homebrew 安装
     $ brew cask install fastlane
    
  3. 初始化fastlane

    使用终端并cd到项目路径下, 例如:

    1
    
     $ cd fastlaneTest
    

    然后执行初始化命令:

    1
    
     $ fastlane init
    

    然后会出现4个选项:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
     1. 📸  Automate screenshots(自动化截图)
    
    	
     2. 👩‍✈️  Automate beta distribution to TestFlight(将测试版分发自动化到TestFlight)
    
    	
     3. 🚀  Automate App Store distribution(自动发布到App Store)
    
    	
     4. 🛠  Manual setup - manually setup your project to automate your tasks(手动设置 - 手动设置您的项目使得您的任务自动化)
    

    此时, 我们选择第4项, 等待 bundle update 执行结束, 并输入回车, 直至结束

    init

    可以看到项目路径下多了三个文件(夹):

    fastlane(文件夹), 包含文件:Appfile, Fastfile

    Gemfile

    Gemfile.lock

    如果选择 3 的话, 需要先输入苹果开发开发者账号密码, 然后会自动下载App元数据等信息, 我们选择 4 可以后续再相关配置文件中补上, 并且通过修改配置文件达到多target支持

  4. 编辑 fastlane 相关file

    1. 新建 .env 文件

      文件命名格式: .env.targetName(项目中每个target的名字), 该文件默认为系统隐藏文件, 需要将其显示

      作用: 提供后续一些参数配置, 不同 .env 文件可为不同target提供不同参数

      下图 fastlaneTest 和 fastlaneTest2 分别为两个target

      files

      编辑 .env file:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      
       # APP唯一标识符
       APP_IDENTIFIER = "项目 bundleID"
       # 发布版本号 可根据Xcode获取
       # APP_VERSION_RELEASE = "1.0.0"
      		
       # 新版本修改记录
       RELEASE_NOTES = "1) 增加了一些功能\n2) 修复了一些BUG"
      		
       # 蒲公英 更新描述
       # FIR_UPDATE_DESCRIPTION = "1) 增加了一些功能\n2) 修复了一些BUG"
      		
       # 自动提交审核
       SUBMIT_FOR_REVIEW = false
      		
       # 审核通过后立刻发布
       AUTOMATIC_RELEASE = false
      		
       # 苹果开发者账号
       APPLE_ID = "Your Apple ID"
      		
       # 苹果开发者帐号密码
       FASTLANE_PASSWORD = "Your Apple ID Password"
      		
       # 套装ID 可登录 developer.apple.com 查看
       TEAM_ID = "your_team_id"
      		
       # 应用target名称
       SCHEME_NAME = "Target Name"
      		
       # APP元数据及截图存放路径 默认会在fastlane目录下新建metadata文件夹, 不同target的元数据都放在此路径下, 
       METADATA_PATH = "./metadata/fastlaneTest(自定义的路径)"
       SCREENSHOTS_PATH = "./screenshots/fastlaneTest(自定义的路径)"
      		
       # APP元数据及截图下载时,直接覆盖原有数据,不询问
       DELIVER_FORCE_OVERWRITE = true
      

      多个target参考:

      env

    2. 编辑 Appfile

      找到项目路径下的fastlane文件夹, 打开Appfile, 编辑内容:

      1
      2
      3
      
       app_identifier ENV['APP_IDENTIFIER'] 
       apple_id ENV['APPLE_ID']
       team_id ENV['TEAM_ID'] 
      
    3. 编辑 Deliverfile

      在fastlane目录下, 新建文件名为Deliverfile, 该文件与Appfile同级

      编辑内容:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      
       # The Deliverfile allows you to store various App Store Connect metadata
       # For more information, check out the docs
       # https://docs.fastlane.tools/actions/deliver/
       # The bundle identifier of your app
       app_identifier ENV['APP_IDENTIFIER'] 
       # your Apple ID user
       username ENV['APPLE_ID'] 
      		
       # 元数据的路径
       metadata_path ENV['METADATA_PATH']
       screenshots_path ENV['SCREENSHOTS_PATH']
      		
        #App store 中待发布的 App 版本,若每个 target 的版本号不同,可以通过.env 文件来分别定义
        # app_version ENV['APP_VERSION_RELEASE']
      		
        #下载 metadata 及 screenshots 时直接覆盖,不询问
        force true
      		
        #不覆盖 iTunes Connect原有截图
        skip_screenshots true
      		    
        #自动提交审核
        submit_for_review ENV['SUBMIT_FOR_REVIEW']
      		  
        #审核通过后立刻发布
        automatic_release ENV['AUTOMATIC_RELEASE']
      		
        #新版本修改记录
        release_notes({        
           "zh-Hans" => ENV['RELEASE_NOTES']
        })
      		
       #App 加密算法使用情况及广告相关配置
       submission_information({
           #Export Compliance
           export_compliance_available_on_french_store: "false",
           export_compliance_contains_proprietary_cryptography: "false",
           export_compliance_contains_third_party_cryptography: "false",
           export_compliance_is_exempt: "false",
           export_compliance_uses_encryption: "false",
           export_compliance_app_type: nil,
           export_compliance_encryption_updated: "false",
           export_compliance_compliance_required: "false",
           export_compliance_platform: "ios",
      		
           content_rights_contains_third_party_content: "false",
           content_rights_has_rights: "false",
      		
           #Advertising Identifier
           add_id_info_limits_tracking: "false",
           add_id_info_serves_ads: "false",
           add_id_info_tracks_action: "false",
           add_id_info_tracks_install: "false",
           add_id_info_uses_idfa: "false"
       });
      

      结合 .env 文件, 不难理解 Appfile 和 Deliverfile 中的内容

    4. 编辑 Fastfile

      在fastlane目录下, 打开Fastfile, 编辑内容:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      
       default_platform(:ios)
      		
       platform :ios do
      		
         desc "发布app到 App Store 或者 Fir.im "
         lane :your_lane_task_name do
           # add actions here: https://docs.fastlane.tools/actions
           sh "fastlane release(打包类型或者adhoc) --env target_name"
         end
      		  
         desc "发布指定Target到 Fir.im"
         lane adhoc do
         gym(
           clean:true, #打包前clean项目
           workspace: "YourProject.xcworkspace",
           export_method: "ad-hoc", #导出方式
           scheme: ENV['SCHEME_NAME'], #scheme
           output_name: ENV['SCHEME_NAME']+".ipa", # ipa 文件名
           output_directory: "./ipa", #ipa的存放目录
           export_options: {
               provisioningProfiles: {
                   "项目bundleID"=>"描述文件名称", 
               }
           }
         )
         # 前往fir.im获取 api token, 将鼠标放置右上角账号上面, 在下拉窗选择API token
         # 若使用的蒲公英, 请前往 https://www.pgyer.com/ 查看上传方法
         # 如果使用Firimfile, 此处为 firim 即可
         firim(firim_api_token:'你的firim_api_token')
         end
      		  
         desc "发布指定Target到 App Store"
         lane : release do
         gym(
           clean:true, #打包前clean项目
           workspace: "YourProject.xcworkspace",
           export_method: "app-store", #导出方式
           scheme: ENV['SCHEME_NAME'], #scheme
           output_name: ENV['SCHEME_NAME']+".ipa", # ipa 文件名
           output_directory: "./ipa", #ipa的存放目录
         )
         deliver
         end
      			
       end
      	
      

      如图:

      fastfile

      注意: 如果使用CocoaPod, 在gym命令下的workspace必须设置

    使用firim插件, 也可以自定义firim配置文件, 具体操作为新建 Firimfile, 编辑内容:

    1
    2
    3
    4
    
     firim_api_token "你的fir.im API Token"
     # 使用firim(firim_api_token:'你的firim_api_token') 上传后 fir.im 看不到icon, 所以加上这个配置, 具体为你设置的icon本地路径,  其中 ENV['APPICON_PATH'] 在.env文件中 : APPICON_PATH = "./fastlane/metadata/app_icon.jpg"
     icon ENV['APPICON_PATH']
     platform "ios"
    

    还有参数 ipa (导出的ipa路径), platform等, 会根据上下文自动获取, 可以省略

  5. 发布应用

    在终端输入fastlane, 输入对应的发布版本, 等待发布完成即可

    run


使用钉钉机器人进行消息通知

设置钉钉WebHook

登录钉钉, 选择对应群聊, 点击右上方’···’选项, 打开群设置;
找到群机器人, 点开选择添加机器人, 在对应群机器人列表中可能找不到fir.im, 此时选择自定义, 按提示添加, 输入自定义机器人名字(最好能体现功能), 可选择上传自定义头像, 接受消息的讨论组(默认当前群组)

dingtalk

点击完成后会看到webhook页面, 点击复制

dingtalk

前往fir.im”应用管理”, 选择对应的应用, 选择应用图标右侧”集成”选项, 找到”钉钉”

dingtalk

点击”+”号, 输入配置名称, 并将钉钉中的webhook地址粘贴于此处并添加

测试钉钉机器人:

  1. 使用命令行工具curl

    1
    2
    3
    4
    5
    6
    7
    
     curl 'https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxx' \
        -H 'Content-Type: application/json' \
        -d '{"msgtype": "text", 
             "text": {
                  "content": "测试一下"
             }
           }'
    
  2. 直接上传一个ipa到fir.im

注意查看钉钉群聊消息

dingtalk

本文Demo