美文网首页
自动化-自定义Actions

自动化-自定义Actions

作者: coderST | 来源:发表于2018-06-05 18:01 被阅读15次

    一、升级必备操作

    • 修改完核心代码后,一共还需要做以下几步:
      • 1、修改spec文件(修改s.version,s.description等)
      • 2、pod install (使Example与pod下来的库产生关联)
      • 3、提交本地仓库代码至远程仓库
      • 4、打标签,并提交至远程
      • 5、验证spec,并提至私有索引库

    二、Fastlane

    1、简介

    Fastlane文档说明

    • Fastlane是一个ruby脚本集合,它可以按照我们指定的路线,在指定位置执行我们所要执行的操作。这里我们称这样的路线为「航道(lane)」,这样的操作称为「Action」

    • Action是Fastlane自动化流程中的最小执行单元,用来执行Fastlane脚本中的命令,关于更多的描述可以到Actions - fastlane docs查看,里面也介绍了常用的action有哪些,顺带附上action的源码地址,这个源码在后面自定义起参考作用

    2、 安装

    • 确保ruby为最新版本
    brew update
    brew install ruby
    
    • 安装fastlane
      sudo gem install -n /usr/local/bin fastlane

    • 查看当前fastlane版本
      fastlane --version

    • 查看所有action
      fastlane actions

    三、fastlane初始化

    cd到你的本地组件仓库的根目录

    • 初始化fastlane
      fastlane init

    不过这个步骤对我们来说可以跳过,在init后提示你输入一些东西,包括上传需要用到的APPLE ID什么的一堆东西,由于我们并不涉及这些,所以我们使用更方便的方式

    # 创建一个fastlane文件夹
    # 进入fastlane目录
    # 创建一个Fastfile文件
    mkdir fastlane
    cd fastlane
    touch Fastfile
    
    屏幕快照 2018-06-05 16.41.52.png

    1、修改Fastfile

    desc 'EmojiToolModelTool 航道用来自动化升级维护私有库'
    lane :EmojiToolModelTool do |options|
    
    tagNum = options[:tag]
    podspecName = options[:specName]
    
    # 航道上需要执行的操作
    # 具体action到 https://docs.fastlane.tools/actions 上面查找
    # 这里的路径以仓库根目录为准
    
    # 1、修改spec文件(修改s.version,s.description等)
    # 2、pod install (使Example与pod下来的库产生关联)
    cocoapods(
      clean: true,
      podfile: "./Example/Podfile"
    )
    
    
    # 3、提交本地仓库代码至远程仓库
    git_add(path: ".")
    git_commit(path: ".", message: "upgrade repo")
    push_to_git_remote
    
    
    # 4、打标签,并提交至远程
    add_git_tag(
      tag: tagNum
    )
    push_git_tags
    
    
    # 5、验证spec,并提至私有索引库
    pod_lib_lint(allow_warnings: true)
    # 因为本地索引库repo的名字是基本上不会去改变的,所以这里直接写死 XDSpecs
    # podspec的名字需要由外界传入
    pod_push(path: "#{podspecName}.podspec", repo: "XDSpecs", allow_warnings: true)
    ![屏幕快照 2018-06-05 17.06.06.png](https://img.haomeiwen.com/i1658726/cdc3496cf8e8c406.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    end
    

    2 、验证Fastfile
    fastlane lanes

    屏幕快照 2018-06-05 16.53.28.png

    3、执行fastlane
    需要在组件仓库的根目录下执行,进入到fastlane的同级目录下
    cd EmojiToolModel

    屏幕快照 2018-06-05 16.55.55.png
    • 3.1 然后执行
    #EmojiToolModelTool : 是你自定义的航道名称(在上面修改Fastfile里定义的名称)
    #tag : 是你要打的tag(tag要与spec文件的tag一致,注意这里不能存在已经存在的tag,如果存在会报错,后面会说)
    #EmojiToolModel : 是你定义的spec文件名称
    
    fastlane EmojiToolModelTool tag:0.1.1 specName:EmojiToolModel
    
    屏幕快照 2018-06-05 17.06.06.png

    四、自定义Action

    • 以上的过程已经可以完成一整个自动化更新了,但是有一点需要注意的是,这个输入的tag可能会面临一个问题,那就是本地和远程都可能已经存在,即发生冲突,这个时候我们可以选择自动删除本地和远程冲突的那个tag,再重新上传当前tag

    1、创建一个新的action

    fastlane new_action

    屏幕快照 2018-06-05 17.09.42.png
    • 完成后fastlane目录下就会多出一个名为actions的文件夹,里面存放的就是你自定义action


      屏幕快照 2018-06-05 17.11.02.png

    2、编辑自定义action

    打开remove_git_tag.rb,开始自定义我们的action吧,什么?不会语法怎么办?可以参考别人的嘛,上面给出的action的源码地址就有用武之地了,比如pod_push。这里我直接贴出我已经完成的主要代码

    module Fastlane
      module Actions
        module SharedValues
          REMOVE_TAG_CUSTOM_VALUE = :REMOVE_TAG_CUSTOM_VALUE
        end
    
        class RemoveTagAction < Action
          def self.run(params)
            # 这里写要执行的操作 
            # params[:参数名称] 参数名称与下面self.available_options中的保持一致
    
            tagName = params[:tag]
            isRemoveLocalTag = params[:rL]
            isRemoveRemoteTag = params[:rR]
    
            # 定义数组 添加需要执行的命令
            cmds = []
    
            # 删除本地标签
            if isRemoveLocalTag
              cmds << "git tag -d #{tagName} "
            end
    
            # 删除本地标签
            if isRemoveRemoteTag
              cmds << " git push origin :#{tagName}"
    
            end
    
            # 执行数组里的命令
            result = Actions.sh(cmds.join('&'))
            UI.success("Successfully remove tag #{tagName}")
            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,来删除本地和远程冲突的tag"
          end
    
          def self.available_options
            # Define all options your action supports. 
            
            # Below a few examples
            [ 
              # tagName : 标签名称  description : 描述   optional : 是否可选  is_string : 是否是字符串
              FastlaneCore::ConfigItem.new(key: :tag,
                                           description: "删除的标签名称",
                                           optional: false,
                                           is_string: true),
    
              # rL(remove Local) : 标签名称  description : 描述   optional : 是否可选  is_string : 是否是字符串
              FastlaneCore::ConfigItem.new(key: :rL,
                                           description: "是否删除本地标签",
                                           optional: true,
                                           is_string: false,
                                           default_value: true),
    
              # rR(remove Remote) : 标签名称  description : 描述   optional : 是否可选  is_string : 是否是字符串
              FastlaneCore::ConfigItem.new(key: :rR,
                                           description: "是否删除远程标签",
                                           optional: true,
                                           is_string: false,
                                           default_value: true)
            ]
          end
    
          def self.output
            # Define the shared values you are going to provide
            # Example
            [
              ['REMOVE_TAG_CUSTOM_VALUE', 'A description of what this value contains']
            ]
          end
    
          def self.return_value
            nil
            # If your method provides a return value, you can describe here what it does
          end
    
          def self.authors
            # So no one will ever forget your contribution to fastlane :) You are awesome btw!
            ["CodeST"]
          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、查看action描述

    • 验证我们写的这个action是否有错
      fastlane action remove_tag
      屏幕快照 2018-06-05 17.23.04.png
    1. 验证成功后可以完善自己的fastlane
    • 新增3.1
    desc 'EmojiToolModelTool 航道用来自动化升级维护私有库'
    lane :EmojiToolModelTool do |options|
    
    tagName = options[:tag]
    podspecName = options[:specName]
    
    # 航道上需要执行的操作
    # 具体action到 https://docs.fastlane.tools/actions 上面查找
    # 这里的路径以仓库根目录为准
    
    # 1、修改spec文件(修改s.version,s.description等)
    # 2、pod install (使Example与pod下来的库产生关联)
    cocoapods(
      clean: true,
      podfile: "./Example/Podfile"
    )
    
    
    # 3、提交本地仓库代码至远程仓库
    git_add(path: ".")
    git_commit(path: ".", message: "upgrade repo")
    push_to_git_remote
    
    # 3.1 验证tag是否存在,如果存在,应该深处本地标签和远程标签
    if git_tag_exists(tag: tagName)
        UI.success("发现tag:#{tagName} 已经存在,即将执行,删除操作🚀")
        remove_tag(tag:tagName)
    end
    
    
    # 4、打标签,并提交至远程
    add_git_tag(
      tag: tagName
    )
    push_git_tags
    
    
    # 5、验证spec,并提至私有索引库
    pod_lib_lint(allow_warnings: true)
    # 因为本地索引库repo的名字是基本上不会去改变的,所以这里直接写死 XDSpecs
    # podspec的名字需要由外界传入
    pod_push(path: "#{podspecName}.podspec", repo: "XDSpecs", allow_warnings: true)
    end
    

    5 . 最后验证

    • 查看已经存在的tag
      git tag

    • 用工具删除已经存在的tag
      fastlane EmojiToolModelTool tag:0.1.3 specName:EmojiToolModel

      屏幕快照 2018-06-05 18.00.52.png

    相关文章

      网友评论

          本文标题:自动化-自定义Actions

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