自动化-自定义Actions

一、升级必备操作

  • 修改完核心代码后,一共还需要做以下几步:
    • 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://upload-images.jianshu.io/upload_images/1658726-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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,198评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,663评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,985评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,673评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,994评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,399评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,717评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,407评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,112评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,371评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,891评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,255评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,881评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,010评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,764评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,412评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,299评论 2 260

推荐阅读更多精彩内容