组件化-自动化实现

作者: 马戏团小丑 | 来源:发表于2017-04-17 11:38 被阅读153次
  • 什么是自动化?

通过简单的一条命令, 去自动执行一组固定操作

  • 自动化使用场景:
    测试
    打包上传审核
    分发
    ...
  • Action机制
    Action是Fastlane自动化流程中的最小执行单元,体现在Fastfile脚本中的一个个命令
    比如:cocoapods, git_add等等,而这些命令背后都对应一个用Ruby编写的脚本。
    目前所有的Action
    fastlane actions
    描述链接
    https://docs.fastlane.tools/actions/Actions/
    源码链接
    https://github.com/fastlane/fastlane/tree/master/fastlane/lib/fastlane/actions
    常用action
    produce 创建可用于 iTunes Connect 和 Apple Developer Portal 的 iOS app。
    cert 自动创建和维护 iOS 代码签名证书。
    sigh 创建、更新、下载和修复 provisioning profiles。
    snapshot 自动将 App 屏幕截图本地化到每种设备上。
    frameit 将屏幕截图适配到适当的设备屏幕大小。
    gym 创建和打包 iOS app。
    deliver 上传屏幕截图、元数据和 App 到 App 商店。
    PEM 自动创建和更新 Push 通知的 profile。
  • 使用概念

lane :航道
Action机制
1.Action是Fastlane自动化流程中的最小执行单元,体现在Fastfile脚本中的一个个命令
2.比如:cocoapods, git_add等等,而这些命令背后都对应一个用Ruby编写的脚本。
3.目前所有的Action:fastlane actions
描述链接:https://docs.fastlane.tools/actions/Actions/
源码链接:https://github.com/fastlane/fastlane/tree/master/fastlane/lib/fastlane/actions
4.常用action
produce 创建可用于 iTunes Connect 和 Apple Developer Portal 的 iOS app。
cert 自动创建和维护 iOS 代码签名证书。
sigh 创建、更新、下载和修复 provisioning profiles。
snapshot 自动将 App 屏幕截图本地化到每种设备上。
frameit 将屏幕截图适配到适当的设备屏幕大小。
gym 创建和打包 iOS app。
deliver 上传屏幕截图、元数据和 App 到 App 商店。
PEM 自动创建和更新 Push 通知的 profile。

  • 安装
    1.sudo gem install fastlane
    2.sudo gem install -n /usr/local/bin fastlane
    要求ruby版本最新
    brew update
    brew install ruby
  • 实现

下图是自动化的实现步骤,那么4的pod install-7步骤都是以后重复要做的,那么这几步可进行自动化,1步骤的到4的修改spec还是跟之前一样的人工操作。



1.进入项目根目录
2.fastlane init
注意: 如果不需要实现上传等操作, 其实我们可以直接在工程目录下, 创建一个文件夹, 在文件夹内部创建"使用文件"
fastlane:创建Fastfile文件


Fastfile:


desc 'ManagerLib 使用这个航道, 可以快速的对自己的私有库, 进行升级维护'
lane :ManagerLib do |options|

tagName = options[:tag]
targetName = options[:target]

# 具体这个巷道上面执行哪些行为

# 1. pod install
cocoapods(
clean: true,
podfile: "./Example/Podfile"
)

# 2. git add .
git_add(path: ".")
#    git commit -m 'xxx'
git_commit(path: ".", message: "版本升级维护")
#    git push origin master
push_to_git_remote

# 验证tag是否存在,如果存在, 应该删除本地标签和远程标签
#if 判断标签是否存在
#    执行删除本地/远程标签
#end

if git_tag_exists(tag: tagName)
    UI.message("发现tag:#{tagName} 已经存在, 即将执行, 删除动作 🚀")
    remove_tag(tag:tagName)
end


# 3. git tag 标签名称
add_git_tag(
tag: tagName
)
#    git push --tags
push_git_tags

# 4. pod spec lint
pod_lib_lint(allow_warnings: true)
#    pod repo push XXXX xxx.podspec
pod_push(path: "#{targetName}.podspec", repo: "XMGFMSpecs", allow_warnings: true)

end

其中remove_tag属于自定义action,因为有些action, 并没有人提供,那么我们可以自己自定来满足我们的需求
1.操作指令fastlane new_action,响应后输入你的action的名字就可以生成新的action
2.remove_tag.rb内容如下:

module Fastlane
  module Actions
    module SharedValues
      REMOVE_TAG_CUSTOM_VALUE = :REMOVE_TAG_CUSTOM_VALUE
    end

    class RemoveTagAction < Action
      def self.run(params)
      
      tagName = params[:tag]
      isRemoveLocalTag = params[:rL]
      isRemoveRemoteTag = params[:rR]
      
      # 1. 先定义一个数组, 用来存储所有需要执行的命令
      
      cmds = []
      
      # 2. 往数组里面, 添加相应的命令
      # 删除本地标签
      # git tag -d 标签名称
      if isRemoveLocalTag
        cmds << "git tag -d #{tagName} "
      end
    
      # 删除远程标签
      # git push origin :标签名称
      if isRemoveRemoteTag
        cmds << " git push origin :#{tagName}"
      end

      #3. 执行数组里面的所有命令
     
      result = Actions.sh(cmds.join('&'));
      return result
      end


      def self.description
        "恩, 牛逼"
      end

      def self.details
        # Optional:
        # this is your chance to provide a more detailed description of this action
        "我们可以使用这个action ,来删除本地或者远程标签"
      end

      def self.available_options
        # Define all options your action supports. 
        
        # Below a few examples
        [

                FastlaneCore::ConfigItem.new(key: :tag,
                                             description: "需要被删除的标签名称",
                                             optional: false,
                                             is_string: true),
                FastlaneCore::ConfigItem.new(key: :rL,
                                             description: "是否需要删除本地标签",
                                             optional: true,
                                             is_string: false,
                                             default_value: true),
                FastlaneCore::ConfigItem.new(key: :rR,
                                             description: "是否需要删除远程标签",
                                             optional: true,
                                             is_string: false,
                                             default_value: true)
        ]
      end

      def self.output

      end

      def self.return_value
        nil
      end

      def self.authors
        # So no one will ever forget your contribution to fastlane :) You are awesome btw!
        ["你的名字"]
      end

      def self.is_supported?(platform)
        # you can do things like
        # 
        #  true
        # 
        #  platform == :ios
        # 
        #  [:ios, :mac].include?(platform)
        # 

        platform == :ios
      end
    end
  end
end

3.执行:fastlane lanes



控制台打印上图说明没有语法问题,但是不代表没有逻辑问题。
4.升级提交版本库:fastlane ManagerLib tag:版本号 target:工程名字

注意事项:
1.在制作私有库的过程中, 如果上一个标签已经存在, 再次创建则会报错
解决方案, 先判断标签是否存在, 如果存在, 则删除标签(本地/远程)
2.如果标签存在, 则删除本地/远程标签
标签存在:git_tag_exists
删除本地&远程标签:remove_tag(tagName: target_version, dR:true, dL:true)

相关文章

网友评论

    本文标题:组件化-自动化实现

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