fastlane 实现自定义Action

有的时候官方提供的所有的Action并不能满足我们的需求,这个时候就需要我们自己自定义Action用来调用了,我感觉这也是fastlane一个很好的扩展功能。
比如我们现在有这么一个场景,在使用fastlane更新远程的私有库或者共有库的时候,我们在给项目打tag的时候,先判断一下当前的项目是不是已经存在了相同名称的tag,如果有的话,删除掉,再进行下一步操作,如果没有的话,不执行我们的action。
如果对fastlane的action概念不是很熟悉的话,建议先看一下fastlane更新远程的私有库,里面有对Action操作和运用的相关示例。

创建自定义的Action步骤如下:
1、先创建一个ruby文件
1.1、首先进入到fastlane的目录下面

image.png

1.2、运行命令创建ruby文件

fastlane new_action
image.png

注意事项,自定义的action名字的命名规范如下:

Must be lower case, and use a '_' between words. Do not use '.'
examples: 'testflight', 'upload_to_s3'

2、认识下创建出来的文件的组成部分

image.png

image.png

3、修改创建出来的ruby文件,形成我们的自定义的Action脚本
3.1、说一下我们当前设计的Action的需求是,给出三个参数,
tag: tag号,字符串,不可省略
isRL: 是否要删除本地仓库的tag,Bool类型,可以省略,默认的参数是false
isRR: 是否要删除远程仓库的tag,Bool类型,可以省略,默认的参数是false

module Fastlane
    module Actions
        module SharedValues
            REMOVE_TAG_CUSTOM_VALUE = :REMOVE_TAG_CUSTOM_VALUE
        end
        
        class RemoveTagAction < Action
            def self.run(params)
            # 最终要执行的东西,在这里执行
            
            # 1、获取所有输入的参数
            # tag 的名称 如 0.1.0
            tageName = params[:tag]
            # 是否需要删除本地标签
            isRemoveLocationTag = params[:isRL]
            # 是否需要删除远程标签
            isRemoveRemoteTag = params[:isRR]
            
            # 2、定义一个数组,准备往数组里面添加相应的命令
            cmds = []
            
            # 删除本地的标签
            # git tag -d 标签名称
            if isRemoveLocationTag
                cmds << "git tag -d #{tageName}"
            end
            
            # 删除远程标签
            # git push origin :标签名称
            if isRemoveRemoteTag
                cmds << "git push origin :#{tageName}"
            end
    
            # 3、执行数组里面的所有的命令
            result = Actions.sh(cmds.join('&'))
            UI.message("执行完毕 remove_tag的操作 🚀")
            return result
    
            
        end
        
        #####################################################
        # @!group Documentation
        #####################################################
        
        def self.description
        "输入标签,删除标签"
    end
    
    def self.details
    # Optional:
    # this is your chance to provide a more detailed description of this action
"我们可以使用这个标签来删除git远程的标签\n 使用方式是:\n remove_tag(tag:tagName,isRL:true,isRR:true) \n或者 \nremove_tag(tag:tagName)"
end

# 接收相关的参数
def self.available_options

# Define all options your action supports.

# Below a few examples
[

# 传入tag值的参数描述,不可以忽略<必须输入>,字符串类型,没有默认值
FastlaneCore::ConfigItem.new(key: :tag,
                             description: "tag 号是多少",
                             optional:false,# 是不是可以省略
                             is_string: true, # true: 是不是字符串
                             ),
# 是否删除本地标签
FastlaneCore::ConfigItem.new(key: :isRL,
                             description: "是否删除本地标签",
                             optional:true,# 是不是可以省略
                             is_string: false, # true: 是不是字符串
                             default_value: true), # 默认值是啥

# 是否删除远程标签
FastlaneCore::ConfigItem.new(key: :isRR,
                             description: "是否删除远程标签",
                             optional:true,# 是不是可以省略
                             is_string: false, # true: 是不是字符串
                             default_value: true) # 默认值是啥

]
end

def self.output
# Define the shared values you are going to provide
# Example

end

def self.return_value
# If your method provides a return value, you can describe here what it does
nil
end

def self.authors
# So no one will ever forget your contribution to fastlane :) You are awesome btw!
["zhangyan"]
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.2、写完之后验证一下书写的格式是否正确
终端命令在fastlane的上级目录下执行

fastlane action remove_tag
image.png

4、调用使用
在我们的fastfile中写的lane中进行相关的调用,下面展示的是更新远程私有库的lane

调用代码

# 验证当前tag是否存在,如果说存在的话,干掉,进行下一步,创建一个tag,如果说不存在的话,直接创建tag
if git_tag_exists(tag: tagName)
  UI.message("发现 tag:#{tagName} 存在,即将执行删除动作 🚀")
  # 下面的两种写法都可以
  remove_tag(tag:tagName,isRL:true,isRR:true)
  #remove_tag(tag:tagName)
end

lane的整体代码

#################################################################

desc "通过 upgradePrivateSpec 可以快速的对远程私有库完成升级工作"
lane :upgradePrivateSpec do |options|
#外界输入的tag值
tagName = options[:tag]

specName = options[:specName]

podspecPath = "#{specName}.podspec"

#具体在这个文件上执行哪些行为

# 1、git pull
git_pull

# 2、pod install

cocoapods(
clean: true,
podfile: "./Example/Podfile"
)

# 3、git add .

git_add(path: ".")

#  git commit -m 'message'

git_commit(path: ".", message: "Version Bump")

#  git push origin master

push_to_git_remote

# 验证当前tag是否存在,如果说存在的话,干掉,进行下一步,创建一个tag,如果说不存在的话,直接创建tag
if git_tag_exists(tag: tagName)
  UI.message("发现 tag:#{tagName} 存在,即将执行删除动作 🚀")
  # 下面的两种写法都可以
  remove_tag(tag:tagName,isRL:true,isRR:true)
  #remove_tag(tag:tagName)
end


# 4、git tag ...

add_git_tag(
tag: tagName
)

#    git push --tags

push_git_tags


# 5、pod spec lint 检测当前spec的格式

pod_lib_lint(allow_warnings: true)

#    pod repo push XXX  xxxx.podspec

pod_push(path: podspecPath, repo: "PrivateSpecsGather", allow_warnings:true)

end

5、测试一下
5.1、为了测试,可以先把远程私有库添加上一个tag,然后再去运行我们的lane。看一下能不能把我们的本地的和远程的tag都给干掉。
运行lane

fastlane upgradePrivateSpec tag:0.1.8 specName:DownLoader repo:PrivateSpecsGather

注意:当前我们的代码tag已经存在0.1.8了。

image.png
image.png

大功告成。

其他的自定义的Action也可以这么进行创建。

如有失误请各位路过大神即时指点,或有更好的做法,也请指点一二。在下不甚感激。

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

推荐阅读更多精彩内容

  • 目前比较流行的组件化开发,针对多个 app 要用同一套代码,将其做成 pod 仓库是比较好的解决方案。代码只有一份...
    ripperhe阅读 5,382评论 8 39
  • Fastlane简介 Fastlane是用Ruby语言编写的一套自动化工具集和框架,每一个工具实际都对应一个Rub...
    小_夭阅读 7,727评论 2 15
  • 作为架构师的我们常常要面临的一个难题就是技术选型。现在无论是商业项目也好,开源项目也好,可供选择的方案实在是太多,...
    老邢Thierry阅读 4,824评论 17 52
  • 更新节点:2019-05-15由于fastlane更新频繁,已更新到 2.105.2 2.122.0更新内容:fa...
    就叫yang阅读 61,734评论 73 146
  • 当我们的远程私有库集成完毕之后,后期可能需要不断的维护更新升级。如果你对远程私有库不是很了解,建议先了解一下: 教...
    踩坑小分队阅读 2,643评论 1 5